TCP中的TIME_WAIT状态

什么是TIME_WAIT呢?

TCP中的TIME_WAIT状态
上面是TCP客户端向服务器申请链接-》传输数据-》断开连接的过程。

在断开连接的4次握手过程中,执行主动关闭的那一端(也就是我们这个图中的客户端)将进入TIME_WAIT状态

这个状态将持续2MSL的时间(最长分节生命周期:maximun segment lifetime),每一个TCP都有一个MSL的值
大概在30s-2min不等。因此这个状态将持续1min-4min不等。

那么为什么设置这个时间呢?

  1. 可靠地实现TCP全双工连接的终止
  2. 允许老的重复分节在网络中消逝

什么意思呢?这里解释一下:
1)假设上图中最后一次通信过程(也就是ACK N+1)出现问题了,没有传输成功,客户端需要维持状态信息,来重新发送最后的ACK。 如果不这样做,客户端将以一个RST响应(另一种tcp的分节类型),这将导致被服务器解释成一个错误。
也就是说,如果想正确的终止tcp的双向连接(也就是全双工连接),需要正确处理断开连接时的4次握手过程。需要这个时间

2)如果我们通过中断指令控制服务器端断开了一个tcp连接,马上我们又想连接上,这时会发现我们无法使用相同的ip+端口号连接上,因为在TIME_WAIT时间内不允许这样的事情发生,这被TCP解释称属于同一连接的某个新的化身,这种化身在TIME_WAIT期间不被允许。
因为在这个期间,旧的客户端分组并未被丢弃,在经历这段时间之后,另一个方向上的应答将被丢弃,这是我们就能保证每成功建立一个TCP连接时,来自该连接先前化身的旧的重复的分组已经在网络中消逝了。

但是这个方案仍然后一个bug,相关可以去查看rsh命令相关内容。