MAC 靠「分配」保证唯一,IP 靠「管理」保证唯一。 MAC 跟着网卡走,IP 跟着位置走——所以「按 IP 认人」不靠谱。
1.7 讲完了「传给谁」的三种方式,1.8 讲「那个『谁』怎么表示」。 这一节讲唯一性,1.8.2 讲层次性——两者是地址的两个维度。
一、两种地址,两种唯一
都要求唯一,但「在什么范围内唯一」完全不同:
| 对比项 | MAC 地址 | IP 地址 |
|---|---|---|
| 长度 | 48 位(6 字节) | 32 位(IPv4) |
| 谁保证唯一 | IEEE 分配 + 厂商编号 | 人工或 DHCP 分配 |
| 范围 | 一个广播域内 | 一个网段内 |
| 可变性 | 出厂定死 | 换网络就换 |
第二行是两者的根本差别: MAC 的唯一性是「发证」发出来的——前 3 字节由 IEEE 分配给厂商,后 3 字节由厂商自己编号。 IP 的唯一性是「管理」管出来的——同一个网段不能有两个相同 IP,这是人或者 DHCP 服务器的职责。 第四行决定了两者的用途: MAC 是「这台设备」的标识,跟着硬件走;IP 是「这个位置」的标识,换了网络就得换。 所以服务器要固定 IP,笔记本不需要——前者要当「位置」,后者只需当「设备」。
二、MAC 的唯一性有多硬
理论很硬,实际有软的地方:
| 情形 | 唯一性 | 说明 |
|---|---|---|
| 正规网卡 | 全球唯一 | OUI 由 IEEE 发证 |
| 虚拟网卡 | 本地管理 | 第二位是 2、6、A、E |
| 手动改 MAC | 可以重复 | 改 MAC 是网卡常规功能 |
第二行那个「第二位」是判断依据:MAC 第一个字节的次低位是「本地管理位」,
置 1 就表示「这个地址不是 IEEE 发的,是软件生成的」。
虚拟网卡、随机化 MAC 全都落在这条规则里。
所以看到 9E、AE 开头就该想到「这是本地管理的」。
第三行说明了唯一性的真实边界:「全球唯一」只在「没人故意改」的前提下成立。
而唯一性真正起作用的范围只有「一个广播域」——跨了路由器,MAC 就被换掉了,重复也不影响。
所以 MAC 唯一性不是安全机制,这也是 802.1X 认证存在的原因。
三、IP 冲突的典型表现
两个设备配了同一个 IP,症状很有辨识度:
| 症状 | 原因 |
|---|---|
| 时通时断 | 两个设备轮流应答 ARP |
| ARP 表里同 IP 两个 MAC | 来回被覆盖 |
| 日志报地址冲突 | 系统自己检测到了 |
第一行是最典型的:别人问「谁是 192.168.3.100」,两台机器都答,
于是发出去的包一半去 A、一半去 B。
表现就是「一会儿能连、一会儿不能」。
第二行是确认手段:用 arp -a 反复看同一个 IP 对应的 MAC 变不变,变了就是冲突。
这比 ping 更直接,因为 ping 通不通还受别的因素影响。
所以「按 IP 认人」这件事在安全上是不成立的:IP 可以随便配,MAC 可以随便改。
真正的身份认证必须靠凭据(证书、口令、802.1X),而不是靠地址。
这一点在写访问控制规则时尤其重要。
四、动手 Demo:地址的唯一性,MAC 与 IP 各管一段
把本机所有网卡的 MAC、OUI、性质列出来。 重点看「本地管理」那几行是怎么认出来的。
import socket, psutil, _netsim as N
print('%-16s %-20s %-10s %s' % ('接口', 'MAC', 'OUI', '性质'))
print('-' * 70)
for name, addrs in psutil.net_if_addrs().items():
for a in addrs:
if a.family == psutil.AF_LINK:
mac = a.address.replace(':', '-').upper()
print('%-16s %-20s %-10s %s'
% (name[:16], mac, N.oui(mac), N.mac_kind(mac)))
实跑输出:
--------------------------------------------------------------------
地址的唯一性,MAC 与 IP 各管一段
--------------------------------------------------------------------
**两种地址都要求唯一,但「在什么范围内唯一」完全不同。**
接口 MAC OUI(前 3 字节) 性质
---------------------------------------------------------------------------
WLAN 9C-B6-D0-0D-D5-0F 9C-B6-D0 单播/全球唯一
以太网 28-F1-0E-18-FA-25 28-F1-0E 单播/全球唯一
本地连接* 1 9E-B6-D0-0D-D5-0F 9E-B6-D0 单播/本地管理
本地连接* 2 AE-B6-D0-0D-D5-0F AE-B6-D0 单播/本地管理
蓝牙网络连接 9C-B6-D0-0D-D5-10 9C-B6-D0 单播/全球唯一
**MAC 的唯一性靠「分配」保证**:**前 3 字节由 IEEE 分配给厂商,后 3 字节由厂商自己编号。**
**所以理论上全球不会有重复**——**但实际上「改 MAC」是网卡的常规功能**,
唯一性只在一个广播域内有意义。
**IP 的唯一性靠「管理」保证**:**同一个网段里不能有两个相同的 IP,这是人工或 DHCP 分配的职责。**
**冲突的表现很典型**:时通时断、ARP 表里同一个 IP 对应两个 MAC。
**两者最本质的差别在「可变性」**:**MAC 出厂就定了,跟着网卡走;IP 跟着位置走,换网络就换。**
**所以「按 IP 认人」是不靠谱的**——**这也是为什么内网要做 802.1X 认证,而不是只看 IP。**
五张网卡里有两个是「本地管理」,原因很直接:
「本地连接 1/ 2」是系统虚拟出来的适配器(Wi-Fi Direct 之类),
它们的 MAC 是软件生成的,不是 IEEE 发的。
注意它们的 OUI 只差第一个字节:9C-B6-D0 与 9E-B6-D0、AE-B6-D0 后四字节完全一样,
因为虚拟适配器就是拿物理网卡的地址改一位生成的。
这一个字节改的正是「本地管理位」。
从这张表也能看出「唯一性靠发证」的实际含义:同厂商的设备前三字节都一样,
所以真正区分设备的只有后三字节,一共 1677 万种组合。
30 秒实验
- 把某张网卡的 MAC 第一位改成偶数(比如把
9E改成9C), 看mac_kind的判断会不会变——这就是「本地管理位」的验证。 - 用
arp -a看本网段已经有哪些 IP 与 MAC 的对应,数一下有几台设备。 - 想一下:如果内网只看 IP 做白名单,有什么办法能绕过?
常见误区
- 以为 MAC 全球唯一所以能当身份。 改 MAC 是常规功能,而且唯一性只在一个广播域内起作用。
- 以为 IP 冲突会直接报错。 多数情况只是「时通时断」,要反复看 ARP 表才能确认。
- 以为「内网就安全」。 地址可以随便配、随便改,安全必须靠认证,不能靠地址。
自测三问(点开对答案)
1. MAC 与 IP 的唯一性分别靠什么保证? —— **MAC 靠 IEEE 分配 OUI 加厂商编号(发证)**,**IP 靠人工或 DHCP 在网段内不重复(管理)。** 2. 怎么从 MAC 看出它是虚拟网卡? —— **看第一个字节的次低位(本地管理位)**:置 1 就是软件生成的,所以第二位是 2、6、A、 E 的都属于本地管理。 3. 为什么「按 IP 认人」不靠谱? —— **IP 可以随便配、MAC 可以随便改。**真正的身份认证要靠凭据(证书、口令、802.1X), 不能靠地址。下一节讲地址的另一个维度:层次性——为什么地址里要分「网络部分」和「主机部分」。
- ☐ (本节完,下一节 1.8.2 地址的层次性)