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

一个包跨三个网段,IP 地址一个字节都没变,MAC 地址每一步都换。 「IP 端到端、MAC 逐段」这句话,看完这个走位就再也不会混。

📝 本节和前面几节的关系

03.05.01 把地址分好了,这一节看包怎么用这些地址走。 03.01.02 讲的是「选路与转发」的分工,这一节讲的是「每一跳具体改什么」。

一、每一跳必改三样东西

路由器收到一个包,转发出去之前一定要动三处:

一、源 MAC 换成本接口的;二、目的 MAC 换成下一跳的;三、TTL 减 1。

而 IP 首部里的源地址与目的地址,一个都不动。这就是「端到端」——地址从出发到到达始终是同一对。

TTL 是最容易被忽略的一处:它每跳减 1,减到 0 就丢弃并回一个 ICMP 超时报文。 traceroute 就是靠「故意把 TTL 设成 1、2、3」把这个过程逼出来的。

二、为什么改 MAC 而不改 IP

MAC 只在本地链路有意义:出了这个网段,没人认识这个地址。IP 是全局的:改了就找不到终点。

所以路由器做的是「换信封、不换收件人」:外层信封(MAC)每一站都换新的, 里面的收件人(IP)始终不变。

这也解释了一个常见困惑:「为什么 ping 通了,但 ARP 表里没有对方的地址? 」因为你看到的只有下一跳的 MAC,不是最终目的地的。

三、掩码写错一位,全网都不通

症状极有辨识度:同网段通、跨网段不通,网关也 ping 得通。

原因是主机算错了:它以为对方跟自己同网段,于是直接发 ARP 问「谁是那个地址」。 这个 ARP 广播出不了本网段,所以永远没有回应。

所以排查「能通一部分」的故障,第一件事就是核对掩码。掩码错、网关错、IP 冲突, 这三种占了「部分不通」故障的绝大多数。

四、动手 Demo:一个包从 PC 到服务器,路由与 MAC 各改了什么

这段把两跳的完整走位列出来,逐行对比「源与目的 IP」和「源与目的 MAC」两列,再看掩码写错会怎样。

for host, ip, mac in hops:
    T([host, ip, mac], [0, 0, 0])
P(u"  IP 变了 %d 次,MAC 变了 %d 次。" % (0, len(hops)))

实跑输出:

--------------------------------------------------------------------
一个包从 PC 到服务器,路由与 MAC 各改了什么
--------------------------------------------------------------------
**上一节讲子网,这一节把「一个包怎么跨网段」走完。**重点看「谁改了什么、谁没改什么」。

**场景**:PC(192.168.1.10/24)访问服务器(10.0.0.9/24),中间两台路由器。

  谁(在做什么)            源→目的 IP                  源→目的 MAC
  -------------------------------------------------------------------------------
  PC(发往网关)            192.168.1.10 → 10.0.0.9     PC-MAC → GW1-MAC
  R1(查表到 10.0.1.2)     192.168.1.10 → 10.0.0.9     R1-Gi0/1 → R2-Gi0/0
  R2(查表到 10.0.2.9)     192.168.1.10 → 10.0.0.9     R2-Gi0/1 → 服务器-MAC
  服务器(回包)            10.0.0.9 → 192.168.1.10     服务器-MAC → R2-MAC

**看第二列与第三列的对比**:IP 那一列从第一步到最后一步**完全没变**;MAC 那一列**每一步都换**。

**这就是「IP 端到端、MAC 逐段」的具体样子。**记住它,
就不会再问「为什么 ping 通了但 ARP 表里没有对方的地址」——
**你看到的 ARP 表里只有「下一跳」的 MAC,不是最终目的地的。**

**还有一件事值得算**:如果 PC 的掩码写错成 /16,会发生什么?

  PC 会认为 10.0.0.9 是「同网段」,于是直接发 ARP 问「谁是 10.0.0.9」。
  这个 ARP 广播出不了本网段,**所以永远没有回应。**
  表现是「ping 不通,但网关能通、别的网段也能通」。

**这就是掩码写错最典型的症状**:**跨网段不通而同网段正常**。排查时第一件事就是看掩码。

两列对比就是这一节的全部:IP 列从头到尾一样,MAC 列每一行都不一样。

表里没画 TTL,但每一跳都减 1。 一个包的 TTL 是 64 的话,最多走 64 跳——这既是防环,也是「网络直径」的硬上限。

掩码写错那段建议亲手验一遍:把一台机器的掩码从 /24 改成 /16, 你会看到「能 ping 网关、能 ping 同网段、就是 ping 不通外网」——这个症状记住一次, 以后一眼就能认出来。

30 秒实验

  1. 在电脑上 ping 一下网关,再用 arp -a 看表里存的是谁的地址。
  2. 用 tracert 看一个外网地址,数一下经过几跳。
  3. 抓一个包看 TTL 字段,确认它每跳减 1。

常见误区

  1. 以为路由器会改目的 IP。改的是 MAC,IP 不动。
  2. 以为 ARP 表里存的是最终目的地。只有下一跳。
  3. 以为掩码错了就「全不通」。典型是「同网段通、跨网段不通」。
自测三问(点开对答案) 1. 路由器转发时哪三样东西必改? —— 源 MAC、目的 MAC、TTL。IP 地址不动。 2. 为什么不能靠改 IP 来转发? —— IP 是端到端的全局标识,改了就找不到终点。 3. 掩码写错最典型的症状是什么? —— 同网段通、跨网段不通,网关能 ping 通。

下一节:路由器凭什么知道「下一跳是谁」——看路由表。

相关笔记