作用
- 可靠地实现TCPIP全双工的终止。
- 允许老的重复的TCP数据包在网络中终止,保证老的数据包不会干扰到新的连接。
解释
针对“可靠的实现TCPIP全双工的终止”,如下图所示
当四次挥手的最后一包(ACK)在传输过程中丢失时,Client 会感应并重新发送 FIN 包。此时 Server 处于 TIME_WAIT 状态,则 Server 会重新发送 ACK 包,这样就保证了该连接可以优雅的断开。
上述情况,若 Server 没有 TIME_WAIT 状态,则 Server 端会发送 RST 包,即:连接复位,使得 Client 直接关闭,容易造成数据包的丢失。
针对“允许老的重复的TCP数据包在网络中终止”,是因为四次挥手的最后一包在以太网中可能传输时间较长,若没有TIME_WAIT包,当 Server 断开连接之后立刻重新启动和之前一摸一样的 Server ,并且立刻产生了新的连接,那么刚才所说的传输时间较长的包经过跋山涉水经过来到了 Client 端,但是发现此时的 Client 端正在和 Server 进行三次握手,这就导致了 Client 产生了混乱。
拓展
虽然 TIME_WAIT 状态好处多多,但是在它统治期间,重新 bind 会失败,所以有的时候需要将该状态去掉,方法是调用 setsockopt (……,SO_REUSEADDR,……)。
(SAW:Game Over!)