📚 第五章 IP协议相关技术
📄 一句话概括

MAC 没有层级,只能一人一条记录;IP 有层级,能按前缀聚合。 所以「只用 MAC」在路由上根本行不通,而「只用 IP」在链路上发不出去。

📝 本节和前面几节的关系

5.3.1 讲了「IP 变 MAC」,这一节回答「为什么不能只留一个」。 4.4.2 的「路由聚合」是这里的反面对照。

一、如果只用 MAC

最直接的问题是「路由表存不下」:MAC 是 48 位随机数,没有「哪一段属于哪个网络」这种结构。

项 IP 地址 MAC 地址
结构 网络部分加主机部分 前 24 位厂商、后 24 位序号
能否聚合 能,一条 /8 顶一片 不能,只能逐条
表的大小 百万条量级 几十亿条

第二行是关键:IP 能聚合,是因为「同一片地址在物理上也常在一起」; MAC 完全随机,前 24 位只说明厂商,不说明位置。 所以「一台设备搬到另一个城市」,它的 MAC 一点变化都没有——这在路由上是灾难。 这也是「IP 地址必须跟着位置走」的根本原因:只有「位置信息」才能被聚合。

二、如果只用 IP

另一个方向也不行:网卡发帧时,帧头里必须填一个 48 位的 MAC, 这个字段是硬件规定的,不能填 IP。

层 帧头/包头里要什么 能不能改
链路层 源 MAC、目的 MAC 硬件规定,不能改
网络层 源 IP、目的 IP 软件填,可改

第一行「硬件规定」不是借口,是现实:以太网标准就是这么定的, 换协议要换硬件,成本高到不可能。 所以「两个地址都留」不是设计者偷懒: 它是「两种介质的接口」和「上层的可聚合寻址」两个需求的交集。 一个负责「在网里送到」,一个负责「找到哪张网」。

三、三句话总结

第一句:IP 管「方向」,MAC 管「交付」。 第二句:IP 会变,MAC 不变——所以 IP 能聚合,MAC 不能。 第三句:跨网段时,MAC 只在这一跳有效,每过一台路由器就换一次。

位置 源 MAC 目的 MAC
主机 A → 路由器 A 的 MAC 路由器的 MAC
路由器 → 服务器 路由器的 MAC 服务器的 MAC

同一个包,MAC 换了一次,IP 一直没变。这就是「第 2 层管一跳、第 3 层管全程」的具体样子。 理解这一点,就理解了「为什么抓包看到的源 MAC 一直在变」——那正是路由器在干活。

四、动手 Demo:IP 和 MAC,一个都不能少

把两个地址的五个维度并排列出来,再读一次本机的实际值。 注意第三行和第五行:一个是「会变」,一个是「不能聚合」。

import subprocess
out = subprocess.run('ipconfig /all', shell=True,
                     capture_output=True).stdout.decode('gbk')
for ln in out.split('\n'):
    s = ln.strip()
    if s.startswith('IPv4') or s.startswith('物理地址'):
        print(s)

实跑输出:

--------------------------------------------------------------------
IP 和 MAC,一个都不能少
--------------------------------------------------------------------
**两个地址,两种命运**:**MAC 焊在网卡上跟着硬件走,IP 配在系统里跟着位置走。**

  项               IP 地址                    MAC 地址
  -------------------------------------------------------------------
  **长度**         **32 位**                  **48 位**
  **谁分配**       **按位置分配**             **出厂烧录**
  **会变吗**       **换个网络就变**           **基本不变**
  **作用范围**     **全程有效**               **只在一跳内有效**
  **层级**         **有网络部分,能聚合**     **没有层级,不能聚合**

**第五行是「为什么不能只用 MAC」的核心答案**:**MAC 没有结构,路由器无法「按前缀转发」。**
**全球几十亿个 MAC,只能一人一条记录,表根本存不下**;
**而 IP 有网络部分,一条 /8 就能代表一千六百万个地址。**

**实测本机这两个值**:
**IP 是 192.168.3.152(首选),MAC 是 28-F1-0E-18-FA-25**
**这两个值一个是「逻辑位置」,一个是「物理身份」**——
**换一个 Wi-Fi,IP 变、MAC 不变,这就是最直观的证明。**

**「缺一不可」的准确含义是**:**IP 负责「找到哪张网」,MAC 负责「在网里找到哪块网卡」。**
**一个管方向,一个管交付。**

读到的 IP 和 MAC 就是「同一个接口的两个身份」:换一个 Wi-Fi,IP 变、MAC 不变, 这是最直观的证明。 「MAC 基本不变」这句话有例外:手机和笔记本都支持「随机 MAC」, 连公共 Wi-Fi 时会随机生成一个,防止被追踪。 所以「MAC 是设备的唯一身份」这个说法在今天已经不成立。 最后那句「IP 管方向、MAC 管交付」可以拿去解释很多现象: 比如「为什么换网络要改 IP」(方向变了)、「为什么 MAC 冲突会时通时不通」(交付错了)。 两个地址各管一段,故障也就分成了两类。

30 秒实验

  1. 算一下:全球 80 亿台设备,每个一条路由要多少条?
  2. 想一下:为什么 MAC 不能聚合?
  3. 想一下:手机随机 MAC 对网络管理有什么影响?

常见误区

  1. 以为「有 IP 就够了」。 链路层发帧必须填 MAC,硬件规定。
  2. 以为「MAC 是永久的设备身份」。 现在可以随机,手机默认就这么干。
  3. 以为「一个包从头到尾 MAC 不变」。 每过一台路由器就换,变的只是这一跳。
自测三问(点开对答案) 1. 为什么不能只用 MAC 地址通信? —— **MAC 没有层级,无法聚合**,路由表会膨胀到几十亿条。 2. 为什么不能只用 IP 地址? —— **以太网帧头必须填 48 位 MAC**,这是硬件规定,改不了。 3. 一个包跨网段传输时,MAC 会变几次? —— **每过一台路由器变一次**,IP 头不变。

下一节讲一个「反过来的 ARP」:RARP。

相关笔记