讲个有用的东西:ping X.X.X.X -l 1400,这个 1400 大小是什么?如何定位链路 MTU?
本期给大家分享网络基本原理。
我们在判断链路是否支持传输大包,一般就会使用如下命令:
复制
ping X.X.X.X -l 1400 //表示数据部分长度为1400字节1.
那么问题来了:
问题1:实际从电脑网卡发出去的数据包大小到底是多少?问题2:如果ping不通,是否可以确定链路中的MTU的具体值?下面一条一条解释。ping -l 1400 中 -l 指定的是ICMP报文的数据部分长度(1400字节),但实际在网络中传输的报文总长度更大,相关计算如下:
电脑发出去的ICMP报文的总长度 = 数据部分(1400字节) + ICMP头部(8字节) + IP头部(至少20字节,若带选项则更长)+MAC头部(18字节)
以最小IP头部计算,所以电脑发出的数据包:
帧总长度为 1400+8+20+18=1446字节IP包长度为 1400+8+20=1428字节如下:
可以,一般情况下以太网传输中MTU为1500字节,如下:
但一些奇怪的链路中(如VPN、VXLAN、物联网等)可能会存在MTU<1500字节且不允许分片包转发的情况,从而导致电脑、路由器、路由器按照MTU=1500发包会给链路丢掉,所以要解决这样的问题:
需要测试该链路中的MTU值,也就是链路允许能转发的最大IP包长度(不考虑MAC帧)然后再对应的改小路由、PC中出接口的MTU值以适配链路。1. 用ping命令探测链路MTU的核心逻辑
链路MTU是指从源到目标的整个路径中最小的MTU值,ping命令通过指定不同的-l参数(ICMP数据部分长度),可判断路径是否支持该长度的报文:
若报文总长度(含头部)≤ 链路MTU:ping成功,返回响应。 若报文总长度(含头部)>链路MTU:此时ping失败。2. 用ping命令加字节长度根据结果分析
按照之前我给的例子,输入:
复制
ping X.X.X.X -l 14001.
我们知道了他的IP包长度是1428字节(不含MAC层头部),如果:
Ping成功,说明链路MTU至少为1428字节或支持分片传输,能支持大小为1428字节的IP包转发:类似的我们可以通过逐步调整ping的长度参数以确定准确的链路MTU。我是不是讲的有点抽象?但我个人觉得应该很好理解了。
THE END