TCP连接终止中的TIME_WAIT状态
可靠地实现TCP全双工连接的终止;
可以通过假设最终的ACK丢失了来解释。服务器将重新发送它的最终那个FIN,因此客户必须维持状态信息,以允许它重新发送最终那个ACK。如果客户不维护那个状态信息,它将响应以一个RST,该分节将被服务器解释成一个错误。如果TCP打算执行所有必要的工作以彻底终止某个连接上两个方向的数据流(即全双工关闭),那么它必须正确处理连接终止序列4个分节中任何一个分节丢失的情况。之所以是执行主动关闭的一端处于TIME_WAIT,是因为可能不得不重传最终那个ACK的就是那一端。
允许老的重复分节在网络中消失
假设在12.106.32.254的1500端口和206.168.112.219的21端口间有一个TCP连接。我们关闭这个连接,过一段时间后在相同的IP地址和端口之间建立另一个连接。后一个连接称为前一个连接的化身(incarnation),因为它们的IP地址和端口号都相同。TCP必须防止来自某个连接的老的重复分组在该连接已终止后再现,从而被误解成属于同一连接的某个新的化身。为做到这一点,TCP将不给处于TIME_WAIT状态的连接发起新的化身。既然TIME_WAIT时间是MSL的2倍,这足以让某个方向上的分组最多存活MSL秒即被丢弃,另一个方向上的应答最多存活MSL秒也被丢弃。通过实施这个规则,可以保证每成功建立一个TCP连接时,来自该连接先前化身的老的重复分组都已在网络中消逝了。