下面是个人对三次握手和四次挥手的理解。
1、三次握手
第一次握手:客户端向服务器发起连接请求(此时要确认客户端能不能发)。
第二次握手:服务器收到客户端的连接请求后,会给一个应答,以及请求连接的数据包(意味着服务器收到了客户端连接的请求,以此证明服务器能够接收,而且也证明了客户端能发。同时,服务器也给客户端发起了连接请求,服务器要确认自己能不能发)。
第三次握手:最后客户端给服务器一个应答,证明服务器是可以发的,客户端也可以收,即连接成功。
2、四次挥手
第一次挥手:客户端向服务器发起断开的请求(意味着客户端再不发送数据了,并不代表完全断开连接)。
第二次挥手:服务器收到后,会先给客户端一个应答(服务器可能还要发送数据,就不能立即关闭服务器到客户端的数据通道,只能先确认服务器收到了客户端发送要断开的请求,等服务器再无发送的数据之后再确认是否要断开连接)。
第三次挥手:服务器发起断开连接的数据包(意味着客户端知道了服务器已经发完数据)。
第四次挥手:客户端给服务器一个应答,证明服务器收到了断开连接的数据包,即断开连接。
3、为什么是三次握手,而不是两次?
答:两次不安全,TCP通信要确保双方都具有收发的能力。
4、为什么是四次挥手,而不是三次?
答:对于四次挥手,由于TCP是全双工通信,主动关闭方发送断开请求不代表完全断开连接,只能表示主动关闭方不在发送数据了。而接收方可能还要发送数据,就不能立即关闭服务器端到客户端的数据通道,只能先确认服务器端接收到了客户端发送要断开的信息,等服务器再无发送的数据之后再确认是否要断开连接,所以四次挥手时需要四次数据包的交互。
5、为什么四次挥手要等待2MSL
(MSL指的是报文在网络编程中最大生存时间)
?
答:在客户端发送对服务器端的断开请求的确认包后,这个确认包可能到达不了,服务器如果接受不到这个确认包就会重新发送断开请求,所以客户端发送确认包后需要留出2MSL时间。