1、什么是TIME_WAIT
在TCP连接中,主动关闭一方在收到FIN/ACK包之后,进入TIME_WAIT状态。 该状态会持续 2MSL(Maximum Segment Lifetime) 时长,之后进入CLOSED 状态。
MSL 指的是 TCP 协议中任何报文在网络上最大的生存时间,任何超过这个时间的数据都将被丢弃。在实际实现时,MSL约为30秒 ~ 2分钟,2MSL约为1分钟 ~ 4分钟。
TCP状态迁移图:
2、为什么要有TIME_WAIT状态
(1)避免新连接收到老数据
TCP存在超时重传机制,且基于四元组(本地IP、本地端口、对端IP、对端端口)判断连接通路,只要四元组信息相同则认为是相同连接。
新连接建立后,四元组与老连接相同,则可能收到历史数据,造成处理逻辑的混乱。因此,TCP设计了TIME_WAIT状态,持续2MSL时间,足以使两个方向上的数据包都被丢弃,则再出现的数据包一定是新连接所产生的。
(2)可靠的实现双方正常退出
假设客户端发送最后一条ACK之后直接到达CLOSE状态,不保存TIME_WAIT状态。且这一条ACK消息传输异常,即服务端未收到,则服务端的最后一条FIN消息会重传。
对于客户端来说,此时已