2010-10-04 128 views
4

在Linux中,如何设置TCP连接上允许的最大段大小?我需要将它设置为我没有写入的应用程序(所以我不能使用setsockopt来做到这一点)。我需要在网络堆栈中设置这个高于mtu。如何在Linux上设置最大TCP最大段大小?

我有两个流共享同一个网络连接。一个定期发送小包,这需要绝对最小的延迟。另一方发送大量数据 - 我正在使用SCP来模拟该链接。

我已经设置交通控制(TC),得到最低延时的流量高优先级。但是我遇到的问题是,从SCP传出的TCP数据包最终大小达64K字节。是的,这些被分解成基于mtu的更小的数据包,但是这不幸在发生在数据包的优先次序后发生。因此,我的低延迟数据包滞留在高达64K字节的SCP流量后面。

This article表明,在Windows中可以设置这个值。

有什么在Linux上我可以设置?我已经尝试过ip route和iptables,但是这些在网络堆栈中应用得太低。我需要在tc之前限制TCP数据包大小,因此它可以适当地优先考虑高优先级数据包。

+0

我发现很难相信包在TCP队列中结束了64k,tc不能在TCP层上工作,它关心数据包,而不是TCP段 – nos 2010-10-04 18:18:48

+0

我必须同意。从我的阅读中,TCP段应该在tc之前分解。但是,这不是我所看到的(无论是在延迟还是在tcpdump中)。当一个大的TCP段出去时,它会延迟高优先级的通道,直到发送大段的所有(最多64K字节)为止。 – Eric 2010-10-18 21:40:05

回答

2

的上限播发TCP MSS的是第一跳路由的MTU。如果你看到64k段,这往往表明第一跳路由MTU过大 - 你使用环回或测试什么?

+0

没有。第一跳MTU是1500.我在tcpdump输出(发送端)看到大数据包。如果我也在接收端运行一个tcpdump,我会看到大数据包被分成许多1500字节的数据包。 – Eric 2010-10-18 21:37:31

0

你肯定是误诊了这个问题;正如其他人指出的那样,tc没有看到TCP数据包,它看到了IP数据包,并且在那时它们已经处于大块区域。

您可能只是遇到了bufferbloat:您在一个完全独立的设备(可能是DSL调制解调器或电缆调制解调器)中将您的出站队列超载。唯一的解决方法是告诉tc将出站带宽限制为小于调制解调器的带宽,例如。使用TBF。

5

是否使用TCP分段卸载到NIC? (您可以使用“ethtool -k $ your_network_device”来查看卸载设置。)据我所知,这是唯一的方法,您将看到设备MTU为1500的64k tcp数据包。并不是说这回答了这个问题,但这可能有助于避免误诊。

相关问题