tcp_tw_recycle 导致的问题。

关于 TCP time_wait 解释。

tcp time_wait状态 也称为 2MSL等待状态。每个具体TCP实现必须选择一个报文段最大生存时间MSL(Maximum Segment Lifetime)。它是任何报文段被丢弃前在网络内的最长时间。

RFC 793 指出MSL为 2分钟。然而,实现中的常用值是30S,1分钟或2分钟。

对于一个具体实现所给定的MSL值,处理原则是:当TCP执行一个主动关闭,并发回最后一个 ACK,该连接必须在 TIME_WAIT状态停留的时间为2倍的MSL。这样可以让TCP再次发送最后的 ACK以防止这个ACK丢失(另一端超时并重发最后的FIN)

在2MSL等待期间,端口中使用的本地端口在默认情况下不能再被使用。

(上文 摘自 《TCP/IP详解 卷1》)

以下为个人观点: 也就是说,当TCP连接释放的时候 主动断开连接的一方会处于 TIME_WAIT状态,并发送最后一个ACK。 另一方收到 ACK后 关闭连接。

当这个时候 开启了tcp_tw_recycle, 主动断开连接的一方(服务端) TIME_WAIT状态被快速回收。并发送 ACK 给被断开连接的一方(客户端)。这时候 客户端 向 服务端发起 第二个连接时。服务端 重新 建立新的连接时,服务端 断开连接时候 发送 的 ack,和客户端发送的 sync 产生混乱了。

也就是说,客户端 发送 sync 给服务器 要求 建立连接。 而服务器 认为 自己已经 发送了 ack给 客户端。

time_wait 给服务器带来的影响。time_wait 本身名声不好,人们总是力图避开它。 time_wait 本身不会给服务器造成太大负载。但是time_wait 状态的时候服务器该进程会不提供服务。 降低了服务器的处理能力。