目录

MTU的作用

MTU(Maximum Transmission Unit,最大传输单元),指的是网络设备在一个数据帧(frame)中能够承载的最大有效载荷字节数。通俗地说:一次「打包发货」时,包裹最多能装多少货。

以太网默认 MTU = 1500(字节),指的是帧里承载的上层数据(IP 包)部分,不含以太网帧头(14 字节)和帧尾校验(4 字节)。加上帧头帧尾,实际在网线上跑的帧大小约 1518 字节。

MTU 核心作用只有一个:规定「一次最多能发多大的一块数据」,超出就要分片(fragmentation)。

1500 是早年制定的标准,现在可能是"过时"了,但是标准就是这样,兼容性无敌,你的链路上只要有一台老设备,大包一样会被丢弃,所以如果是数据中心这种纯局域网,MTU 理论是可以调大的。

路由器上的 MTU 设置,决定路由器从某个物理接口发出数据包时,单个包的最大体积。

光纤 PPPoE 拨号时,PPPoE 头占 8 字节,所以链路 MTU 实际只有 1492。如果路由器 WAN 口 MTU 仍按 1500 配,就有可能出现 下载/上传稍大的文件就卡死或断流。

当然,如果你 ISP 拿到的是大内网 IP,或者纯局域网 LAN 口 MTU,那么保持 1500 标准以太网一般是没有什么问题。

广域网里也大量存在以太网链路(比如城域网、运营商的以太骨干),那些地方同样是 1500。1500 的本质是「链路技术」决定的。ISP 的 MTU 一般是固定的,除非是更换了链路技术。


标准以太网载荷(MTU 1500) − PPPoE 头(6)− PPP 协议字段(2) = PPPoE 可用 MTU 1492;

但是 WAN 口链路上,路由器保守配置亦或者是 ISP 的内部开销、隧道封装等,实际可能只有 1480 甚至更低。

PMTUD,即路径 MTU 发现,PMTUD 的本质是一句话:发送方故意用「禁止分片」的方式试探,让路上第一个「装不下」的路由器把真相告诉它。

主要靠的是 IP 头的 DF 位,如果为 1 则是禁止分片,中间路由器发现出口链路 MTU(1480)小于包大小(1500),又因为 DF=1 不能帮你分片 → 丢弃该包,并回一个 ICMP “Fragmentation Needed / 需要分片”,里面带上「我的 MTU 是 1480」

这样发送端收到 ICMP,把这条路径的 MTU 缓存成 1480,后续报文都按 1480 发,不再触发分片。

实际生效 MTU = min (路由器/源端设的 MTU, 路径真实 MTU),PMTUD 只能往下压,永远不能往上顶。

也就是 PMTUD 的职责是「发现路径上最小的那个 MTU」,不是「找到最大值」。路径 MTU 由最弱的一环决定


IPv4 里很多流量(早年、某些 UDP、部分系统实现)默认 DF=0,路径上的路由器会「兜底分片」。所以哪怕 MTU 不匹配,数据还能靠分片勉强挤过去。

IPv6 则一刀切禁止中间路由器分片(RFC 8200)。装不下就只能丢,没有「帮你切一刀」这个选项。这就是 IPv6 脆弱的一点。另外 IPv6 协议规定链路必须支持的最小 MTU 是 1280。

PMTUD 检查到超出时,只是返回 Too Big / 需要分片,让客户端按新 MTU 重传;它本身不分片。

现代 IPv4 主机 TCP 流量「正常情况」就是 DF=1。 DF=0 才是需要显式允许的例外。PMTUD 在现实网络里普遍生效

IPV6 的 ICMPv6 常被安全策略一刀切丢弃

所以,PMTUD 是同一套逻辑,两套独立实现,IPV6 没有 DF 位,禁止分片,返回的 ICMPv6 是必须带 MTU 的。

DF=0 自动分片下,IP 层分片对 TCP 完全不可见,TCP 的所有优化机制全部失效,丢包被放大、重传大包、效率低下等等问题现在普遍都是 DF=1。

MSS(Maximum Segment Size,最大报文段长度),是 TCP 层的概念:一个 TCP 报文段里能装的最大「数据」字节数(不含 TCP 头、不含 IP 头)。

MSS = MTU − IP 头 − TCP 头

IPv4 标准以太网:1500 - 20 - 20 = 1460

IPv4 + PPPoE:1492 - 20 - 20 = 1452

IPv6 + PPPoE:1492 - 40 - 20 = 1432

TCP 在建连握手(SYN)时就会互相通告自己的 MSS,双方取较小值,然后保证每次发送的 TCP 段都不超过这个 MSS,这样天然就不会触发 IP 分片。

MSS 是「主动预防分片」的手段(在 TCP 层就切好)

PMTUD 是「被动兜底」的手段(万一还是超了,靠 ICMP 纠偏)


路由器上常说的「MSS Clamping(MSS 钳制)」,就是路由器出口把经过的 TCP SYN 里的 MSS 强制改小(比如改成 MTU−40−20),这样既不用等 PMTUD、也不怕 ICMP 被墙,属于「不等协商,直接替你改好」的操作。

RA(Router Advertisement,路由器通告)是 IPv6 邻居发现协议(NDP,RFC 4861)的一部分,用 ICMPv6 承载(Type 134)。它解决的问题是:「一台新设备上网,怎么知道自己的地址、网关、DNS、MTU」。

RA(Router Advertisement)是你的「路由器」发的,不是 ISP 发的。

IPv4 没有 RA ,同样的事拆成多个协议拼装: 地址/网关/DNS 靠 DHCP(服务器主动分配)、MAC 解析靠 ARP、MTU 靠 DHCP Option 26(几乎没人用)

RA 之于 IPv6,就像 ARP 之于 IPv4:ARP 广播问 “谁是 192.168.1.1”,这个广播帧也永远出不了你家的二层网络,路由器绝不会把它转发到隔壁网段去问。RA 是同款逻辑的 IPv6 版 “链路内信令”:喊话只在本链路,过路由器即失效。

RA 下发的数据,除了前缀,其他的路由器完全知道,大多数就是路由器自身的一些配置。

如果你使用 VPN / 隧道 等技术,减去封装开销后可能低到 1400~1420

Windows/Linux/macOS 通常还有一层保险,例如 Linux 的 TCP MTU 探测,如果 PMTUD 失效(比如 ICMP 被墙)、连接卡死,系统会主动尝试更小的 MTU,逐步试探直到通。

很多系统/中间设备默认会做 MSS Clamping,直接把 MSS 压到一个保守值,绕开 PMTUD。