TCP TIME_WAIT

维持TIME_WAIT有两个原因:

  1. 可靠地实现TCP的全双工连接终止

    在四次挥手中,假设最后的ACK丢失了,被动关闭方会重发FIN。主动关闭端必须维护状态,来允许被动关闭方重发最后的ACK;如果它没有维护这个状态,将会对重发FIN返回RST,被动关闭方会认为这是个错误。如果TCP正在执行彻底终止数据流的两个方向所需的所有工作(即全双工关闭),则必须正确处理这四个段中任何一个的丢失。所以执行主动关闭的一方必须在结束时保持TIME_WAIT状态:因为它可能必须重传最后的ACK。

  2. 允许旧的重复数据段在网络中过期

    假设在主机1.1.1.1的1111端口和2.2.2.2的2222端口之间有一个TCP连接。此连接关闭后,相同的地址和端口建立了一个新连接。由于IP地址和端口相同,TCP必须防止旧连接的数据包再次出现,被新的连接误收。为此,TCP将不会启动当前处于TIME_WAIT状态的连接。由于TIME_WAIT状态的持续时间是两倍的MSL,因此TCP允许一个方向的数据在MSL秒内丢失,也允许回复在一个MSL秒内丢失。通过此规则来保证当一个TCP连接成功建立时,来自先前连接的所有旧的副本在网络中已过期。