TCP 消息合并了吗?

Hei*_*Hei 5 networking tcp tcpdump centos6

我有一个应用程序,它发送 100 个 186 字节(不包括标头)的 TCP 消息,从主机 A 到主机 B 之间没有间隙。

我运行 tcpdump 来捕获主机 A(发件人所在的位置)上的数据包,我注意到在几条消息(如 9 条)之后,接下来的约 25 条消息合并为一条 5+K 条消息。

我已经在sender应用程序中通过setsockopt()关闭了Nagle的算法,计算出的TCP windows一直超过14K字节。因此,前 9 条消息似乎没有填满主机 B 并且主机 B 要求主机 A 放慢速度。

关于如何找出 TCP 消息合并的原因的任何提示?

谢谢!

kas*_*erd 1

您所看到的很可能是由于功能从内核网络堆栈卸载到网络接口和/或驱动程序。

网络接口仍将接收来自网络的各个数据包。但在数据包被传递到内核之前,它们会被接口或驱动程序合并。

您可以使用以下命令查看所有卸载功能的当前设置:

ethtool -k eth0
Run Code Online (Sandbox Code Playgroud)

如果您想禁用此特定功能,可以使用以下命令来完成:

ethtool -K eth0 generic-receive-offload off
Run Code Online (Sandbox Code Playgroud)

您可以在这个较旧的问题中阅读有关卸载的更多信息。