time_wait状态

time_wait状态_第1张图片
TCP状态转换图

如图所示,执行 主动关闭的那端经历了time_wait状态,该端点停留在这个状态的持续时间是最长分节生命期的两倍,有时称为2MSL(MSL:任何IP 数据报能够在因特网中存活的最长时间)。

任何TCP都要给 MSL一个值,RFC建议是2分钟,但是传统上改用30秒这个值,意味着time_wait状态持续时间在1-4分钟之间。

分组在网络中“迷途”通常是由路由异常的结果。某个路由器崩溃或某两个路由器直接的某个链路断开时,路由协议需要花 数秒钟到数分钟的时间才能稳定并找出另一条通路,在这段时间内有可能发生路由循环(路由器A把分组发送给路由器B,而B再把它们发送回A)。假设迷途的分组是一个TCP分节,在它迷途 期间,发送端TCP超时并重传该分组,而重传的分组却通过某条候选路径到达最终目的地,然而不就好路由循环修复 ,早先迷失在这个循环中的分组最终也被送到目的地。这个原理的分组被称为迷途的重复分组或漫游的重复分组。

TIME_WAIT状态有两个存在的理由:

1)可靠的实现了TCP全双工连接的终止。

2)允许老的重复分节在网络中消逝。

time_wait状态_第2张图片
TCP连接 的分组交换

看上图 ,假设最终的ACK丢失,服务器将重新发送它最后的那个FIN,因此 客户必须维护状态信息,以允许它重新发送最终的那个ACK,要是客户不维护状态信息,它将响应一个RST(另外一种类型的TCP分节),该分节将被服务器解释成一个错误。如果TCP打算执行所有必要的工作以彻底终止某个连接上两个方向的数据流,那么它必须正确处理连接终止序列4个分节中任何一个分节丢失的情况。

TIME _WAIT存在的第二个理由:假设 在12.106.32.254的1500端口和206.168.112.219的第21端口之间有一个TCP连接,我们关闭这个连接,过一段时间后在相同的IP地址和端口直接建立另一个连接。后一个连接称为前一个连接的化身。TCP必须放在来做某个连接 的老的重复分组在该链接已经终止后再现,从而被误解为属于同意连接的某个新的化身。为做到这一点,TCP将不给处于TIME_WAIT状态的连接发起新的化身,既然 TIME_WAIT状态的持续时间是MSL 的2倍,这就足以让某个方向上的分组最多存活MSL秒即被丢弃。

摘自:UNIX网络编程卷1:套接字联网API

你可能感兴趣的:(time_wait状态)