mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
2901 字
8 分钟
为什么 MAC 地址不需要全球唯一
2023-08-19

MAC 地址(Media Access Control Address)是网络设备的唯一标识符。很多人认为 MAC 地址是全球唯一的,但实际上,MAC 地址只需要在局域网内唯一就够了。为什么?这涉及到网络分层设计的核心逻辑。

一、MAC 地址的基础知识#

1.1 MAC 地址的结构#

┌─────────────────────────────────────────────┐
│ MAC 地址(48 位 / 6 字节) │
├────────────────┬────────────────┬──────────┤
│ OUI(厂商代码)│ NIC(网络接口) │ LAA │
│ 24 位 │ 24 位 │ 1 位 │
└────────────────┴────────────────┴──────────┘
示例:00:1A:2B:3C:4D:5E

MAC 地址的 48 位分为两部分:

部分位数说明
OUI24 位组织唯一标识符,由 IEEE 分配给厂商
NIC Specific24 位厂商自行分配的接口标识符

其中第一字节的最低两位有特殊含义:

名称含义
最低位(I)Individual/Group0=单播,1=多播
次低位(L)Locally Administered (LAA)0=全球唯一,1=本地管理

LAA 位是理解 MAC 地址”不需要全球唯一”的关键。当 LAA 位为 1 时,表示这个 MAC 地址是本地分配的,不保证全球唯一。操作系统和虚拟化软件经常使用 LAA 地址。

1.2 MAC 地址的类型#

类型说明示例第一字节特点
单播发送给特定网卡00:1A:2B:3C:4D:5EI=0, L=0 或 1
多播发送给一组网卡01:00:5E:…I=1
广播发送给所有网卡FF:FF:FF:FF:FF全 1

1.3 MAC 地址的分配历史#

1970 年代,Xerox PARC 的 Bob Metcalfe 发明以太网时,MAC 地址的设计初衷确实是全球唯一。IEEE(前身是 Xerox 的地址分配机构)通过 OUI 机制确保每个厂商拿到的地址前缀不重复,厂商再确保后缀不重复。

但”全球唯一”从来不是协议正确运行的必要条件,只是管理上的便利。网络协议依赖的是局部唯一性,而非全局唯一性。

二、MAC 地址的作用范围#

2.1 局域网内的寻址#

flowchart LR subgraph 交换机 S1[交换机] end subgraph 局域网 H1[主机 A<br/>MAC: 00:1A:2B:3C:4D:5E] H2[主机 B<br/>MAC: 00:1A:2B:3C:4D:5F] H3[主机 C<br/>MAC: 00:1A:2B:3C:4D:60] end S1 --> H1 S1 --> H2 S1 --> H3 Note over H1,H3: 只需要在局域网内唯一

MAC 地址是二层(数据链路层)地址,只在本地网络中有意义。交换机根据 MAC 地址转发帧,但交换机不会把帧转发到其他局域网。

2.2 为什么不需要全球唯一?#

flowchart LR subgraph 网络 A M1[00:1A:2B:3C:4D:5E] end subgraph 网络 B M2[00:1A:2B:3C:4D:5E] end Note: 两台设备的 MAC 地址相同<br/>但在不同的网络中,不会冲突

原因

  1. MAC 地址只在本地网络使用
  2. 不同局域网之间通过路由器隔离
  3. 路由器会重新封装数据包,改变源/目标 MAC 地址

关键点在于路由器的隔离作用。路由器连接两个不同的局域网,它在转发数据时会:

  • 剥离进入接口的以太网帧头(包含源/目标 MAC)
  • 根据 IP 路由表确定出接口
  • 用出接口的 MAC 作为源 MAC,下一跳的 MAC 作为目标 MAC,重新封装帧

这意味着,MAC 地址在跨网络传输的过程中被替换了。远程主机永远不会看到你的原始 MAC 地址。

三、ARP:MAC 地址与 IP 地址的桥梁#

3.1 ARP 的工作原理#

ARP(Address Resolution Protocol)是理解 MAC 地址作用范围的关键协议。它将 IP 地址映射为 MAC 地址,但只在局域网内工作:

