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

时间:2010-10-04 18:04:50

标签: linux tcp qos

在Linux中,如何设置TCP连接上允许的最大段大小?我需要为我没写的应用程序设置它(所以我不能使用setsockopt来执行此操作)。我需要将此设置为网络堆栈中的mtu。

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

我已设置流量控制(tc)以使最小延迟流量具有高优先级。但是,我遇到的问题是,从SCP下来的TCP数据包最终会出现64K字节的大小。是的,这些基于mtu被分成更小的数据包,但遗憾的是,在tc对数据包进行优先级排序之后。因此,我的低延迟数据包被卡在高达64K字节的SCP流量后面。

This article表示在Windows上您可以设置此值。

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

5 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:3)

通告的TCP MSS的上限是第一跳路由的MTU。如果您看到64k段,这往往表明第一跳路由MTU过大 - 您是使用环回还是进行测试?

答案 2 :(得分:2)

带有选项ip route

advmss命令有助于设置MSS值。

ip route add 192.168.1.0/24 dev eth0 advmss 1500

答案 3 :(得分:0)

你肯定是在误解这个问题;正如其他人指出的那样,tc看不到TCP数据包,它看到了IP数据包,而且它们已经处于块状态。

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

答案 4 :(得分:0)

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

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