如何在Linux上设置TCP最大分段大小?

10
在Linux中,如何设置TCP连接允许的最大段大小?我需要为一个我没有编写的应用程序进行设置(因此我不能使用setsockopt来执行此操作)。我需要将其设置在网络堆栈中的MTU之上。
我有两个共享同一网络连接的流。一个定期发送小数据包,需要绝对最小的延迟。另一个发送大量数据 - 我正在使用SCP模拟该链接。
我已经设置了流量控制(tc)以使最低延迟的流量具有高优先级。然而,我遇到的问题是,从SCP下来的TCP数据包的大小可以达到64K字节。是的,这些数据包基于MTU被分成更小的数据包,但不幸的是,在tc优先处理数据包之后才会发生这种情况。因此,我的低延迟数据包会被卡在多达64K字节的SCP流量后面。 本文表明在Windows上可以设置此值。

有没有在Linux上可以设置的东西?我尝试过ip route和iptables,但这些都应用于网络堆栈的较低层。我需要在tc之前限制TCP数据包大小,以便它可以适当地优先处理高优先级数据包。


我很难相信数据包最终在tc队列中达到64k的大小,因为tc不在TCP层工作,它关心的是数据包而不是TCP段。 - nos
我必须同意。根据我的阅读,TCP段在tc之前应该被分解。然而,这不是我所看到的(无论是在延迟还是在tcpdump中)。当一个大的TCP段出去时,它会延迟高优先级通道,直到所有(最多64K字节)的大段都被发送完毕。 - Eric
5个回答

9

您是否正在使用tcp分段卸载到网卡?(您可以使用“ethtool -k $your_network_device”查看卸载设置。)据我所知,这是唯一的方式,您会看到MTU为1500的设备中有64k的tcp数据包。虽然这并没有回答问题,但它可能有助于避免误诊。


7
使用选项advmssip route命令可帮助设置MSS值。
ip route add 192.168.1.0/24 dev eth0 advmss 1500

3
广告的TCP MSS的上限是第一跳路由的MTU。如果您看到64k的片段,那往往表示第一跳路由的MTU过大 - 您在使用回环测试之类的东西吗?

不是的。第一跳 MTU 是 1500。我在 tcpdump 输出中看到大包(在传输侧)。如果我还在接收侧运行 tcpdump,我会看到大包被分成许多 1500 字节的小包。 - Eric

1

MSS = MTU - 40字节(标准TCP/IP开销为40字节[20+20])

如果MTU为1500字节,则MSS将为1460字节。


-1

你肯定误诊了问题;就像其他人指出的那样,tc看不到TCP数据包,它只看到IP数据包,在那个时候它们已经被分成块了。

你可能只是遇到了缓冲膨胀问题:你在一个完全独立的设备(可能是DSL调制解调器或电缆调制解调器)中超载了你的出站队列。唯一的解决方法是告诉tc将你的出站带宽限制在调制解调器带宽以下,例如使用TBF。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接