转发每一跳要做六件事:收帧、查表、改 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 秒实验
- 用 ping 看返回的 TTL,反推经过几跳。
- 用 traceroute 看路径,数一下有几跳。
- 抓包看同一个包在不同网段的 MAC 是不是不一样。
常见误区
- 以为 IP 会随跳数变化。全程不变。
- 以为 MAC 全程不变。每跳都换。
- 以为 TTL 是时间。它是「还能过几台路由器」。
自测三问(点开对答案)
1. 转发六步里哪一步可能触发广播? —— 查下一跳的 MAC,ARP 表里没有就要发 ARP。 2. TTL 减到 0 会怎样? —— 丢弃并回一个 ICMP 超时报文。 3. 为什么 IP 不变而 MAC 要换? —— IP 是端到端地址,MAC 只在单段链路内有效。下一节:把这些功能合成一张清单,看哪几样非它不可。
- ☐ (本节完,下一节 03.01.04 路由器的功能)