IP 是逻辑编号、MAC 是出厂编号,两者靠 ARP 临时绑在一起,只在本地有效。 一个 /24 网段里,交换机要学 254 条 MAC 表项,路由器只要一条路由。
4.1.1 讲了「谁管哪一段」,这一节讲「两套编号怎么对上」。 3.2.1 讲 MAC、4.3 讲 IP,ARP 就是它们之间的那根针。
一、两套编号
把两者的属性摆在一起,差异立刻就清楚了:
| 项目 | IP 地址 | MAC 地址 |
|---|---|---|
| 性质 | 逻辑,可改 | 出厂,不可改 |
| 范围 | 整个互联网 | 只有本段链路 |
| 谁分配 | 管理员或运营商 | 厂商 |
| 长度 | 32 位 | 48 位 |
第一行是本质差别:笔记本从公司带回家,IP 变了、MAC 不变。 所以「靠 IP 找人」和「靠 MAC 找人」是两个不同的问题——前者会变,后者跟着硬件走。 第四行那个「MAC 比 IP 长」也值得想一下: 48 位比 32 位长,但 MAC 只用来区分「同一段链路上的设备」,而 IP 要区分「全球所有设备」。 位数和管辖范围不成正比,是因为「编号体系」不同—— MAC 是「谁都能领一段、永不重复」,IP 是「按拓扑分层」。
二、ARP 把它们临时绑起来
发送一个包时,IP 已经有了,缺的是「下一个设备的 MAC」:这个过程就是 ARP,规则只有三条:
| 情况 | 怎么做 |
|---|---|
| 表里有 | 直接用,不打扰任何人 |
| 表里没有 | 广播问一句「谁的 IP 是 X」 |
| 问到了 | 对方单播回自己的 MAC,写进表 |
第二行那个「广播」是有代价的:整个广播域里每一台设备都要收下这个帧、看一眼、再丢掉。 所以 ARP 表有缓存时间(通常几分钟到几十分钟),不能每次都问。 这也解释了「刚换 IP 后一段时间上不了网」的现象——别人的 ARP 缓存里还是旧的那一条。 算一下这张表要多大:一个 /24 网段最多 254 台设备,所以一台主机的 ARP 表最多几百条, 而交换机的 MAC 表也是几百条。 数量级一样,因为两者都是「一个广播域内的设备数」。
三、为什么 MAC 不能当全球地址
假设全世界都用 MAC 寻址,路由器会面对什么:
| 方案 | 路由表条目 |
|---|---|
| 用 MAC 寻址 | 每一块网卡一条,几十亿条 |
| 用 IP 寻址 | 按前缀聚合,几十万条 |
第一行的「几十亿条」不是夸张:MAC 是平铺的,两个相邻的 MAC 可能属于地球两端的设备, 没有任何「相邻性」可以利用。 而 IP 的前缀意味着「这一大片都往这个方向走」—— 一条 2000 条的表就能覆盖整个互联网,靠的就是这个。 所以「MAC 不能当全球地址」不是因为它短 (48 位其实比 32 位还长),是因为它「不可聚合」。 这也解释了 IPv6 为什么坚持「前缀 + 接口标识」的结构—— 哪怕地址长到 128 位,聚合能力仍然是它的命根子。 最后说一句「两套编号为什么都要有」:MAC 解决「这块网卡是谁」,IP 解决「这台机器在哪」。 前者跟着硬件走,后者跟着位置走——一个人可以换住址,但不能换指纹。
四、动手 Demo:一个 /24 里,IP 和 MAC 是两套编号
算一个 /24 网段里两套编号的规模,再看它们各自的属性。 注意:交换机学 254 条,路由器只要一条。
import ipaddress
net = ipaddress.ip_network('192.168.3.0/24')
print('网段 %s:共 %d 个地址,可用主机 %d 台'
% (net, net.num_addresses, len(list(net.hosts()))))
print('交换机要学 %d 条 MAC 表项' % len(list(net.hosts())))
print('路由器只要 1 条:192.168.3.0/24 走这个口')
实跑输出:
--------------------------------------------------------------------
一个 /24 里,IP 和 MAC 是两套编号
--------------------------------------------------------------------
**同一段局域网里,IP 地址是「逻辑编号」、MAC 是「出厂编号」。**
**两者靠 ARP 临时绑在一起,而且只在本地有效。**
**网段 192.168.3.0/24 一共 256 个地址,可用主机 254 台**
**交换机要为这 254 台各学一条 MAC 表项**,
**而路由器只需要一条「192.168.3.0/24 走这个口」的路由。**
项目 IP 地址 MAC 地址
---------------------------------------------------------
**编号性质** **逻辑,可改** **出厂,不可改**
**作用范围** **整个互联网** **只有本段链路**
**谁分配** **管理员或运营商** **厂商**
**长度** **32 位** **48 位**
**第一行是本质差别**:**IP 可以随地点改(笔记本从公司带回家就换一个),MAC 不能。**
**所以「靠 IP 找到人」和「靠 MAC 找到人」是两件事**——**前者会变,后者跟着硬件走。**
**第二行解释了为什么 MAC 不能当全球地址用**:
**MAC 是「平铺」的,没有层次,路由器无法靠它聚合出「一大片去哪儿」。**
**IP 有前缀,才能「一条路由代表一片网络」。**
「254 条对 1 条」这个对比是整个分层的价值所在: 交换机的表随设备数线性增长,路由器的表随网段数增长。 一个公司有一万台设备,可能只有几十个网段—— 这就是为什么「网络能扩展到全球」而「局域网只能到几千台」。 ARP 有个安全隐患值得知道:它没有任何认证,谁回得快就信谁(叫 ARP 欺骗)。 所以「同一个局域网里有人能冒充网关」这件事,是协议本身允许的。 防范办法是在交换机上做「端口绑定 MAC」或者用动态 ARP 检测。 IPv6 里 ARP 被换成了 NDP(邻居发现), 走的是 ICMPv6 的多播,而不是广播——这一个改动把「ARP 广播打扰全网」的问题解决了, 因为多播只送给我们关心的人。
30 秒实验
- 算一下:一个 /16 网段里,交换机的 MAC 表最多要多大?
- 想一下:为什么 ARP 表要有缓存时间,不能永久保留?
- 在你电脑上敲 arp -a,看现在缓存了几条。
常见误区
- 以为「MAC 比 IP 短所以只能管本地」。 MAC 是 48 位,比 IP 长, 管本地是因为它「不可聚合」。
- 以为「ARP 是路由协议」。 它只解析「同一段链路上」的 MAC,跨网段要找路由器。
- 以为「两套编号有一个是多余的」。 一个跟硬件走、一个跟位置走,职责不同。
自测三问(点开对答案)
1. IP 和 MAC 最本质的差别是什么? —— **IP 是逻辑的、可随位置改;MAC 是出厂的、跟硬件走。** 2. ARP 在做什么? —— **把「下一跳的 IP」翻译成「下一跳的 MAC」**,靠广播问、单播答、结果缓存。 3. 为什么路由器不能只用 MAC 寻址? —— **MAC 没有层次、不可聚合**,路由表会有几十亿条。下一节回答一个更基础的问题:为什么 IP 地址属于网络层。
- ☐ (本节完,下一节 4.2.1 IP地址属于网络层地址)