根据this SO post Can a TCP port be re-used before TIME-WAIT expires?, 如果新的 SYN 数据包具有较大的 ISN,则可以重用 TIME-WAIT。
但是,如果它的 ISN 大于旧连接,则以下 SYN 失败事件。
Detailed info:
Failed SYN: NO(54365) , ISN(3853063683)
Elder connection max packet: NO(50379), ISN(2103445551)
根据this SO post Can a TCP port be re-used before TIME-WAIT expires?, 如果新的 SYN 数据包具有较大的 ISN,则可以重用 TIME-WAIT。
但是,如果它的 ISN 大于旧连接,则以下 SYN 失败事件。
Detailed info:
Failed SYN: NO(54365) , ISN(3853063683)
Elder connection max packet: NO(50379), ISN(2103445551)
现在明白了。
服务器和客户端都启用了选项'net.ipv4.tcp_timestamps'(centos下默认启用)。所以服务器会先检查新来的SYN的时间戳(Ignore ISN now):如果大于老连接对应的值,则服务器重用TIMEWAIT连接(不管现在ISN是小还是大)。否则将其视为老连接的丢失数据包,并发送老连接的最后一个ack(无论ISN现在是更小还是更大)。
数据包 54365 的时间戳 (tsval) 值小于数据包 50379,因此失败。
有用的参考:https ://vincent.bernat.ch/en/blog/2014-tcp-time-wait-state-linux