隧道会丢弃大流量却能通 ping,于是建议来得很快:把 MTU 调低。这个修法有时有效,随后就被套用到每个网络上的每个配置。正是从这一刻起,一次有针对性的修复变成了长期的性能税。真正该做的比较,是路径的真实上限与把每个包都压到它之下的代价。

调低 MTU 时究竟缩小了什么

每个包在承载你的数据之前先承载报头。在 1500 字节的以太网路径上,IPv4 与 TCP 占去 40 字节,留给载荷 1460 字节;封装又在外面叠加 IP、UDP 与隧道报头,于是内部载荷预算再次下降。调低接口 MTU,就是有意缩小这份预算。

开销与包的数量成正比,与字节数无关。同一个文件拆成更多包,路径上的每台设备都要处理更多中断、更多路由决策和更多逐包处理。在一台已经接近每秒包数上限的路由器上,这是实打实的变慢,而不是四舍五入的误差。即使传输本身成功,代价依然存在。

所以更小的 MTU 是对约束的绕行,而不是通用优化。它用可靠性换取对无法承载更大帧的路径的适配,却让本不需要缩小的每个包都付出了额外开销。

什么时候更小的 MTU 才是正确的修复

典型症状很具体:TCP 握手完成,小响应能收到,而较大的下载会卡住或重置。带禁止分片位、1472 字节的 ping 失败,而 1400 字节的 ping 成功,这说明路径无法承载满尺寸数据包,也没有回送那条本应告诉发送方缩小分片的 ICMP 消息。

路径 MTU 发现依赖那些 ICMP 需要分片消息。防火墙把它们丢掉时,发送方会不断重试大包,连接看起来就像挂住了。在隧道一侧调低 MTU 可以避开这次重试,对那个网络而言这是合理的修复。

接入技术也各有上限:PPPoE 通常封顶在 1492,部分移动与 DSL 路径更低,嵌套隧道会把开销扣两次。要测量真实路径,而不是从指南里抄一个数字;并记住 IPv6 要求承载它的每条链路至少有 1280 字节的 MTU,如 RFC 8200 所规定。

改动一个控制项之前,先比较三个

MTU、MSS 与分片是不同层次上的不同控制项,改错了一个,症状仍会留在原处。

ControlLayerWhat it changesWhere it misleads
Interface MTUIP linkLargest frame the interface will sendPenalizes every protocol, not just the one that failed
TCP MSS clampTCPSegment size advertised in the handshakeLeaves UDP and QUIC untouched
DF and fragmentationIPWhether a router may split a packetCan break path MTU discovery and security assumptions
Tunnel overheadEncapsulationInner MTU after outer headersMismatch shows up only for large inner packets

限制 MSS 往往是最小侵入的修复,因为它只影响 TCP,把接口留给其他流量。更低的接口 MTU 覆盖面更广、更容易推演,所以在家用路由器上很常见,但它让每个协议都为一个协议的问题买单。

关闭禁止分片的行为,等于允许分片来掩盖症状;它通常会让延迟更糟,同时破坏本可以找到正确尺寸的反馈。不要把它当作长期修复。

要衡量权衡,而不是只看一个数字

用禁止分片探测找出路径上限:从较大的值开始,逐步下调,直到收到回应:

ping -M do -s 1472 203.0.113.10
ping -M do -s 1400 203.0.113.10
tracepath 203.0.113.10

然后在两种设置上比较真实任务:同一个文件传输、同一个端点、同一个网络。记录完成时间与重传次数,例如用 nstat -az TcpRetransSegs,并留意设备 CPU(若隧道终结在小路由器上)。短时间的合成吞吐测试可能错过几兆字节之后才出现的停顿。

缩小之后包计数会上升,因为同一次传输现在用了更多包。这是预期之内,并不能证明吞吐更高。要比较完成的应用数据量、重传次数与响应性,而不只是包速率。

分阶段引入改动,并把范围收窄

记录原始值,只改一个控制项,在长期保留之前重复测量。如果证据显示没有收益,就用当初设置时用的同一条接口命令恢复原值:

ip link set dev wg0 mtu 1420
ip link set dev wg0 mtu 1500

把结果限定在真正需要它的网络上。一个必须在酒店 Wi-Fi、手机热点和办公 LAN 上工作的配置,不应继承其中任何一个所需的最低值,除非客户端无法探测路径。

正确的值是路径上能存活的 MTU 最大值,而不是让症状消失的最小值。记录路径、探测结果与回滚步骤,并在接入网络变化时重新审视这项设置。

相关文章