TCP/IP状态变迁图置顶:
- 主动关闭的一方再最后回应了ACK报文之后,该ACK报文有丢失的可能,如果丢失,对端会重发FIN报文,因此目的之一是为ACK报文的丢失做应对措施。
- 主动关闭的一方再回应ACK报文之后,如果立刻关闭本连接,后续有可能新的连接复用该连接,这样就会有可能导致原连接的部分报文因为某些原因重新到来,导致与新连接的报文相混淆,扰乱正常报文。
MSL
MSL:Maximum Segment Lifetime,报文网络中最大存活时间。
RFC 793 [Postel 1981c] 指出MSL为2分钟。然而,实现中的常用值是30秒,1分钟,或2分钟。
时间为何是2MSL
- 对应上文的第一条原因,主动关闭的一方回应的ACK报文最大存活MSL,假设在存活时间段的最后也没有到达对方(此为一次MSL),则对方会重发FIN报文,该FIN报文假设在存活的MSL的最后到达了本端(此为一次MSL),则来得及重回ACK,否则就认为对端已正常关闭,那好,本端也可以关闭连接了。
- 其次,有足够的时间让这个连接不会跟后面的连接混在一起(你要知道,有些自做主张的路由器会缓存IP数据包,如果连接被重用了,那么这些延迟收到的包就有可能会跟新连接混在一起)。
补充
在连接处于2MSL等待时,任何迟到的报文段将被丢弃。 因为处于2MSL等待的、由该插口对(socket pair,即连接五元组)定义的连接在这段时间内不能被再用,因此当要建立一个有效的连接时,来 自该连接的一个较早替身(incarnation)的迟到报文段作为新连接的一部分不可能不被曲解 (一个连接由一个插口对来定义。一个连接的新的实例(instance)称为该连接的替身)。《TCP IP详解卷一》18.6.1原文描述如下:
TCP将不给处于TIME_WAIT状态的连接发起新的化身,既然TIME_WAIT状态的持续时间是MSL的2倍,这就足以让某个方向上的分组最多存活MSL秒即被丢弃,另一个方向上的应答最多存活MSL秒也被丢弃。通过实施这个规则,我们就能保证每成功建立一个TCP连接时, 来自该连接先前化身的老的重复分组都已在网络中消逝了。参考连接: