📚 第一章 网络基础知识
📄 一句话概括

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 秒实验

  1. 把某张网卡的 MAC 第一位改成偶数(比如把 9E 改成 9C), 看 mac_kind 的判断会不会变——这就是「本地管理位」的验证。
  2. 用 arp -a 看本网段已经有哪些 IP 与 MAC 的对应,数一下有几台设备。
  3. 想一下:如果内网只看 IP 做白名单,有什么办法能绕过?

常见误区

  1. 以为 MAC 全球唯一所以能当身份。 改 MAC 是常规功能,而且唯一性只在一个广播域内起作用。
  2. 以为 IP 冲突会直接报错。 多数情况只是「时通时断」,要反复看 ARP 表才能确认。
  3. 以为「内网就安全」。 地址可以随便配、随便改,安全必须靠认证,不能靠地址。
自测三问(点开对答案) 1. MAC 与 IP 的唯一性分别靠什么保证? —— **MAC 靠 IEEE 分配 OUI 加厂商编号(发证)**,**IP 靠人工或 DHCP 在网段内不重复(管理)。** 2. 怎么从 MAC 看出它是虚拟网卡? —— **看第一个字节的次低位(本地管理位)**:置 1 就是软件生成的,所以第二位是 2、6、A、 E 的都属于本地管理。 3. 为什么「按 IP 认人」不靠谱? —— **IP 可以随便配、MAC 可以随便改。**真正的身份认证要靠凭据(证书、口令、802.1X), 不能靠地址。

下一节讲地址的另一个维度:层次性——为什么地址里要分「网络部分」和「主机部分」。

相关笔记