sequenceDiagram participant H as 主机 A (192.168.1.10) participant S as 交换机 participant R as 路由器 (192.168.1.1) participant H2 as 主机 B (10.0.0.20) Note over H,R: 同一局域网内 H->>S: ARP Request: 谁是 192.168.1.1? S->>R: 广播 ARP 请求 R->>S: ARP Reply: 192.168.1.1 的 MAC 是 AA:BB:CC:DD:EE:01 S->>H: 转发 ARP 回复 Note over H,H2: A 要发数据给 B H->>R: 以太网帧(目标 MAC=路由器,目标 IP=10.0.0.20) Note over R: 路由器重新封装 R->>H2: 以太网帧(源 MAC=路由器新口,目标 MAC=主机 B)

注意最后一个箭头:路由器发出的帧,源 MAC 变成了路由器出接口的 MAC 地址,目标 MAC 变成了主机 B 的 MAC 地址。原始发送方主机 A 的 MAC 地址已经不存在了

3.2 ARP 表的作用范围#

# 查看本机的 ARP 表
arp -a
# 输出:
# ? (192.168.1.1) at aa:bb:cc:dd:ee:01 on eth0
# ? (192.168.1.100) at 00:1a:2b:3c:4d:5e on eth0
# 只能看到同一局域网内的 MAC 地址
# 尝试获取远程主机的 MAC 地址
# 不可能!远程主机不在同一二层网络
# 只能获取到默认网关(路由器)的 MAC 地址

ARP 表只包含同一局域网内的 IP-MAC 映射。跨越路由器的通信,你只能解析到路由器接口的 MAC 地址,永远无法解析到远程主机的 MAC 地址。

四、MAC 地址 vs IP 地址#

4.1 层次对比#

属性MAC 地址IP 地址
OSI 层次二层(数据链路层)三层(网络层)
作用范围局域网内全球
分配方式硬件烧录/软件设置网络管理员/DHCP
结构特点平坦地址层次化地址
路由能力不可路由可路由
变化性理论上固定随网络变化

4.2 为什么需要两种地址#

一个常见的问题是:既然 IP 地址已经能唯一标识主机,为什么还需要 MAC 地址?

答案是分层解耦

  • IP 地址解决的是”逻辑上的端到端寻址”(从源主机到目的主机的路径)
  • MAC 地址解决的是”物理上的下一跳寻址”(从当前节点到下一个节点的链路层传输)

这就像寄信:IP 地址相当于收信人的门牌号(逻辑地址),MAC 地址相当于邮递员当前要投递的那个信箱(物理地址)。邮递员在不同投递站之间传递时,信箱号会变,但收信人的门牌号不变。

4.3 数据包转发过程中地址的变化#

跳数源 IP目标 IP源 MAC目标 MAC
1192.168.1.1010.0.0.20A 的 MAC路由器 L口 MAC
2192.168.1.1010.0.0.20路由器 R口 MACB 的 MAC

IP 地址全程不变,MAC 地址每一跳都变。这是理解 MAC 地址不需要全球唯一的核心论据。

五、交换机的 MAC 地址学习#

5.1 MAC 地址表#

交换机维护一张 MAC 地址表(也叫 CAM 表),记录 MAC 地址与端口的对应关系:

flowchart LR S[交换机] -->|端口 1| H1[主机 1<br/>MAC: AA:AA:AA] S -->|端口 2| H2[主机 2<br/>MAC: BB:BB:BB] S -->|端口 3| H3[主机 3<br/>MAC: CC:CC:CC] Note over S: MAC 地址表<br/>AA:AA:AA → 端口1<br/>BB:BB:BB → 端口2<br/>CC:CC:CC → 端口3

交换机学习 MAC 地址的过程:

  1. 收到帧时,记录源 MAC 和进入端口
  2. 查找目标 MAC,找到则单播转发
  3. 找不到则广播到所有端口(泛洪)

这张表只关心本地端口。交换机完全不知道其他交换机或路由器后面的 MAC 地址。

5.2 MAC 地址冲突在局域网内的影响#

如果同一局域网内出现两个相同的 MAC 地址:

# 两台设备 MAC 相同时的现象:
# 1. 交换机 MAC 地址表不断翻转(同一个 MAC 在两个端口之间切换)
# 2. 数据包被交替发往两个端口
# 3. 通信间歇性中断
# 查看交换机 MAC 地址表翻转
# Cisco: show mac address-table dynamic
# Linux bridge: bridge fdb show

同一局域网内 MAC 冲突是严重问题,但跨局域网的 MAC 冲突完全无影响。这就是为什么 MAC 地址只需要本地唯一。

六、MAC 地址”不唯一”的实际场景#

6.1 虚拟机和容器#

