今天无聊 ping+curl 某个公网 IP,想要了解一些基本信息。用ping -l 参数的时候,发现了个很有趣的现象:当指定 ping 包 size 大于 1452 字节(Byte)的时候,回显请求超时。
P1.ping 某服务器公网 IP,ping包大于 1452 字节后请求超时
不信邪的我同时 ping 了下腾讯、阿里和百度网站,当 ping 包大小超过 1452Byte 后同样被拒绝……查阅了下资料,原来网站空间服务商部署的 WAF(Web 应用防护系统,可以理解为防火墙)缺省 MTU 就是 1452Byte,当外部 ping 包大小超过 1452Byte 时,还没到达网站服务器就提前被空间服务商的 WAF 给过滤丢弃了。
日常网络使用中,我们除了要关注 WAF 缺省 MTU 外,标准以太网缺省 MTU 及其数值设定也会影响到网络传输效率,特别是内网数据。标准以太网缺省 MTU 为 1500Byte,加上以太网帧头 14Byte、帧尾 4Byte,就是标准以太网帧最大长度 1518Byte 了。 //MTU 是指数据帧除了帧头、帧尾的部分
为什么标准以太网缺省 MTU 为 1500Byte,或者说 1500Byte 是怎么计算得来的呢?人为设定,不是由字段的比特位长度限制而来的。众所周知,IP 头 Total Length 字段长度为两个 Byte,理论上 IP 数据包可以支持 2^16=65535 Byte。但早期以太网的工作方式是 CSMA/CD(载波多路复用/冲突检测),网络是共享式的,即任何一个节点发送数据之前,先要侦听线路上是否有数据在传输,如果有,需要等待,如果线路可用,再尝试发送。这样的话发送 65535Byte 的超大数据包将独占通信线路较长时间,对于一些时延敏感的应用来说是不可接受的。
那标准以太网缺省 MTU 为什么不设定为一个较小的数值呢?标准以太网帧最小长度为 64Byte,那 MTU 设置为 65Byte 可以吗?当然可以,就是传输效率比较低而已……传输效率=有效载荷/数据帧总长度=(MTU-IP包头20Byte-TCP头20Byte)/(MTU+数据帧头14Byte+帧尾4Byte)=25/82≈30.49%。而如果 MTU 设置为 1500Byte,则传输效率=1460/1518≈96.18%,传输效率得到明显的提升。
综上,以太网缺省 MTU 设定为 1500Byte 的目的是为了平衡传输时延和传输效率,在尽可能保证较低时延的同时尽可能的提高传输效率。
现在我们了解了 WAF 和标准以太网缺省 MTU 值,那么 MTU 究竟有什么用呢?应用程序或者操作系统还能向网络中发送类似 65535Byte 这样的超大数据包或者说巨型帧吗?
MTU 的作用是控制向外发送数据帧的大小/长度,当应用程序或者上游网络传输设备投递的数据封装超过 本设备(接口)设定的 MTU 值时,将分片处理。所以,科学合理设定 MTU 值是非常重要的。 如果局域网内的电脑设备设置了不恰当的 MTU,比如MTU 设置为 1501,此时应用程序要发送的数据恰好又超过 1500Byte,会导致每个数据帧在发送前都需要进行二次拆分,既浪费时间又额外消耗设备资源。
向网络中发送类似 65535Byte 这样的巨型帧,是完全可以的,不过在发送前,本地设备接口会根据缺省 MTU 将该数据帧拆分成若干个 1518Byte 数据帧。至于能不能接收到对端回复,那就要看接收方有没有做限制了。如下图所示,接收方正常回复 65500Byte 大小的 ping 包。
P2.向本地网关发送 65500 巨型帧
注意:windows 系统给 ping -l 参数做了个小限制,允许设置的范围值为 0-65500 ,理论上最大可以设置为 65535。
P3.windows 限制 ping 包大小最大值为 65500 Byte
总结:
1、WAF 缺省 MTU 为 1452Byte,即所有网站都不会响应回复超过 1452Byte 大小的 ping 包;
2、标准以太网缺省 MTU 为 1500Byte,该值的设置和字段的比特位长度限制无关,是标准起草人/起草组织综合考虑网络传输效率和网络时延而人为设定的数值,可以为 1500,也可以为 1501,只要你是标准制定者…;
3、可以向网络中发送类似 65535 Byte 的巨型帧,但会被自动拆分成若干 1518Byte 数据帧;
4、windows 系统 ping -l 命令允许发送的 ping 包大小范围为 0-65500Byte。
附:windows 系统通过 cmd 命令修改接口 MTU
netsh interface ipv4 show subinterfaces //查询本机所有网络接口的 MTU 值
netsh interface ipv4 set subinterface "以太网" mtu=1452 store=active //修改"以太网"接口 MTU 值并激活生效
p4.查询本机接口缺省 MTU 并修改本地连接”以太网” MTU 值