隧道的本质是「把整个包当载荷再包一层」,代价是字节与 MTU。 PPPoE 的 1492 不是随便定的:1500 减 8,这就是家用路由器上那个数字的来历。
前四节讲「怎么把包送到正确的下一跳」,这一节讲「怎么让包走过不该走的路」。 隧道是 VPN 的实现基础,也是「能 ping 通但网页打不开」这类故障的源头。
一、几种封装的额外开销
隧道就是在原包前面再套一个 IP 头,所以必然多占字节。多少取决于封装方式。
封装 额外字节 典型用途
GRE 24 隧道、组播穿透 IP-in-IP 20 简单隧道 IPsec 传输模式 约 50 端到端加密 IPsec 隧道模式 约 70 站点间 VPN VXLAN 50 数据中心 PPPoE 8 宽带拨号
GRE 的 24 字节是「外层 IP 20 加 GRE 头 4」,它的价值在于「能承载组播与广播」——IPsec 不行, 所以「先 GRE 再 IPsec」是站点间 VPN 的经典组合。
二、算实际可用 MTU
物理 MTU 是 1500,减去封装开销就是隧道里的可用 MTU。
GRE:1500 − 24 = 1476。IPsec 隧道:1500 − 70 = 1430。VXLAN:1500 − 50 = 1450。 PPPoE:1500 − 8 = 1492。
1492 这个数字要记住:它是宽带拨号的「事实 MTU」, 所以家用路由器的 MTU 一栏默认写 1492 而不是 1500。很多人把它当成厂商的怪癖, 其实是 PPPoE 的 8 字节头在吃。
三、不调 MTU 会怎样
1500 字节的包进隧道变成 1524,超过物理 MTU,只有两条路:分片,或丢弃。
分片:性能下降,而且丢一片就整包重传——隧道里最怕这个。 丢弃并回一个 ICMP「需要分片」报文:这是正确做法,但很多防火墙把 ICMP 全拦了, 于是发送方永远学不会。
症状就是那句经典描述:「能 ping 通、小网页能开、一传文件就卡死」。因为 ping 的包小(默认 32 字节),永远碰不到 MTU 上限。
四、MSS 钳制为什么比改 MTU 有效
改 MTU 只影响本机发出的包。 MSS 钳制是在隧道口改写经过的 TCP 握手包, 让「客户端与服务端」都按小包发——影响的是每一条连接。
做法:在隧道接口上把 MSS 改成「MTU 减 40」(IPv4 头 20 加 TCP 头 20), 这样 TCP 自己就不会发超过隧道容量的段。
这是 VPN 现场最常用的一招, 而且它绕开了 ICMP 被拦的问题——不需要任何设备回错误报文,握手的阶段就把尺寸谈好了。
五、动手 Demo:隧道封装要吃掉多少字节,MTU 怎么算
这段列出六种封装的额外字节与用途,再按物理 MTU 1500 逐个算出隧道内可用 MTU,并标出 PPPoE 的 1492。
for name, over in encap:
T([name, u"%d" % over, u"%d" % (1500 - over)], [0, 0, 0])
实跑输出:
--------------------------------------------------------------------
隧道封装要吃掉多少字节,MTU 怎么算
--------------------------------------------------------------------
**隧道的本质是「把整个包当载荷再包一层」**,所以必然多占字节。这一节把这笔开销算清。
**几种常见封装的额外开销**:
封装 额外字节 加在哪 典型用途
------------------------------------------------------------------------------------------
GRE 24 外层 IP 20 + GRE 4 隧道、组播穿透
IP-in-IP 20 外层 IP 20 简单隧道
IPsec 传输模式 约 50 ESP 头尾+认证 端到端加密
IPsec 隧道模式 约 70 新 IP 头+ESP 站点间 VPN
VXLAN 50 外层 IP 20+UDP 8+VXLAN 8+内层 14 数据中心
PPPoE 8 6 字节头+2 字节 PPP 宽带拨号
**算实际可用 MTU**:物理 MTU 1500,减去封装开销:
GRE:1500 − 24 = 1476 字节。
IPsec 隧道:1500 − 70 = 1430 字节。
VXLAN:1500 − 50 = 1450 字节。
PPPoE:1500 − 8 = 1492 字节。
**PPPoE 的 1492 这个数字要记住**:它是宽带拨号的「事实 MTU」,
**所以家用路由器的 MTU 一般写 1492 而不是 1500。**
**如果没调 MTU 会怎样**:1500 字节的包进隧道变成 1524,超过物理 MTU,**要么分片、要么丢弃。**
· **分片**:性能下降,而且丢一片就整包重传。
· **丢弃并回 ICMP「需要分片」**:这是正确做法,**但很多防火墙把 ICMP 拦了**,
于是发送方永远学不会,**表现为「能 ping 通、网页打不开」**。
**「TCP MSS 钳制」就是治这个的**:在隧道口把 MSS 改成「MTU 减 40」,让 TCP 自己就发小包,
不用等 ICMP。
**这是 VPN 现场最常用的一招,而且它比「改 MTU」更有效**——因为改 MTU 只影响本机,
MSS 钳制影响经过的每一条连接。
表里最该记住的是 PPPoE 那 8 字节:它小得不起眼, 但它解释了一个所有人都会遇到的现象——为什么换成光纤拨号之后,某些老设备的 MTU 要手动改成 1492。
IPsec 的 70 字节是「隧道模式 + ESP + 认证」的总和,实际值会随加密算法与认证方式浮动。 所以工程上不要死记 70,要按「留 80 字节余量」来规划。
MSS 钳制这一段是本节最实用的: 遇到「能 ping 通但传不了文件」,先查 MTU,再上 MSS 钳制。这个顺序能解决现场绝大部分 VPN 故障。
30 秒实验
- 看你电脑网卡的 MTU 是多少,PPPoE 拨号的一般是 1492。
- ping 一个外网地址,加上 -f -l 参数试出「不分片能过的最大包」。
- 算一下:这个最大值加 28,是不是正好等于 MTU。
常见误区
- 以为 MTU 永远是 1500。PPPoE 是 1492,各种隧道更小。
- 以为改本机 MTU 就能解决所有问题。对面也要改,MSS 钳制更彻底。
- 以为 ICMP 拦了没关系。拦了「需要分片」报文,PMTUD 就废了。
自测三问(点开对答案)
1. PPPoE 的 8 字节额外开销是怎么来的? —— 6 字节 PPPoE 头加 2 字节 PPP 协议字段。 2. GRE 与 IPsec 相比,多出的能力是什么? —— GRE 能承载组播与广播,IPsec 不能。 3. MSS 钳制为什么比改 MTU 更有效? —— 它在隧道口改写经过的每条 TCP 连接,不依赖 ICMP 错误报文。下一节:一对多的送法——IP 多播。
- ☐ (本节完,下一节 03.05.08 IP多播)