按插槽调整MTU?

时间:2010-11-12 14:03:01

标签: linux networking linux-kernel tcp mtu

我想知道是否有任何方法可以调整(在Linux系统上)给定套接字的MTU。 (使IP层分段成比实际设备MTU小的块。)

当我说一个给定的套接字时,我并不是在拥有套接字的应用程序的代码中进行编程,而是在外部,例如通过sysfs条目。

如果目前无法做到这一点,你对linux内核中的钩子/补丁的位置有什么想法来实现这种可能性吗?

感谢。

编辑:我为什么要这样做?

我正在做一些Layer3-in-Layer4(例如:隧道IP以及通过TCP隧道的上面)隧道。与VPN类似的解决方案不同,我没有使用虚拟接口来实现这一点。我正在使用iptables捕获数据包,以正常方式丢弃它们并将它们写入隧道套接字。

考虑大文件传输的情况,所有数据包都填充到MTU大小。当我对它们进行隧道传输时,我会增加一些开销,导致每个原始数据包产生两个隧道数据包,但它不是最佳的。

2 个答案:

答案 0 :(得分:2)

如果创建套接字以便在传出数据包上设置DF,那么在欺骗(注入)ICMP碎片需要一些运气回复自己的消息,直到您最终获得所需的MTU。相当难看,但取决于你是多么绝望,这可能是合适的。

例如,您可以使用iptables规则生成这些数据包,因此匹配和发送对您的应用程序来说很简单。看起来iptables的REJECT目标没有需要的碎片,但是添加一个也不会太棘手。

另一种方法,如果它只是你关心的TCP数据包,那么你可能对套接字选项TCP_MAXSEG或TCPMSS目标有好运,如果这适合你的问题。

对于UDP或原始文件,您可以免费获得send()数据包,只要您喜欢它!

<强>更新

基于“我为什么要这样做?”回答,如果没有设置DF或者提高ICMP“需要碎片”,看起来像是分段数据包,而丢弃实际上是正确的解决方案。

这是一个更“正常”的路由器会做什么,并且如果防火墙不吃ICMP数据包那么它在所有情况下都会表现得很好,而追溯性地改变事物则是一种奇怪的行为。

iptables clamp mss对于这个“VPN”来说是TCP的一个很好的修复,特别是因为你已经在广泛使用iptables了。

答案 1 :(得分:0)

MTU是链接的属性,而不是套接字。它们属于堆栈的不同层。这就是说TCP在三次握手期间执行路径MTU发现并且非常努力地避免碎片。您将很难制作TCP发送片段。使用UDP最简单的方法是在ifconfig(8)的接口上强制使用一些小的MTU,然后发送大于该值的数据包。