博主头像
mxd's Blog

以技术为翼,以生活为魂

MTU,影响网络性能的关键

网络调试时,你或许见过“MTU”这个词。它看起来不起眼,却常常是网页加载慢、VPN 掉线、SSH 卡顿这些问题的幕后元凶。
这篇文章带你用最直白的方式搞清楚:什么是 MTU,它为什么重要,又该怎么设置合适的值。


什么是 MTU

MTU,全称 Maximum Transmission Unit(最大传输单元),意思是网络接口一次能传输的数据包的最大长度(单位:字节)。

打个比方,MTU 就像快递箱的大小。箱子太小,快递要分好几箱寄,效率低;箱子太大,超出快递员能搬的范围,也送不出去。

常见默认值如下:

网络类型默认 MTU
有线以太网1500
PPPoE 拨号1492
IPv6 隧道通常小于 1480
VPN(OpenVPN、WireGuard 等)1280~1420

MTU 为什么重要

MTU 设置得合不合适,直接影响网络稳定性和速度。

  • 太大:路径中只要有一台设备不支持,就会触发“分片”或干脆丢包。
  • 太小:虽然不会丢,但每次传输的有效数据更少,浪费带宽。

常见症状:

  • VPN 连上了,但网页打不开
  • 能 ping 通却无法访问网站
  • 文件传输、游戏、远程桌面卡顿

很多人误以为是 DNS 或防火墙问题,其实往往是 MTU 太高或不匹配。

路径 MTU 与分片

IP 层在遇到超过 MTU 的数据包时,会进行 分片(Fragmentation),把大包拆成多个小包再发送。
这虽然能保证传输,但代价是效率下降、延迟变高,一旦其中一个分片丢失,整个包都要重传。

更合理的做法是使用 路径 MTU(Path MTU)
它表示“从源头到目标的整条路径中,所有设备能支持的最小 MTU 值”。
只要路径中有一段链路支持的 MTU 较小,整条路径都必须以那个值为准。

“需要拆分数据包但设置 DF” 怎么理解

有时抓包会看到这样的情况:数据包需要拆分,但却设置了 DF(Don't Fragment)标志
乍一看这似乎矛盾,其实这是 路径 MTU 发现(Path MTU Discovery,PMTUD) 的关键机制。

IP 头部中有一个 DF 标志,意思是“不要分片”。
当这个标志被置 1 时,如果中途某个路由器发现数据包太大,它不会分片,而是丢弃该包,并返回一条 ICMP 消息:

Destination Unreachable – Fragmentation needed

这条消息会告诉源主机:“我这段链路最大只能传多少字节”。
源主机据此调整包大小,再次发送,直到找到可以顺利通过整条路径的最大值。

因此,“需要拆分数据包但设置 DF”并不是错误,而是一种探测行为
通过禁止中间设备分片,主机可以准确知道路径上的最小 MTU,从而自己在源端控制包大小。

这就是 路径 MTU 发现(PMTUD) 的核心原理。

举个例子

主机 A 要发一个 1500 字节的包到主机 B,
中间某段链路的 MTU 只有 1400。

  1. A 发出 DF=1、长度 1500 的包。
  2. 中间路由器发现超出 MTU,但不能分片,只能丢弃。
  3. 路由器返回 ICMP 消息:“需要分片,MTU=1400”。
  4. A 收到消息,记下 MTU=1400,以后所有包都控制在这个大小以下。

这样做的好处是:

  • 避免中间设备频繁分片;
  • 提高传输效率;
  • 让源主机能主动调整。

注意事项

如果网络或防火墙阻断了 ICMP 消息,PMTUD 就无法正常工作。
此时主机会持续发送过大的包,而中途设备又因为 DF=1 不分片,于是不断丢弃。
表现就是:能 ping 通,却打不开网页
解决办法通常是:

  • 手动减小 MTU(如 1400);
  • 或在防火墙中放行 ICMP “Fragmentation needed” 消息。

如何测试 MTU

Linux/macOS:

ping -c 4 -M do -s 1472 8.8.8.8

如果提示 Message too longFrag needed,说明太大了。
注意:1472 + 28 = 1500,其中 28 是 IP+ICMP 头部长度。

Windows:

ping -f -l 1472 8.8.8.8

逐步减小 1472 的值,直到不再提示“需要分段(packet needs to be fragmented)”。
最终 MTU = 找到的最大可用值 + 28。

优化建议

  1. 找出合适的 MTU
    先测试出路径支持的最大 MTU,再应用到接口配置。
  2. 修改网络接口 MTU
    在 Linux 下可执行:

    ip link set dev eth0 mtu 1400
  3. VPN 要适当调低
    因为 VPN 会额外占用字节空间,比如 OpenVPN 的有效 MTU 常在 1400 左右。
    否则会出现“部分网站打不开”的情况。
  4. IPv6 注意最低值
    IPv6 标准要求 MTU 不能低于 1280,否则通信可能异常。

WireGuard 举例

假设你用 WireGuard VPN,配置里 MTU 默认为 1420。
如果你的线路经过 PPPoE(1492)和 IPv6 隧道(1480)两层封装,实际可用 MTU 只有 1380 左右。
这时只需在客户端配置中加上一行:

MTU = 1380

网页就能秒开,一切恢复顺畅。

参考资料

MTU,影响网络性能的关键
https://blog.mxdyeah.com/post/understanding-mtu-network-performance
本文作者 mxdyeah
发布时间 2025-10-26
许可协议 CC BY-NC-SA 4.0
已有 2 条评论
  1. 评论头像

    大神,请教个问题,我在自己的m3u文件中使用您EPG服务的时候,发现“美亚电影HD”和“美亚电影”无法区分。匹配代码段代码如下:tvg-id="美亚电影HD" tvg-name="美亚电影HD",我想匹配美亚电影HD的节目信息,但实际上匹配到的是美亚电影的节目信息,您看能怎么处理下吗?

    MMSH October 30, 2025 09:40   Windows 10/11 x64 Edition(Windows 10/11 x64 Edition) / Google Chrome 141.0.0.0(Google Chrome 141.0.0.0) 回复
    1. 评论头像

      看到你发的邮件了,你这回复到哪里去了哈哈哈

      mxdyeah 博主 November 1, 2025 19:49   FreeBSD(FreeBSD) / Firefox 145.0(Firefox 145.0) 回复
发表新评论

AD: