MAC 地址解析:它们是什么、如何工作以及开发者为何应关注
Source: Dev.to
(未提供需要翻译的正文内容,若您将文章文本粘贴在此,我可以为您完成简体中文翻译。)
什么是 MAC 地址?
每个世界上所有设备的每个网络接口都有 MAC 地址。你的笔记本电脑、手机、智能冰箱、打印机——它们都有至少一个。
MAC 代表 媒体访问控制。它是分配给网络接口控制器(NIC)的唯一标识符——即将你的设备连接到网络的硬件。
MAC 地址的形式如下:
00:1A:2B:3C:4D:5E
它是 48 位(6 字节) 长,通常写作六对十六进制数字,用冒号或连字符分隔。
MAC 地址的结构
| 部分 | 大小 | 示例 |
|---|---|---|
| OUI(组织唯一标识符) | 3 bytes | 00:1A:2B |
| NIC‑specific(特定于 NIC) | 3 bytes | 3C:4D:5E |
- 前三个字节用于标识制造商。IEEE 向公司分配 OUI 块。
- 后三个字节由制造商分配,用于唯一标识每个设备。使用 24 bits,每个 OUI 块可支持约 1670 万个唯一设备。
OUI 示例
| OUI | 制造商 |
|---|---|
00:00:0C | Cisco |
00:1A:11 | |
3C:22:FB | Apple |
DC:A6:32 | Raspberry Pi |
00:50:56 | VMware |
第一个字节中的重要标志
| 位 | 含义 |
|---|---|
| 0 (LSB) | 0 = 单播, 1 = 多播 |
| 1 | 0 = 全局唯一, 1 = 本地管理 |
示例
00:1A:2B:…→ 位 0 = 0, 位 1 = 0 → 单播, 全局唯一(正常)01:00:5E:…→ 位 0 = 1 → 多播地址02:42:AC:…→ 位 1 = 1 → 本地管理(Docker 使用这些)
Docker 与本地管理的 MAC
Docker 为容器分配本地管理的 MAC 地址:
docker inspect -f '{{.NetworkSettings.MacAddress}}' my-container
# Output: 02:42:ac:11:00:02
02 前缀表示已设置本地管理标志。
虚拟化平台
| 平台 | 使用的 OUI |
|---|---|
| VMware | 00:50:56 |
| VirtualBox | 08:00:27 |
这些平台使用其分配的 OUI 为虚拟 NIC 生成 MAC 地址。
本地网络的常见用法
# 列出网络上的设备
arp -a
# 或使用 nmap
nmap -sn 192.168.1.0/24
唤醒局域网 (WoL)
WoL 使用 MAC 地址通过发送“魔术包”来唤醒休眠设备,该包会将目标的 MAC 地址重复 16 次:
import socket
def wake_on_lan(mac):
mac_bytes = bytes.fromhex(mac.replace(':', ''))
magic = b'\xff' * 6 + mac_bytes * 16
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
sock.sendto(magic, ('255.255.255.255', 9))
wake_on_lan('00:1A:2B:3C:4D:5E')
MAC 与 IP 地址
| 属性 | MAC 地址 | IP 地址 |
|---|---|---|
| 层 | 数据链路层(第 2 层) | 网络层(第 3 层) |
| 范围 | 仅限本地网络 | 全局(可路由) |
| 分配方式 | 硬件/制造商 | DHCP / 手动 |
| 格式 | 48‑位十六进制 | 32‑位(IPv4)或 128‑位(IPv6) |
| 是否会变更? | 通常是永久的*(也可以随机化) | 可随网络更改 |
| 示例 | 00:1A:2B:3C:4D:5E | 192.168.1.100 |
*现代设备通常会随机化 MAC 地址以保护隐私(见下文)。
MAC 随机化
自 2014 年左右起,移动操作系统开始对 Wi‑Fi 扫描使用随机 MAC 地址,以防止追踪:
| 操作系统 / 版本 | 默认行为 |
|---|---|
| iOS 14+ | 每个网络随机 MAC |
| Android 10+ | 每个网络随机 MAC |
| Windows 10/11 | 可选的随机硬件地址 |
| macOS Sequoia+ | 随机 Wi‑Fi 地址 |
这打破了网络中的许多假设——捕获门户、设备追踪、DHCP 预留和家长控制都依赖于稳定的 MAC 地址。
在不同操作系统上查看 MAC 地址
# macOS
ifconfig en0 | grep ether
# Linux
ip link show
# or
cat /sys/class/net/eth0/address
# Windows (Command Prompt)
ipconfig /all
# or
getmac
格式变体
| 格式 | 示例 | 使用平台 |
|---|---|---|
| 冒号分隔 | 00:1A:2B:3C:4D:5E | Linux, macOS |
| 连字符分隔 | 00-1A-2B-3C-4D-5E | Windows |
| 点分隔 | 001A.2B3C.4D5E | Cisco |
| 无分隔符 | 001A2B3C4D5E | 某些 API |
它们都表示相同的地址,只是格式不同。
MAC 地址和 IPv6(EUI‑64)
IPv6 可以使用 EUI‑64 格式从 MAC 地址派生接口标识符:
- 在中间插入
FF:FE
00:1A:2B:3C:4D:5E→00:1A:2B:FF:FE:3C:4D:5E - 翻转第 7 位(即 “U/L” 位)
00:1A:2B:FF:FE:3C:4D:5E→02:1A:2B:FF:FE:3C:4D:5E
得到的 IPv6 链路本地地址:
fe80::21a:2bff:fe3c:4d5e
因此,MAC 随机化也会影响 IPv6 隐私。
生成用于测试的有效 MAC 地址
如果您需要用于开发或文档的真实 MAC 地址,randommac.com 可以即时生成,结构正确——有效的 OUI 前缀、正确的标志位,以及多种输出格式。无需注册;直接在浏览器中使用。
结论
MAC 地址是网络基础,绝大多数开发者使用它的频率比他们意识到的要高。Docker 容器、虚拟机、物联网设备以及网络调试都依赖它们。了解其结构、标志位和厂商前缀有助于更快排查问题,构建更好的网络感知应用。
你最有趣的 MAC 地址调试故事是什么?在评论区分享吧!