我有一个TCP服务器正在运行Ubuntu 12.04.3(内核3.8.0-31-通用)的机器(“服务器”)上侦听。它从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到达OK并具有正确的校验和-没有响应-没有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到27是另一个成功。
我怀疑这与“ 为什么服务器不发送SYN / ACK数据包来响应SYN数据包 ” 中描述的问题类似,并且禁用时间戳是一种解决方法,我想了解发生了什么。这只是一个错误吗?
没有运行本地防火墙。该服务器可处理许多TCP连接(任何时候大约32K),但具有大量的可用内存/ CPU。在pcap中显示的测试时,机器A与服务器之间没有其他TCP连接。没有迹象表明服务器应用程序的接受队列突然装满了(这可能会影响我假定的两个客户端)。由于数据包在服务器上的pcap中看起来不错,因此似乎没有中间的网络设备在破坏事物。
我最初将其发布在ubuntu论坛上,但事后看来,这可能是一个更合适的位置。希望借到一个线索。