一个包跨三个网段,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 秒实验
- 在电脑上 ping 一下网关,再用 arp -a 看表里存的是谁的地址。
- 用 tracert 看一个外网地址,数一下经过几跳。
- 抓一个包看 TTL 字段,确认它每跳减 1。
常见误区
- 以为路由器会改目的 IP。改的是 MAC,IP 不动。
- 以为 ARP 表里存的是最终目的地。只有下一跳。
- 以为掩码错了就「全不通」。典型是「同网段通、跨网段不通」。
自测三问(点开对答案)
1. 路由器转发时哪三样东西必改? —— 源 MAC、目的 MAC、TTL。IP 地址不动。 2. 为什么不能靠改 IP 来转发? —— IP 是端到端的全局标识,改了就找不到终点。 3. 掩码写错最典型的症状是什么? —— 同网段通、跨网段不通,网关能 ping 通。下一节:路由器凭什么知道「下一跳是谁」——看路由表。
- ☐ (本节完,下一节 03.05.03 路由表)