MTU 那点事儿:一次改错值引发的网络龟速历险记
上周排查一个诡异的网络问题时,我又被 MTU 这个老朋友上了一课。今天就跟大家聊聊这个经常被忽视却又至关重要的网络参数——顺便分享下我是怎么把 200M 带宽活生生改成 56K 拨号速度的翻车现场。
MTU 到底是什么?
简单来说,MTU(Maximum Transmission Unit)就像快递包裹的尺寸限制。想象你买了个超大号懒人沙发,快递小哥看了看说:”抱歉,我们货车每次最多只能运 1500mm 的货”——这就是 MTU 在干的事。
技术定义上,MTU 指的是单个网络数据包能传输的最大字节数,包括 IP 头、TCP/UDP 头和实际数据。以太网默认是 1500 字节,这个数字可不是随便定的:
# 查看网卡 MTU 值
ifconfig eth0 | grep mtu
# eth0: flags=... mtu 1500
为什么乱改 MTU 会翻车?
故事要从我配置 VPN 说起。当时为了适配某个奇葩的 IPSec 设备,我随手把 MTU 改成了 1400:
# 错误示范!不要学!
ifconfig eth0 mtu 1400
结果第二天就接到投诉:”服务器下载速度从 25MB/s 暴跌到 300KB/s!” 抓包发现大量这样的提示:
[TCP Out-of-Order] [TCP Previous segment not captured]
MTU 引发的蝴蝶效应
问题出在路径 MTU 发现机制(PMTUD)上。当我强制降低 MTU 后:
- 大包被拆分成更多小包,增加处理开销
- 某些设备会丢弃 DF(Don’t Fragment)标记的包
- TCP 需要不断重传,触发拥塞控制
用 tcpdump 抓包时,我看到了大量这样的 ICMP 报错:
ICMP 3 (Destination Unreachable), code 4 (Fragmentation Needed)
正确的 MTU 调优姿势
经过这次教训,我总结出几个原则:
- 不要随便改默认值:1500 是经过几十年验证的黄金标准
- 需要改时先测试:可以用 ping 探测最大 MTU:
ping -M do -s 1472 example.com # 1472+28(包头)=1500
- 注意封装开销:VPN/GRE 等隧道协议需要额外头空间
最后分享个实用命令,查看系统当前的 MTU 配置:
ip link show | grep mtu
记住:网络调优就像老中医开药,剂量不对反而会要命。下次再遇到网速异常时,不妨先检查下这个隐藏参数——说不定你也在经历我当年的”56K 怀旧之旅”呢!
看完文章终于明白上次公司VPN为啥那么卡了,原来MTU设置不对!
作者这个快递包裹的比喻太形象了,一下子就懂了MTU是啥 👍
所以默认1500是最佳值吗?那为什么有些VPN要调低MTU呢?
笑死,56K拨号速度这个形容太真实了,经历过的人都懂 🤣
技术小白表示看不太懂,有没有更简单的解释啊?
感谢分享!正好遇到类似问题,明天去公司试试ping命令检测MTU
之前也踩过这个坑,改完MTU后视频会议卡成PPT,血泪教训啊
想问下作者,如果网络设备不支持PMTUD怎么办?
老中医开药这个比喻绝了,网络调优确实要谨慎