![客户端 TCP 段成批到达](https://linux22.com/image/781837/%E5%AE%A2%E6%88%B7%E7%AB%AF%20TCP%20%E6%AE%B5%E6%88%90%E6%89%B9%E5%88%B0%E8%BE%BE.png)
场景如下:WebSocket 服务器和客户端以某种速度交换消息(例如每秒 40-50 次)。但是,对于一个客户端,每隔几分钟我就会观察到一个 5 秒(始终是相同的跨度)的时间段,来自客户端的 TCP 段(包含客户端的 WebSocket 消息以及对服务器消息的 ACK)分批到达(一批消息累积了几百毫秒,因此客户端消息会连续爆发),因此输出tcpdump
示意图如下所示:
...
t0 S > C <server-message-1>
t0 + 20 S > C <server-message-2>
...
t0 + 100 S > C <server-message-n>
t0 + 105 C > S <client-message-1>
t0 + 105 C > S <client-message-2>
t0 + 105 C > S <server-message-1-ack>
...
t0 + 105 C > S <client-message-m>
t0 + 105 C > S <server-message-n-ack>
...
除其他事项外,Nagle 算法对套接字以及 均已禁用net.ipv4.tcp_autocorking = 0
。尝试了各种 TCP 拥塞算法,似乎没有改变这种情况。我如何检测这是服务器上的问题,还是客户端出了问题?
有任何建议可以解释为什么会发生这种情况以及如何解决或至少找出问题所在吗?
答案1
看看 RSO 和 GSO,因为它们会将片段组合成更大的帧,然后将其传送到内核。这不应该有 5 秒的延迟,但这可能是配置错误的。