【问题标题】:Why isn't "dont fragment" flag getting disabled?为什么“不要片段”标志没有被禁用?
【发布时间】:2014-10-23 17:13:39
【问题描述】:

我正在尝试使用setsockopt() 设置不同的IP_MTU_DISCOVER 值对 udp 数据包碎片的影响,并发现(来自ip(7)man 页面)我需要将其值设置为IP_PMTUDISC_WANTIP_PMTUDISC_DONT 关闭“不分段”标志。但是,当我尝试发送数据包时,我得到了socket.error: [Errno 90] Message too long

import IN, socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

hostname = 'localhost'
s.connect((hostname, 1060))

s.setsockopt(socket.IPPROTO_IP, IN.IP_MTU_DISCOVER, IN.IP_PMTUDISC_DONT)
mtu = s.getsockopt(socket.IPPROTO_IP, IN.IP_MTU)

print 'MTU:', mtu
s.send('.' * (mtu + 1))
print 'Big packet sent'

谢谢

【问题讨论】:

    标签: python sockets python-2.7


    【解决方案1】:

    让我们先回顾一下 PMTU 如何为 UDP 工作。

    1. IP 端点以给定的 MTU 开始,通常是其直接连接链路的 MTU。
    2. 发送数据包时,端点总是设置 DF 位。
    3. 如果中转路由器决定在不将数据包分段的情况下无法发送数据包,它将返回错误代码为 4 和下一跳 MTU 的 ICMP Destination Unreachable 数据包。
    4. IP 端点收到无法访问的 ICMP 并调整其 PMTU。
    5. IP 端点决定如何处理原始数据包(重新传输、向应用层发送信号...)。

    这里需要特别注意的是 PMTU 不会自动发生。没有内置探测包可以在您(应用程序)开始发送实际数据之前找出 MTU。

    因此 Linux 使用以下标志来控制这个(对于数据报):

    • IP_PMTUDISC_WANT 如上所述执行 PMTU。如果应用程序发送的数据包对于已知 MTU 来说太大,套接字层会将其分段。传出数据包(包括片段)将设置 DF 位。
    • IP_PMTUDISC_DONT 不要进行 PMTU 发现。
    • IP_PMTUDISC_DO 做 PMTU 发现。如果应用程序发送的数据包对于已知的 MTU 来说太大,则向应用程序发送错误。
    • IP_PMTUDISC_PROBE 设置 DF 位以进行 PMTU 发现,但忽略当前学习的 MTU。因此,如果应用程序发送了一个太大的数据包,它无论如何都会尝试将其发送出去。这对于不时发送探测以查看 PMTU 是否没有增加很有用。

    现在要注意的一部分是,IP_PMTUDISC_DONT 没有指定如果数据包实际上大于您当前的 MTU(即您的直接链接之一)该怎么做。所以很可能它将这个选择留给实际必须发送数据包的接口。大多数接口实际上应该对数据包进行分段,因为不发送 DF 位。但是,您使用链接本地接口,它通常是一个功能较少的软件接口。在您的发行版中,这可能不支持分片,因此会发送错误。这是有道理的,从我的机器上获取这个输出:

    In [6]: s.getsockopt(socket.IPPROTO_IP, 14) #14 = IP_MTU, just wasn't in my python lib.
    Out[6]: 16436
    

    这表明链路本地接口的 MTU 在网络方面非常巨大,所以为什么要从一开始就支持分片。话虽如此,在我的系统上这实际上工作得很好。

    【讨论】:

    • 当我将IP_PMTUDISC_DONT 替换为IP_PMTUDISC_WANT 时出现同样的错误,这是为什么呢?它应该对数据包进行分段吗?
    • 你读过我的全部答案了吗?最后,我指定了独立于该设置的碎片可能会出现什么问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    相关资源
    最近更新 更多