我有一个 TCP 服务器在运行 Ubuntu 12.04.3(内核 3.8.0-31-generic)的机器(“服务器”)上进行监听。它接收来自 2 台不同客户端机器的连接。机器 A 运行 Ubuntu 12.04.4 (3.11.0-17-generic),机器 B 运行 Ubuntu 11.10 (3.0.0-32-server)。
如果服务器上启用了 TCP 时间戳(sysctl net.ipv4.tcp_timestamps=1),那么有时来自机器 A 的 SYN 数据包会被“忽略”。在服务器上使用 tcpdump(在非混杂模式下)我可以看到 SYN 到达正常并且校验和正确 - 只是没有响应 - 没有 SYN/ACK 和 RST。机器 A 在放弃之前多次重传 SYN。在机器 A 上运行的客户端软件(在本例中为 wget)立即使用新连接重试并成功,获得即时 SYN/ACK。
机器 B 在同一台服务器上没有问题,它的流量看起来很正常 - 它也使用与机器 A 相同的 TCP 选项(从我从捕获文件中看到的)。在服务器上禁用 TCP 时间戳会使一切正常工作。
被忽略的 SYN 数据包中的时间戳对我来说似乎是有效的,所以我不确定它们为什么会导致问题,或者它们是否是根本原因。
我在这里放了一个匿名 pcap https://www.dropbox.com/s/onimdkbyx9lim70/server-machineA.pcap。它是在服务器 (10.76.0.74) 上拍摄的,显示机器 A (10.4.0.76) 成功执行 HTTP GET(数据包 1 到 10),然后 1 秒后尝试再次获取相同的 URL(数据包 11 到 17),但相反忽略其 SYN。数据包 18 到 …