如何探测链路的 MTU?

2015-04-02 20:31:25 +08:00
 TheCure

需要探测链路的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探测?

6548 次点击
所在节点    程序员
11 条回复
thekll
2015-04-02 21:31:46 +08:00
geeklian
2015-04-02 21:53:44 +08:00
why not google?
geeklian
2015-04-02 22:00:58 +08:00
TheCure
2015-04-02 22:27:48 +08:00
@thekll 我说的方法其实就是RFC的方法,只是我不知道怎么设置DF为1来禁止分包
invite
2015-04-02 22:44:47 +08:00
你发送了多大的ICMP包?然后设置的DF为1?
TheCure
2015-04-02 23:01:20 +08:00
@invite 一个一个加 可以ping通的话就加一个从1280开始
dndx
2015-04-03 00:54:34 +08:00
ceyes
2015-04-03 01:06:11 +08:00
不是有 tracepath 么?
另,ping -M do 就是禁止分片。
zhicheng
2015-04-03 10:04:19 +08:00
@callofmx 是一个一个减,从本地 NIC 的 MTU 开始,如果没有回复,就用下一个仅小于这个 MTU 的设备 MTU尺寸。最小到 576 应该就可以了。
TheCure
2015-04-03 11:05:42 +08:00
@zhicheng 总是无法探测大于本机MTU值的链路MTU,所以你说的更科学一点,感谢!
TheCure
2015-04-03 11:07:38 +08:00
@dndx 这就是我想要的答案! 感谢,我查查这个方法在python中有没有类似的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/181208

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX