客户端在接受到服务器的结束报文(FIN)后,不会直接进入CLOSE状态,而是转移到TIME_WAIT状态。这个状态客户端连接要等待一段长为2MSL时间,才能完全关闭。MSL是TCP报文段在网络中的最大生存时间,RFC文档建议2min。
TIME_WAIT状态存在的原因有2点:
1)可靠地终止TCP连接。
2)保证让迟来的TCP报文段有足够的时间被识别并丢弃。
第一点很好理解,2端关闭过程都有发起(FIN)和收到应答(ACK)。
对于第二点,反过来思考,如果不存在TIME_WAIT状态,应用程序能够立即建立一个和刚关闭的连接相似的连接(四元组相同),新连接可以称为原连接的化身。化身连接有可能收到属于原连接的迟到报文。显然,这些数据属于脏数据,不应该收到。
坚持2MSL时间TIME_WAIT状态能够确保网络上两个传输方向上尚未被接收到的、延迟的TCP报文完都消失(被路由器丢失)。