TCP四次挥手中的TIME_WAIT状态

Posted by Kanon on December 15, 2017

温习下四次挥手

四次挥手

TIME_WAIT状态

在客户端主动断开连接的情况下,客户端在收到服务端的FIN报文段并发送ACK后,并非直接进入CLOSED状态,而是进入了TIME_WAIT状态。

这是为了防止ACK报文段丢失,TCP关闭不正常而设置的。数据包在网络中是有生存时间的,超过这个时间还未到达目标主机就会被丢弃,并通知源主机。这称为报文段最大生存时间(MSL,Maximum Segment Lifetime)。TIME_WAIT 要等待 2MSL 才会进入 CLOSED 状态。ACK报文段到达服务器需要 MSL 时间,服务器重传 FIN 报文段也需要MSL时间,2MSL 是数据包往返的最大时间,如果 2MSL 后还未收到服务器重传的 FIN 报文段,就说明服务器已经收到了 ACK 。

但事实上,有了TIME_WAIT状态也不能保证四次连接正常关闭。假设这一种情况,ACK报文段丢失,服务器重传FIN报文段,这时候FIN报文段也丢失,客户端在等待了2MSL后没有收到任何消息以为一切正常,直接进入了CLOSED状态

如果没有TIME_WAIT状态

客户端发送的ACK在网路上丢失,这样服务器端就收不到最后的ACK,重传定时器超时,将重传FIN到客户端,由于客户端关于该连接的所有资源都释放,收到重传的FIN后,它没有关于这个FIN的任何信息,所以向服务器端发送一个RST报文段,服务器收到RST后,认为连接出现了异常(而非正常关闭)。

结论

在TIME_WAIT下等待2MSL,只是为了尽最大努力保证四次挥手正常关闭。