tcp四次握手断开连接为什么需要TIME_WAIT状态?
主动关闭的那端会进入这种状态,停留在TIME_WAIT的时间是最长分节生命期MSL(maximum segment lifetime)的两倍,成为2MSL。
存在TIME_WAIT状态有两个理由:
1.实现终止tcp全双工连接的可靠性
如下图所示,当最终的ACK丢失,服务器将重发FIN,因此客户端需要维护状态信息以允许它重发最终的ACK。所以需要TIME_WAIT存在以重发丢失的ack,而不是直接关闭。
2. 允许老的重复分组在网络中消逝
重复分组除了超时重传的分组外,还有一种成为迷途的重复分组:假如某个路由跟之后的路由间链路突然断开,路由协议需要一段时间才能够稳定并找到另一条通路,在这段时间可能产生路由循环(路由器A把tcp分组发送给路由器B,路由器B再把分组重新发给A,因为没有别的通路),迷途分组最多存在MSL时间,如果在这个时间内路由循环修复,那么这个迷途分组也会最终到达目的地。
考虑这种情况,如果一个ip地址的某端口和另外一个ip地址的某端口建立了一个tcp连接,如果关闭之后短时间内再次重新建立完全相同的ip地址和对应端口的连接,这个时候便需要考虑上次连接时存在的老重复分组再次发挥作用。为避免这种情况,便需要2个MSL的TIME_WAIT,之所以为两个,首先足够某个方向上的分组最多存活MSL即被丢弃,另一个方向上的应答最多存活MSL也被丢弃,通过两个MSL,能保证当成功建立一个TCP连接时,来自该连接之前的老重复分组都已在网络中消逝。