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

PPPoE 是把 PPP 会话套进以太网帧,代价正好 8 个字节。 1492 与 1452 这两个数字就是这么来的——家用路由器上那个「怪数字」不是厂商的癖好。

📝 本节和前面几节的关系

上一节讲链路层的历史,这一节讲一个还活着的:宽带拨号。 它解释了「能 ping 通但传不了文件」这类最常见的 VPN 与宽带故障。

一、8 个字节是怎么算出来的

PPPoE 头 6 字节:版本类型 1 + 代码 1 + 会话 ID 2 + 长度 2。 PPP 协议号 2 字节。合起来正好 8 字节。

于是 MTU 变成 1500 减 8 等于 1492,MSS 变成 1492 减 20(IP 头)减 20(TCP 头)等于 1452。

链路 MTU MSS


以太网直连 1500 1460 PPPoE 1492 1452 GRE 隧道 1476 1436 IPsec 隧道 1430 1390

二、差 8 个字节,性能差多少

算一下传 1 MB 要多少包:MSS 1460 要 719 个包,MSS 1452 要 723 个。 差 8 个包,约 0.05%。

所以「PPPoE 慢一点」在带宽上几乎看不出来。 真正的问题是「MTU 不一致导致的丢包」——只要链路上有一个环节还是 1500,超出的包就会被丢。

这就是那个经典症状:ping 通、小网页能开、一传大文件就卡住。 因为 ping 默认只有 32 字节,永远碰不到 MTU 上限。

三、现场三条做法

一、PPPoE 环境下把 MTU 设成 1492、MSS 钳制设成 1452。 二、别只改本机——要在路由器上做 MSS 钳制,让它对经过的所有连接生效。 三、测试方法:ping 加「不分片」参数,载荷从 1472 往下降, 降到能通为止,那个值加 28 就是实际 MTU。

这三条能解决现场绝大部分「宽带能上但传不了文件」的故障。 顺序不要颠倒:先算 MTU,再做钳制,最后才怀疑线路质量。

四、拨号接入的另外两种形态

PPPoA:PPP 直接跑在 ATM 上,不需要以太网头,所以没有这 8 字节。多见于早期的 ADSL。 IPoE:不拨号,直接靠 DHCP 拿地址,MTU 就是 1500。今天的千兆宽带越来越多用这种方式, 因为它更简单、开销更小。

所以「宽带一定要拨号」这句话已经不成立:很多新装的宽带是 IPoE,光猫后面直接 DHCP。 排查时先确认接入方式,再谈 MTU。

五、动手 Demo:PPPoE 那 8 个字节,为什么家用路由器 MTU 是 1492

这段拆开 8 字节的构成,算出 1492 与 1452,再按「传 1 MB」比较 MSS 1460 与 1452 各需要多少个包。

P(u"  1500 - 8 = %d" % (1500 - 8))
P(u"  MSS = %d" % (1492 - 20 - 20))
for mss in (1460, 1452):
    P(u"  MSS %d:%d 个包。" % (mss, -(-1048576 // mss)))

实跑输出:

--------------------------------------------------------------------
PPPoE 那 8 个字节,为什么家用路由器 MTU 是 1492
--------------------------------------------------------------------
**PPPoE 是「把 PPP 会话套在以太网帧里」**,所以要多 8 个字节。
这个 8 字节解释了一个很多人困惑的数字:1492。

**8 个字节的构成**:

  6 字节 PPPoE 头(版本类型 1 + 代码 1 + 会话 ID 2 + 长度 2)
  + 2 字节 PPP 协议号 = **8 字节**。

**算 MTU**:物理 MTU 1500 减 8 = **1492**。

**再算 MSS**:MSS = MTU 减 IP 头 20 减 TCP 头 20 = **1452**。

  链路           MTU      MSS      说明
  ----------------------------------------------
  以太网直连     1500     1460     标准值
  PPPoE          1492     1452     宽带拨号
  GRE 隧道       1476     1436     1500 − 24
  IPsec 隧道     1430     1390     1500 − 70

**MSS 差 8 个字节,实际性能差多少?**算一下传 1 MB 要多少包:

  MSS 1460:719 个包。
  MSS 1452:723 个包。

**差 8 个包,也就是 0.05%。**所以「PPPoE 慢一点」在带宽上几乎看不出来,
**真正的问题是「MTU 不一致导致的丢包」**——**那怕只有一个环节是 1500,就会丢包。**

**实践中的三条**:

1. **PPPoE 环境下把 MTU 设成 1492、MSS 钳制设成 1452。**
2. **别只改本机**——要在路由器上做 MSS 钳制,让它对经过的所有连接生效。
3. **测试方法**:`ping -f -l 1472`(不分片、载荷 1472 = 1500 减 28),
**通就说明 1500 没问题;不通就往下降,降到通为止。**

「719 与 723」这两个数是向上取整算的:1 MB 除以 MSS,除不尽就要多一个包。 这 0.05% 的差别在测速软件上根本看不出来。

表里 GRE 与 IPsec 那两行是同一个道理:隧道越厚,MSS 越小。所以「套了两层隧道」的网络, MSS 可能已经被压到 1300 以下,这时候必须显式钳制,否则一定出问题。

最后一段「IPoE 越来越常见」要记住:很多人一遇到「宽带问题」就条件反射改 MTU 1492, 但如果这条宽带是 IPoE,改 1492 反而制造了问题。 先确认接入方式,这是排查的第一步。

30 秒实验

  1. 确认你家宽带是 PPPoE 还是 IPoE 接入。
  2. 用 ping 不分片的方式测出实际 MTU。
  3. 看路由器上有没有 MSS 钳制的配置项。

常见误区

  1. 以为 1492 是厂商随便定的。是 1500 减 PPPoE 的 8 字节。
  2. 以为 PPPoE 会明显变慢。带宽只差 0.05%,问题在丢包。
  3. 以为宽带一定拨号。IPoE 越来越普遍,MTU 就是 1500。
自测三问(点开对答案) 1. PPPoE 的 8 字节由什么构成? —— 6 字节 PPPoE 头(版本类型、代码、会话 ID、长度)加 2 字节 PPP 协议号。 2. PPPoE 下 MSS 应该是多少? —— 1492 减 20 减 20,等于 1452。 3. 为什么「能 ping 通但传不了文件」是 MTU 问题的典型症状? —— ping 默认载荷只有 32 字节,碰不到 MTU 上限,而大包会被丢弃。

下一节:网关坏了怎么办——冗余。

相关笔记