虚拟化环境下,MAC 地址冲突是个实际问题:

# 虚拟机的 MAC 地址可能重复
# VMware 的 MAC 地址范围:00:50:56:00:00:00 - 00:50:56:3F:FF:FF
# KVM/QEMU 的 MAC 地址范围:52:54:00:xx:xx:xx(LAA 位为 1)
# Docker 容器的 MAC 地址
# 默认基于容器 ID 生成
docker inspect --format='{{.NetworkSettings.MacAddress}}' container_id
# 输出:02:42:ac:11:00:02(LAA 位为 1,本地管理地址)
# 同一主机上的容器在同一个虚拟网桥上
# MAC 地址由 Docker daemon 保证本地唯一
# 不同主机的容器可以有相同 MAC(在不同虚拟网络中)

大型云环境中,虚拟 MAC 地址的数量可能超过 IEEE 分配的物理 MAC 地址空间。这时”全球唯一”根本不可能保证,但只要在同一虚拟网络内不冲突就行。

6.2 MAC 地址克隆#

# ISP 可能将 MAC 地址与账号绑定
# 更换路由器时需要"克隆"旧 MAC
# Linux 下修改 MAC 地址
ip link set dev eth0 down
ip link set dev eth0 address 00:1A:2B:3C:4D:5E
ip link set dev eth0 up
# 或者使用 macchanger 工具
macchanger -m 00:1A:2B:3C:4D:5E eth0

MAC 地址克隆证明了:MAC 地址不需要全球唯一,只需要在当前连接的网络中不冲突。你克隆的 MAC 地址可能在地球另一端的某个局域网中也存在,但只要不在同一个局域网,就完全没问题。

6.3 MAC 地址随机化:隐私保护#

现代操作系统(iOS 8+、Android 8+、Windows 10+)在扫描 WiFi 时会使用随机 MAC 地址,这是对用户隐私的保护:

# macOS 查看 WiFi 扫描使用的随机 MAC
# 系统设置 → Wi-Fi → 详细信息 → 随机 MAC 地址
# Android 的 MAC 地址随机化
# 设置 → 网络 → 私有 DNS → 使用随机 MAC
# 这意味着:
# - 同一台设备在不同 WiFi 网络中使用不同的 MAC
# - 全球唯一性已经被主动打破
# - 但每个 WiFi 网络内的 MAC 仍然是唯一的

MAC 地址随机化彻底打破了”全球唯一”的迷思。一台设备每次连接不同的 WiFi 可能使用不同的 MAC 地址,但只要在同一个接入点下不冲突,通信就正常。

6.4 网卡厂商的 MAC 地址耗尽问题#

48 位 MAC 地址空间有 2^48 = 281,474,976,710,656 个地址,看起来很多。但 IEEE 分配 OUI 时,每个 OUI 只有 2^24 = 16,777,216 个地址。一个大型网卡厂商如果每年生产 1 亿片网卡,一个 OUI 只够用不到两个月。

解决方案是:厂商可以申请多个 OUI。但这也意味着,OUI 不能唯一标识一个厂商(一个厂商可能有多个 OUI)。全球唯一性在管理层面也在被稀释。

七、跨网络通信的完整流程#

7.1 一个完整的跨网络通信示例#

假设主机 A(192.168.1.10)要访问主机 B(10.0.0.20):

sequenceDiagram participant A as 主机 A<br/>192.168.1.10<br/>MAC: AA participant R as 路由器<br/>192.168.1.1 / 10.0.0.1<br/>MAC: RR1 / RR2 participant B as 主机 B<br/>10.0.0.20<br/>MAC: BB Note over A: 1. A 发现 B 不在同一子网 A->>A: 2. 查路由表,下一跳是 192.168.1.1 A->>A: 3. ARP 查询 192.168.1.1 的 MAC A->>R: 4. 发帧:源 MAC=AA, 目标 MAC=RR1<br/>源 IP=192.168.1.10, 目标 IP=10.0.0.20 Note over R: 5. 路由器收到帧,剥离帧头 Note over R: 6. 查路由表,目标网络走 RR2 接口 R->>R: 7. ARP 查询 10.0.0.20 的 MAC R->>B: 8. 发帧:源 MAC=RR2, 目标 MAC=BB<br/>源 IP=192.168.1.10, 目标 IP=10.0.0.20

注意步骤 4 和步骤 8 中 MAC 地址的变化。IP 地址全程不变,MAC 地址在每一跳都被替换。

