一个T C P连接由一个4元组唯一确定:本地I P地址、本地端口号、远端I P地址和远端端口
号。无论何时关闭一个连接,一端必须保持这个连接,我们看到T I M E WA I T状态将处理这个
问题。处理的原则是执行主动打开的一端在进入这个状态时要保持的时间为T C P实现中规定
的M S L值的两倍。
【tcp/ip 详解 18.12 小结】
之所以要维护TIME_WAIT状态,并且要等待2MSL (max segment lifetime)。原因如下:
1.在关闭一个TCP连接后,又重新建立起一个相同的IP地址和端口之间的TCP连接,有可能出现这种情况,新连接收到本属于旧连接的分组,为了避免这个情 况,tcp规则不允许在TIME_WAIT状态使用相同ip和端口新建一个连接。 因为TIME_WAIT状态持续2MSL,就可以保证当成功建立一个TCP连接的时 候,来自旧连接的重复分组已经在网络中消逝。
2.因为网络是不可靠的,无法保证你最后发送的ACK报文会一定被对方收到,因此对方处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文。如果没有TIME_WAIT状态,则收到FIN报文后,会返回一个RST报文,接收到RST后,会产生 连接被重置的错误。而在TIME_WAIT状态下,则可以正确的返回对FIN的ACK.从而正确的关闭连接。
【Q】
如果在关闭期间网络断开,则TIME_WAIT状态终会因超时而进入CLOSED状态,而被动关闭端,可能会一直处于LAST_ACK状态。