在Linux中,如何设置TCP连接上允许的最大段大小?我需要为我没写的应用程序设置它(所以我不能使用setsockopt
来执行此操作)。我需要将此设置为网络堆栈中的mtu。
我有两个流共享相同的网络连接。一个周期性地发送小数据包,这需要绝对最小延迟。另一个发送大量数据 - 我正在使用SCP来模拟该链接。
我已设置流量控制(tc)以使最小延迟流量具有高优先级。但是,我遇到的问题是,从SCP下来的TCP数据包最终会出现64K字节的大小。是的,这些基于mtu被分成更小的数据包,但遗憾的是,在tc对数据包进行优先级排序之后。因此,我的低延迟数据包被卡在高达64K字节的SCP流量后面。
This article表示在Windows上您可以设置此值。
Linux上有什么东西可以设置吗?我尝试过ip route和iptables,但这些在网络堆栈中应用得太低了。我需要在tc之前限制TCP数据包大小,因此它可以适当地优先处理高优先级数据包。
答案 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字节。