主动关闭 TCP 连接的一方才有 TIME_WAIT 状态
需要 TIME_WAIT 状态,主要有两方面原因:
- 防止历史连接的报文(延迟的重传报文)被后面相同四元组的连接错误接收
- 保证「被动关闭连接」的一方,能收到对方的 ACK,也就是第四次挥手报文,正常关闭连接
原因 1
TIME_WAIT 状态持续时长 2MSL,这个时间足以让两个方向上的报文都被丢弃,使得原来连接的报文在网络中都自然消失,再出现的报文一定都是新建立的连接所产生的
原因 2
被动关闭连接的一方收到 RST 报文后,将其解释为一个错误(Connection reset by peer),这对于一个可靠的协议来说不是一种优雅的终止方式
注意
主动关闭连接的一方在收到重传的 FIN+ACK 报文后,会重置 TIME_WAIT 状态的等待时长
遗留问题
RFC 1122 4.2.3.1(P96) 规定,RTO_MAX 应该小于等于 2MSL
The recommended upper and lower bounds on the RTO are kn