计算机网络之TCP四次握手
1.TCP四次挥手过程2.任何一方执行close()操作即可产生挥手操作为什么要等待呢
计算机网络之TCP四次握手 1.TCP四次挥手过程定义:建立一个连接需要三次握手,而终止一个连接要经过四次挥手;这由TCP的半关闭(half-close)造成的。所谓的半关闭,其实就是TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力
2.任何一方执行close()操作即可产生挥手操作为什么要等待呢刚开始双方都处于ESTABLISHED 状态,假如是客户端先发起关闭请求。四次挥手的过程如下
1.第一次挥手:
当客户A 没有东西要发送时就要释放 A 这边的连接,A会发送一个报文(没有数据)
Client发送一个FIN报文,用来关闭Client到Server的数据传送,报文中会指定一个序列号,即发出连接释放报文段(FIN=1,序号seq=u);
Client进入FIN_WAIT_1(终止等待1)状态
2.第二次挥手:
即服务端收到连接释放报文段后即发出确认报文段(ACK=1,确认号ack=u+1,序号seq=v);
Server进入CLOSE_WAIT(关闭等待)状态;
此时TCP链接处于半关闭状态,客户端到服务端的连接释放,即客户端已经没有要发送的数据了,但服务端若发送数据,则客户端仍要接收;
客户端收到服务端的确认后,进入FIN_WAIT2(终止等待2)状态,等待服务端发出的连接释放报文段
3.第三次挥手:
Server发送一个FIN,且指定一个序列号,用来关闭Server到Client的数据传送(和客户端的第一次挥手一样);
Server进入LAST_ACK状态。
4.第四次挥手:
Client进入TIME_WAIT状态, 等待 2MSL 时间;
Server进入CLOSED状态
附:在socket编程中,任何一方执行close()操作即可产生挥手操作
为什么要等待呢?
为了防止这种情况:A接到B的释放连接请求后会发送一个确认信息,但是如果这个确认信息丢了,也就是B没有收到确认释放连接,那么B就会重发一个释放连接请求,这时候A还处于TIME_WAIT状态,所以会再次发送一个确认信息。
为什么TIME_WAIT 状态还需要等2*MSL秒之后才能返回到CLOSED 状态呢?
因为虽然双方都同意关闭连接了,而且握手的4个报文也都发送完毕,按理可以直接回到CLOSED 状态(就好比从SYN_SENT 状态到ESTABLISH 状态那样),但是我们必须假想网络是不可靠的,你无法保证你最后发送的ACK报文一定会被对方收到,就是说对方处于LAST_ACK 状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT 状态的作用就是用来重发可能丢失的ACK报文。



