讲个有用的东西:ping X.X.X.X -l 1400,这个 1400 大小是什么?如何定位链路 MTU?

本期给大家分享网络基本原理。

我们在判断链路是否支持传输大包,一般就会使用如下命令:

复制
ping X.X.X.X -l 1400 //表示数据部分长度为1400字节1.

那么问题来了:

问题1:实际从电脑网卡发出去的数据包大小到底是多少?问题2:如果ping不通,是否可以确定链路中的MTU的具体值?下面一条一条解释。

问题1:实际从电脑网卡发出去的包大小到底是多少?

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字节

如下:

问题2:如果ping不通,是否可以确定链路中的MTU的具体值?

可以,一般情况下以太网传输中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小于1428字节并且不支持分片,收到大小为1428字节的IP包直接丢弃:

类似的我们可以通过逐步调整ping的长度参数以确定准确的链路MTU。我是不是讲的有点抽象?但我个人觉得应该很好理解了。

THE END
本站服务器由亿华云赞助提供-企业级高防云服务器