7.2 用 tcpdump 观察这一过程#

# 在主机 A 上抓包
sudo tcpdump -i eth0 -e -n arp or icmp
# 输出:
# ARP, Request who-has 192.168.1.1 tell 192.168.1.10, length 28
# ARP, Reply 192.168.1.1 is-at aa:bb:cc:dd:ee:01, length 28
# IP 192.168.1.10 > 10.0.0.20: ICMP echo request
# 源 MAC: aa:aa:aa:aa:aa:aa (主机A)
# 目标 MAC: aa:bb:cc:dd:ee:01 (路由器)

在主机 A 上,你只能看到目标是路由器的 MAC 地址,永远看不到主机 B 的 MAC 地址。

八、MAC 地址过滤的安全局限#

8.1 MAC 地址过滤为什么不可靠#

很多 WiFi 路由器提供 MAC 地址过滤功能,只允许特定 MAC 地址的设备连接。但这是一个很弱的安全措施:

# 攻击者可以轻易绕过 MAC 地址过滤:
# 1. 监听网络流量,获取已授权设备的 MAC 地址
# 2. 修改自己的 MAC 地址为已授权地址
# 使用 aircrack-ng 套件监听
airodump-ng wlan0mon
# 可以看到所有连接设备的 MAC 地址
# 修改 MAC 地址
ifconfig wlan0 down
ifconfig wlan0 hw ether 00:1A:2B:3C:4D:5E # 使用已授权的 MAC
ifconfig wlan0 up

MAC 地址过滤不可靠的根本原因:MAC 地址不是身份认证机制。MAC 地址只是二层寻址标识,可以被轻易伪造。

8.2 iptables 中的 MAC 地址过滤#

# 在路由器上过滤特定 MAC 地址
iptables -A INPUT -m mac --mac-source 00:1A:2B:3C:4D:5E -j DROP
# 注意:这只在同一局域网内有效
# MAC 地址不会跨路由器传递,所以这个规则只能过滤直连设备

九、其他链路层技术的地址方案#

技术地址类型地址长度是否需要全球唯一
以太网MAC 地址48 位本地唯一即可
WiFiMAC 地址48 位本地唯一即可
BluetoothBD_ADDR48 位本地唯一即可
Fibre ChannelWWN64 位设计为全球唯一
InfiniBandGID/LID64/16 位本地唯一
IPv6Link-Local 地址64 位前缀+MAC本地唯一

注意 IPv6 的链路本地地址(Link-Local Address,fe80::/10)通常包含 MAC 地址(通过 EUI-64 格式),但它仍然只在本地链路有效。IPv6 邻居发现协议(NDP)替代了 ARP,但原理相同:只在同一链路内解析 MAC 地址。

十、总结#

10.1 MAC 地址不需要全球唯一的原因#

原因说明
层次限制MAC 是二层地址,只在 LAN 内有效
路由器隔离不同网络之间通过路由器转发
帧头替换跨网络时 MAC 地址被路由器替换
交换机局部性交换机只关心本地 MAC 表
ARP 局部性ARP 只能解析同一链路的 MAC 地址

10.2 与 IP 地址的本质区别#

维度MAC 地址IP 地址
层次数据链路层(二层)网络层(三层)
作用范围局域网全球
唯一性要求本地唯一全球唯一
地址结构平坦(无层次)层次化(网络+主机)
跨网时是否变每一跳都变全程不变
路由能力不可路由可路由

10.3 现实中的 MAC 地址#

场景全球唯一?原因
物理网卡出厂设计上是的IEEE OUI 分配机制
虚拟机/容器不保证本地生成,LAA 位为 1
MAC 地址克隆故意重复绕过 ISP 绑定
WiFi 随机 MAC故意随机保护隐私
网卡 MAC 修改可以重复软件可任意设置

核心观点:MAC 地址和 IP 地址工作在不同的网络层次,有不同的作用范围和唯一性要求。MAC 地址只在本地链路有效,跨网络通信时会被路由器替换。这是网络分层设计的经典体现。全球唯一性是管理上的便利,而非协议运行的必要条件。

参考资料#

支持与分享

如果这篇文章对你有帮助,欢迎支持作者或分享给更多人

为什么 MAC 地址不需要全球唯一
https://blog.souloss.com/posts/why-the-design/why-mac-addresses-dont-need-to-be-globally-unique/
作者
Souloss
发布于
2023-08-19
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时