V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
TheCure
V2EX  ›  程序员

如何探测链路的 MTU?

  •  
  •   TheCure · Apr 2, 2015 · 7108 views
    This topic created in 4043 days ago, the information mentioned may be changed or developed.

    需要探测链路的MTU,初步想法是手动构造一个ICMP报文,并设置不分片,逐步增大报文大小,当收到要求分片的错误信息时候便是MTU的大小.
    因为是要重头构造,所以直接在python里调用command('ping -f')的不行.构造ICMP报文需要用到RAW SOCKET:
    1.使用socket.IPPROTO_ICMP的时候内核接管了IP头默认分片没有方法设置DF为1.
    2.使用socket.IPPROTO_RAW的时候自己构造的IP头如果DF为1就发不出去,DF为0才可以发出去.
    总之RAW socket始终是自动分片的,这样就没有办法探测MTU了,出了RAW_SOCKET还有什么方法可以实现MTU探测?

    11 replies    2015-04-03 11:07:38 +08:00
    thekll
        1
    thekll  
       Apr 2, 2015 via iPhone
    geeklian
        2
    geeklian  
       Apr 2, 2015
    why not google?
    geeklian
        3
    geeklian  
       Apr 2, 2015   ❤️ 1
    TheCure
        4
    TheCure  
    OP
       Apr 2, 2015
    @thekll 我说的方法其实就是RFC的方法,只是我不知道怎么设置DF为1来禁止分包
    invite
        5
    invite  
       Apr 2, 2015
    你发送了多大的ICMP包?然后设置的DF为1?
    TheCure
        6
    TheCure  
    OP
       Apr 2, 2015
    @invite 一个一个加 可以ping通的话就加一个从1280开始
    ceyes
        8
    ceyes  
       Apr 3, 2015 via Android
    不是有 tracepath 么?
    另,ping -M do 就是禁止分片。
    zhicheng
        9
    zhicheng  
       Apr 3, 2015 via Android   ❤️ 1
    @callofmx 是一个一个减,从本地 NIC 的 MTU 开始,如果没有回复,就用下一个仅小于这个 MTU 的设备 MTU尺寸。最小到 576 应该就可以了。
    TheCure
        10
    TheCure  
    OP
       Apr 3, 2015
    @zhicheng 总是无法探测大于本机MTU值的链路MTU,所以你说的更科学一点,感谢!
    TheCure
        11
    TheCure  
    OP
       Apr 3, 2015
    @dndx 这就是我想要的答案! 感谢,我查查这个方法在python中有没有类似的
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1406 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 17:10 · PVG 01:10 · LAX 10:10 · JFK 13:10
    ♥ Do have faith in what you're doing.