我有一个应用程序发送100个186字节(不包括标题)的TCP消息,无间隙地从主机A到主机B.
我运行了tcpdump来捕获主机A上的数据包(发送者在那里),并且我注意到在几条消息(如9)之后,接下来的〜25条消息被合并成一条5 + K消息。
我已经通过发件人应用程序中的setsockopt()closures了Nagle的algorithm,并且计算出来的TCP窗口总是超过14K字节。 因此,似乎并没有填满主机B的第9条消息,主机B要求主机A减速。
有关如何弄清楚为什么TCP消息被合并的任何提示?
谢谢!
我有一个应用程序发送100个186字节(不包括标题)的TCP消息,无间隙地从主机A到主机B.
那么你可能发送的速度比networking可以传输的速度快,在这种情况下,当发送方的TCP实现准备好在networking上发送一个数据包的时候,可能会有多个消息排队,在这种情况下,将尽可能多地发送到单个TCP段中。 TCP协议提供了一个字节stream服务, 没有消息边界的概念,所以允许这样做。
我已经开启了Nagle的algorithm
Nagle的algorithm 明确地做了你所说的发送端TCP的操作 :
Nagle的algorithm通过组合一些小的传出消息,并一次发送它们。
所以打开它不会阻止。 在某些情况下, closures它可能会阻止,但是鉴于您的应用程序发送一连串的消息,它可能不会阻止。
(也就是说,“为什么发送端的TCP为什么要合并这些消息?”是“因为可以”)。
你所看到的很可能是由于function从内核networking堆栈卸载到networking接口和/或驱动程序。
networking接口仍将接收来自networking的单个数据包。 但是在数据包交给内核之前,它们会被接口或驱动程序合并。
您可以使用以下命令查看所有卸载function的当前设置:
ethtool -k eth0
如果要禁用此特定function,可以使用以下命令完成:
ethtool -K eth0 generic-receive-offload off
你可以在这个旧的问题阅读更多关于卸载。