一、 MTU MSS 概念
什么是MTU?
MTU是数据链路层的概念,限制的是数据链路层payload的大小,即上层协议大小(包括上层协议头)
例如设置主机接口mtu为1450。则在一个TCP报文中,1450 = 20字节IP头 + 20字节TCP头 + 1410TCP数据。
什么是MSS?
MSS最大报文段,是TCP中一个选项,用于在TCP连接建立时,收发双方协商通信时每一个报文段所能承载的最大数据长度(注意不包含TCP头部大小)
如何探测路径MTU值?
Linux主机中: 执行ping x.x.x.x -s 1422 -M do ,x.x.x.x是目标地址,-s指明icmp报文的数据部分大小(不包含icmp 8字节头部)。
-M do 表示不允许分片。多试几次,找到临界点。
以mtu为1450为例,1450 = 20字节IP头 + 8字节icmp头 + 1422数据,则-s指定为1422可以正常通过
Windows主机中: 执行ping x.x.x.x -l 1472 -f ,x.x.x.x是目标地址,-l指明icmp报文的数据部分大小(不包含icmp 8字节头部),-f表示不允许分片。
二、案例分析
从路径上看,丢包点大致可以有下面几个位置:
1. 数据中心外部丢包
2. 数据中心内部丢包
3. 主机内部丢包
对于数据中心内部丢包问题,最重要的是能 “界定问题边界”,换句话说,这是谁的锅?
拥有自己数据中心的,往往会由网络工程师负责配置网络,系统工程师管理主机/虚拟化环境。界定的边界办法可以是:
1)长ping 网关地址,如果出现丢包,十有八九是网络设备有问题。
2)使用MTR看路径上丢包点。
3)抓包分析
MTU丢包
1.检查接口MTU配置,ifconfig eth1/eth0,默认是1500;
2.进行MTU探测,然后设置接口对应的MTU值;
image.png
解决方案:
1. 根据实际情况,设置正确MTU值;
2. 设置合理的tcp mss,启用TCP MTU Probe
# cat /proc/sys/net/ipv4/tcp_mtu_probing
tcp_mtu_probing - INTEGER Controls TCP Packetization-Layer Path MTU Discovery.
Takes three values:
0 - Disabled
1 - Disabled by default, enabled when an ICMP black hole detected
2 - Always enabled, use initial MSS of tcp_base_mss.
image.png
image.png
MTU带来的问题实在太多了,但凡做过运维、实施或者技术支持的工程师,或多或少都会遇到。
一个典型的MTU问题发生在类似图1的环境中,即两个子网的MTU大小不一样。
当客户端发给服务器的巨帧经过路由器时,或者被丢包,或者被分片。
这取决于该巨帧是否在网络层携带了DF(Don’t fragment)标志。
如果带了就被丢弃,如果没带就被分片。
从Wireshark上很容易看到DF标志,如图2中的方框内所示。
分片的情况往往被忽略,因为它只影响一点点性能,大多数时候甚至察觉不出。
丢包的情况就无法忽略了,因为丢包之后再重传多少遍都没用,会一直丢,整个传输就像掉进了黑洞,所以往往会导致严重的后果。
对于 TCP来说,要尽量避免分片。
因为必须所有分片都到达才能重组成一个包,其中任何一个分片丢失了,都必须重发所有分片。
分片会增大丢包和乱序的概率,同时也会增加时延。
如果在TCP报文经过的传输网络中有某个设备的MTU设置得太小, 则它会将收到的IP报文进行分片。
分片会增大丢包和乱序的概率, 同时也会增加时延。
MTU不等,大的数据包就被拆开来传送,这样会产生很多数据包碎片,增加丢包率,降低网络速度。
不同设备和不同网络对接一定要注意一下MTU值,设置一定要相同,就可以减少丢包,否则会降低网络速度或打不开网页,无法上传数据甚至业务不通。
为什么说 MTU 值会影响网速呢?
在 Win 系统中,MTU 值默认是 1500。假设我们现在要传输 3000 字节的数据,只需要拆分成 2 个数据包就行了。
而如果是 ADSL 接入方式,它的 MTU 值是 1492 的话,则 3000 字节的数据需要分为 3 个数据包传送。
由于数据包的数量增多了,同时拆包组包都需要额外消耗时间,因此网速变慢也就不足为奇了。
image.png
一次MTU问题导致的RDS访问故障
https://mp.weixin.qq.com/s/b2bk1dRDJwHCWp7cN_Vy1Q
1. 在DF位没有置1情况下,IP数据包大小超过接口MTU值时,IP数据包会切片(framed)
2. 在DF位没有置1情况下,已经切片的IP数据包在转发过程中不会组装
注:如直连的2个接口,一个MTU为1500,另一个MTU不是1500,可能会产生丢包
(原因:MTU就是MRU;切片发生在数据包发出时,不发生在接收时)
MTU一经确定不再改变?
实际上MTU并不是确定了之后就一直不变的,每个端上查看到的MTU并非是最终的MTU大小,这个怎么理解呢?
大部情况下,网络发送端都需要经过各种中间设备才能到达目标机器,这些中间设备可能是路由器、交换机、中间代理服务器等等,这些设备的MTU大小可能有大有小,更糟糕的是,每次走的路径不一样MTU大小可能也不一样。
那么,假如我们的发送端的MTU是1500,中间某个交换机或者路由器的MTU是200字节,当数据包到达这个设备的时候IP层就会触发拆包,很明显如果出现这种情况网络传输效率会大幅降低。
那么有什么办法可以解决这个问题呢?
我们可以思考一下,要解决这个问题其实只要找到链路中最小的MTU就可以了,那么,我们如何感知中间设备的MTU呢?
有一个叫ICMP的协议可以在中间设备出现异常的时候将异常返回,从而发送端可以感知到,关于ICMP协议这里不展开,有兴趣可以自行去了解。
实际上,TCP协议已经实现了链路MTU的探测,叫做PMTU,原理就是设置IP报头DF不分片位置为不分片,这样当遇到比MSS小的MTU的设备,这个设备就会返回一个ICMP报文,里面携带了错误消息和可接受的MTU大小。
三、参考
什么是MTU值,MTU值有什么用?
https://mp.weixin.qq.com/s/gruLG48W7KEJ_BQJ8tooDQ
GaussDB网络重传/丢包问题定位总结
https://bbs.huaweicloud.com/blogs/235237
网络中一些丢包场景
https://mp.weixin.qq.com/s/FdoDfchrYC0H-Rd0wRm4gg
网络延时大,丢包,卡顿,不好用,时断时续找原因
https://mp.weixin.qq.com/s/IX8Q8yAdII962r2p8Yd8lw
云网络丢包故障定位全景指南
https://mp.weixin.qq.com/s/kkn72wtKvjIopySE5VMnbA
案例分享:MTU值导致视频丢包故障分析
https://mp.weixin.qq.com/s/VGtGwtzz2eKTIG3QtwgwkA
MTU导致的悲剧
https://mp.weixin.qq.com/s/hRhpwZge_LEmDfJINp-oyQ
解决网络丢包问题及故障判断方法
https://mp.weixin.qq.com/s/Zt2SRnbRLHwIbDzErRdxXw
一次MTU问题导致的RDS访问故障
https://mp.weixin.qq.com/s/b2bk1dRDJwHCWp7cN_Vy1Q
网速慢?改下MTU值试试
https://mp.weixin.qq.com/s/LHAuRMf72J6zm_hOffW3rA
案例分享:MTU值对传输网络对接的影响
https://mp.weixin.qq.com/s/J6-uG2mY4bGQcU5s-oU-Aw
丢包问题研究
https://mp.weixin.qq.com/s/GRmqu1xcNZ7wRNjYrrHFCQ
MTU系列实验(1)——IP MTU
https://mp.weixin.qq.com/s/66sXXTt3B0A8zt8CgB4iug
TCP问题定界六大方向分析总结
https://mp.weixin.qq.com/s/IE2dkmYd0etmlK7G_wVIHA
某局MTU问题导致手机无法上网故障排查过程
https://mp.weixin.qq.com/s/HPNPa4IfCnCaU3h4rwNtUg
为什么MSS都小于MTU?
https://mp.weixin.qq.com/s/BDsI33nRsZHCx1VhJtyzcA
设置路由器MTU与操作系统的MTU值相同,可提升网速
https://mp.weixin.qq.com/s/QRdbLdiG3jDc1H8x8sVnjA
网友评论