tcp TIME_WAIT状态存在的两个理由:
1)如果TCP打算执行所有必要的工作以彻底终止某个连接上两个方向的数据流,那么必须正确处理连接终止序列4个分组中任何一个分组丢失的情况。
如图所示,如果服务器没有接收到最后一个ACK,会重发FIN,假设此时客户端不在TIME_WAIT状态,则无法再回复ACK,那么四次握手终止不会完成。
2)假设一个tcp连接在终止之后,在相同IP和端口之间建立了另一个连接。假设此时前一次连接的某个分组由于路由迷失后又重新找到路由,到达该新连接的某一端,则会对该连接造成影响(如果是FIN呢)。为了避免这种情况发生,所以保持TIME_WAIT时间,这个时间是MSL的两倍,理论上大于TTL跳跃结束所需时间,从而让老的分组在网络中消逝。