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

转发每一跳要做六件事:收帧、查表、改 TTL、重算校验、查下一跳 MAC、重封装。 IP 全程不变,MAC 每跳都换——这是三层转发最基本的一句。

📝 本节和前面几节的关系

上一节把「选路」与「转发」分开,这一节把「转发」摊开。 02.09.03 讲的是 MAC 模块怎么成帧,这里讲路由器怎么用它。

一、六步

一、收帧:拆掉二层头(原来的源/目的 MAC 没用了)。 二、查表:拿目的 IP 在转发表里做最长匹配。 三、改 TTL:减 1。减到 0 就丢弃并回一个 ICMP 超时。 四、重算校验和:IP 头校验和因为 TTL 变了要重算。 五、查下一跳的 MAC:ARP 表里找,没有就发 ARP。 六、重封装:加新的二层头,源 MAC 是本接口、目的 MAC 是下一跳。

六步里最贵的是第五步——它可能触发一次 ARP 广播。 所以 ARP 表的容量与老化时间会直接影响转发性能。

二、TTL 与 MAC 的两条规律

TTL 存在的唯一目的是防环:以太网帧没有这个字段,IP 包有。 这是三层比二层「耐环」的原因——环上的包会在 TTL 耗尽时被丢掉。

MAC 每跳换、IP 不换:因为 MAC 只在「一段链路」内有效,跨段就要换成下一段的地址。 IP 是端到端的地址。

这一条解释了「为什么 ping 通了但 ARP 表里没有对方」——你看到的 ARP 表里只有「下一跳」的 MAC。

三、动手 Demo:一个包过五跳,每一跳的 TTL 与 MAC

这段模拟五台路由器逐跳转发,打印每一跳的入接口、TTL、下一跳、新目的 MAC。

ttl = 64
for i, (name, port, nxt, mac) in enumerate(hops, 1):
    ttl -= 1
    T([u"%d(%s)" % (i, name), port, u"%d" % ttl, nxt, mac],
      [0, 0, 0, 0, 0])

实跑输出:

--------------------------------------------------------------------
一个包过五跳,每一跳都做了什么
--------------------------------------------------------------------
**转发的过程比想象中琐碎**:查表、改 TTL、重算校验、换 MAC 头。这一节把每一步摊开。

**每一跳的六步**:

1. **收帧**:拆掉二层头(原来的源/目的 MAC 没用了)。
2. **查表**:拿目的 IP 在转发表里做最长匹配。
3. **改 TTL**:减 1。**减到 0 就丢弃并回一个 ICMP 超时。**
4. **重算校验和**:IP 头校验和因为 TTL 变了要重算。
5. **查下一跳的 MAC**:ARP 表里找,没有就发 ARP。
6. **重封装**:加新的二层头,源 MAC 是本接口、目的 MAC 是下一跳。

**跑一遍五跳的过程**:

  跳          进入接口     TTL     下一跳       新目的 MAC
  ------------------------------------------------------------
  1(R1)     Gi0/1        63      10.0.0.2     R2-Gi0/0
  2(R2)     Gi0/0        62      10.0.1.2     R3-Gi0/1
  3(R3)     Gi0/1        61      10.0.2.2     R4-Gi0/0
  4(R4)     Gi0/0        60      10.0.3.2     R5-Gi0/1
  5(R5)     Gi0/1        59      10.0.4.9     服务器网卡

**注意两件事**:

**一、TTL 每跳减 1,从 64 减到 59。**它存在的唯一目的就是「防环」——以太网帧没有 TTL,IP 包有。
**这是三层比二层更「耐环」的原因。**
**二、源/目的 IP 全程不变,但源/目的 MAC 每跳都换。**因为 MAC 只在「一段链路」内有效,
**跨段就要换成下一段的地址。**

**这个「IP 不变、MAC 变」是初学最容易混的一点**,记住一句话就够:
**IP 是端到端的地址,MAC 是逐段的地址。**

TTL 从 64 减到 59,五跳减五次。 如果目的地址不可达、又形成了环,这个包会在 64 跳之后被丢掉并回 ICMP 超时。

「新目的 MAC」那一列每一行都不同——这就是「逐段寻址」。 注意最后一跳的目的 MAC 是「服务器网卡」,因为那是直连的。

还有一步没在表里:重算 IP 头校验和。 它只校验头部(不含数据),所以 TTL 一变就要重算——这也是为什么「三层转发的开销比二层大」: 二层只查表不改字段。

30 秒实验

  1. 用 ping 看返回的 TTL,反推经过几跳。
  2. 用 traceroute 看路径,数一下有几跳。
  3. 抓包看同一个包在不同网段的 MAC 是不是不一样。

常见误区

  1. 以为 IP 会随跳数变化。全程不变。
  2. 以为 MAC 全程不变。每跳都换。
  3. 以为 TTL 是时间。它是「还能过几台路由器」。
自测三问(点开对答案) 1. 转发六步里哪一步可能触发广播? —— 查下一跳的 MAC,ARP 表里没有就要发 ARP。 2. TTL 减到 0 会怎样? —— 丢弃并回一个 ICMP 超时报文。 3. 为什么 IP 不变而 MAC 要换? —— IP 是端到端地址,MAC 只在单段链路内有效。

下一节:把这些功能合成一张清单,看哪几样非它不可。

相关笔记