📡 第三章 路由器和它庞大的功能
📄 一句话概括

隧道的本质是「把整个包当载荷再包一层」,代价是字节与 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 秒实验

  1. 看你电脑网卡的 MTU 是多少,PPPoE 拨号的一般是 1492。
  2. ping 一个外网地址,加上 -f -l 参数试出「不分片能过的最大包」。
  3. 算一下:这个最大值加 28,是不是正好等于 MTU。

常见误区

  1. 以为 MTU 永远是 1500。PPPoE 是 1492,各种隧道更小。
  2. 以为改本机 MTU 就能解决所有问题。对面也要改,MSS 钳制更彻底。
  3. 以为 ICMP 拦了没关系。拦了「需要分片」报文,PMTUD 就废了。
自测三问(点开对答案) 1. PPPoE 的 8 字节额外开销是怎么来的? —— 6 字节 PPPoE 头加 2 字节 PPP 协议字段。 2. GRE 与 IPsec 相比,多出的能力是什么? —— GRE 能承载组播与广播,IPsec 不能。 3. MSS 钳制为什么比改 MTU 更有效? —— 它在隧道口改写经过的每条 TCP 连接,不依赖 ICMP 错误报文。

下一节:一对多的送法——IP 多播。

相关笔记