最近,我们发现了一个 TCP 连接问题,该问题主要限于浏览我们网站的 mac 和 Linux 用户。
从用户的角度来看,它表现为与我们网站的连接时间非常长(> 11 秒)。
我们已经设法追踪到这个问题的技术特征,但无法弄清楚它为什么会发生或如何解决它。
基本上,发生的事情是客户端的机器正在发送 SYN 数据包以建立 TCP 连接,而 Web 服务器收到它,但没有响应 SYN/ACK 数据包。在客户端发送了许多 SYN 数据包后,服务器最终以 SYN/ACK 数据包进行响应,并且连接的其余部分一切正常。
而且,当然,问题的关键是:它是间歇性的,不会一直发生(尽管它确实发生在 10-30% 的时间内)
我们使用 Fedora 12 Linux 作为操作系统,使用 Nginx 作为 Web 服务器。
Wireshark 分析截图

更新:
在客户端上关闭窗口缩放阻止了问题的发生。现在我只需要一个服务器端分辨率(我们不能让所有客户端都这样做):)
最终更新:
解决方案是关闭我们服务器上可供公众访问的TCP 窗口缩放 和 TCP 时间戳。
使用 iptraf、tcpdump 和 wireshark 我可以看到一个 SYN 数据包进入,但只有 ACK FLAG 设置在回复数据包中。
我正在使用内核 2.6.36 运行 Debian 5
我已经关闭了 window_scaling 和 tcp_timestamps、tcp_tw_recycle 和 tcp_tw_reuse:
cat /etc/sysctl.conf
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_tw_reuse = 0
net.ipv4.tcp_window_scaling = 0
net.ipv4.tcp_timestamps = 0
Run Code Online (Sandbox Code Playgroud)
我附上了wireshark输出的图像。
输出到 netstat
netstat -natu | grep '72.23.130.104'
tcp 0 0 97.107.134.212:18000 72.23.130.104:42905 SYN_RECV
Run Code Online (Sandbox Code Playgroud)
我一直在尽一切可能找到解决方案,但尚未找出问题所在,因此非常感谢任何帮助/建议。
更新 1:我已设置 tcp_syncookies = 0 并注意到我现在每 50 个 SYN 请求回复 1 个 SYN+ACK。尝试连接的主机大约每秒发送一次 SYN 请求。