【问题标题】:Tune MTU on a per-socket basis?在每个插槽的基础上调整 MTU?
【发布时间】:2010-11-12 14:03:01
【问题描述】:

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

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

如果目前没有办法做到这一点,您对在 linux 内核中的何处进行挂钩/修补以实现这种可能性有任何想法吗?

谢谢。

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

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

想想大文件传输的情况,所有数据包都被填满到 MTU 大小。当我隧道它们时,我增加了一些开销,导致每个原始数据包产生两个隧道数据包,它不是最佳的。

【问题讨论】:

  • tun/tap 驱动程序比“窃取”流量更容易解决;)

标签: linux networking linux-kernel tcp mtu


【解决方案1】:

如果创建了套接字,以便在传出数据包上设置 DF,那么您可能会在欺骗(注入)需要 ICMP 分段的消息时向自己返回一些运气,直到您最终获得所需的 MTU。相当丑陋,但取决于你的绝望程度,它可能是合适的。

例如,您可以使用 iptables 规则生成这些数据包,因此匹配和发送非常简单,并且在您的应用程序之外。看起来 iptables 的 REJECT 目标没有拒绝需要的碎片,但添加一个可能不会太棘手。

另一种方法,如果您只关心 TCP 数据包,那么您可能会对套接字选项 TCP_MAXSEG 或 TCPMSS 目标有一些运气(如果这适合您的问题)。

对于 UDP 或 raw,您可以随意使用 send() 数据包!

更新:

基于“我为什么要这样做?”答案,如果未设置 DF 或提高 ICMP“需要分段”并且丢弃实际上是正确的解决方案,则似乎将数据包分段。

这是一个更“正常”的路由器会做的事情,如果防火墙不吃掉 ICMP 数据包,那么它在所有情况下都会表现得正常,而回顾性地改变事情会导致奇怪的行为。

iptables clamp mss 是一个相当不错的 TCP 解决方案,通过这个“VPN”,尤其是当您似乎已经在广泛使用 iptables 时。

【讨论】:

  • ICMP 锻造可能是一种方法,但我必须说这很 hackish ;)。对于 TCP MAXSET,似乎是一种有趣的方式,是否可以从 sysfs/procfs 进行调整?
  • 我在 proc(5) 的联机帮助页中或在 /sys 或 /proc 上的任何内容都看不到任何内容,除了对已建立的连接的读取访问权限之外。
  • 当然,另一种选择是通过共享库插入一些函数。您可以拦截对 socket() 的调用,并设置一个信号处理程序来进行一些信号更改,因为 setsockopt() 是异步安全的。你能更具体地说明你为什么要这样做吗?我认为这很不寻常(因此缺乏一种明显的干净方式来实现它!)
  • 另一个问题是:谁来处理“需要分段”的 ICMP 消息,是由用户空间应用程序处理套接字还是在内核级别处理?
  • 对于 TCP,应该为您处理“需要分段”消息。对于 UDP/Raw 套接字,这通常会作为错误暴露给用户空间,或者导致未来的这种大小的数据包为您分段,具体取决于套接字选项集。
【解决方案2】:

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

【讨论】:

  • 我真的希望它是每个套接字的,所以 ifconfig 不是办法。即使对于 TCP,MSS(最大分段大小)在其发现中也使用 MTU 值。顺便说一句,即使每个接口都设置了 MTU,IP(或/和 TCP?)层有时也会访问它以进行分段,不是吗?
  • 对,链路层为上层提供了 MTU 信息。如果您想查看碎片,只需发送大于 1472 的 UDP 数据包(以太网 1500 帧大小减去 20 字节的 IP 头减去 8 字节的 UDP 头)。
  • 我认为这个问题是关于让套接字发送比 MTU 小得多的数据包。
  • @nikolai-n-fetissov:看到碎片对我来说本身并不是目标,我想要的是报告给上层的 MTU 信息被设置为任意(在我的情况下是较低的)值对于给定的套接字。
猜你喜欢
  • 1970-01-01
  • 2011-06-27
  • 2013-04-21
  • 1970-01-01
  • 2020-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-21
相关资源
最近更新 更多