首页
/
协议原理
/

隧道里的 MTU 与 MSS:为什么 VPN 下大包总是卡住

协议原理

隧道里的 MTU 与 MSS:为什么 VPN 下大包总是卡住

小页面正常、大页面和 HTTPS 握手卡住,多半是 MTU 问题。本文解释隧道封装如何压缩可用 MTU、为什么路径 MTU 发现会失效,以及怎么算值、怎么修。

隧道里的 MTU 与 MSS:为什么 VPN 下大包总是卡住 封面

MTU 是一条链路一次能传送的最大 IP 包大小,以太网通常是 1500 字节。VPN 隧道会把原始包再包一层新的头部,内层包能用的空间就被挤小了。这个差值处理不好,就会出现“小网页能打开、大网页和 HTTPS 握手卡住”的典型症状。

封装后包为什么装不下
封装后包为什么装不下

封装开销怎么算

每种隧道都要在内层包前面加头部。WireGuard 在 IPv4 上的开销是 60 字节(20 字节 IP 头、 8 字节 UDP 头、 32 字节 WireGuard 头和认证标签),在 IPv6 上是 80 字节。内层 MTU 的上限就是外层链路 MTU 减去这个开销。默认值 1420 是按 1500 减 80 预留的,保证外层是 IPv4 或 IPv6 都能用。

MSS 和 MTU 有什么关系

MSS 是 TCP 在握手时宣布的最大段长度,大致等于 MTU 减去 20 字节 IP 头和 20 字节 TCP 头。MTU 管的是任何 IP 包的大小,MSS 只管 TCP。把 MSS 调小可以让 TCP 主动发更小的包,绕开分片问题,但对 UDP 没有帮助。

WireGuard 内层 MTU 上限
WireGuard 内层 MTU 上限

PMTUD 黑洞是怎么回事

大包超过链路 MTU 且设置了不分片标志(DF)时,路由器会丢弃它并回一个 ICMP “需要分片”消息,发送方收到后把包变小,这个过程叫路径 MTU 发现。如果中间某台防火墙把 ICMP 整个丢了,发送方永远收不到这个消息,表现就是大包永远发不过去,小包却一切正常。

为什么 HTTPS 尤其容易受影响

TLS 握手里的证书消息往往超过一个包。小的 HTTP 请求能过,证书链这样的大包被丢弃,页面就一直卡在“正在连接”。

UDP 大包怎么办

MSS 钉制帮不了 UDP。DNS 的大响应和 QUIC 要靠降低隧道 MTU,让内层根本不产生超长的包。

修法和验证

两种常用的修法:直接把隧道网卡的 MTU 调小,或在转发路径上做 MSS 钉制。后者的 iptables 写法如下:

iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

验证方法是用带不分片标志的 ping 探测路径:Linux 用 ping -M do -s 1372 8.8.8.8,Windows 用 ping -f -l 1372 8.8.8.8,数值逐步减小直到能通。用探测到的最大负载加 28 得到路径 MTU,再减去隧道开销就是应该设置的内层 MTU。

两种修法的对照

方式影响范围适合场景
调小隧道 MTU所有流量,包括 UDP终端设备或单一隧道
MSS 钉制只影响经过的 TCP网关、路由器批量处理
修复被丢弃的 ICMP源头解决 PMTUD能控制中间防火墙时
MTU
MSS
PMTUD
隧道
WireGuard

相关文章

链路笔记

链路笔记:分享网络与隐私工程的实践笔记,涵盖协议原理、加密与隐私、连接排错与性能调优。

© 2026 链路笔记