MAC 地址解析:它们是什么、如何工作以及开发者为何应关注

发布: (2026年2月6日 GMT+8 01:13)
6 分钟阅读
原文: Dev.to

Source: Dev.to

(未提供需要翻译的正文内容,若您将文章文本粘贴在此,我可以为您完成简体中文翻译。)

什么是 MAC 地址?

每个世界上所有设备的每个网络接口都有 MAC 地址。你的笔记本电脑、手机、智能冰箱、打印机——它们都有至少一个。

MAC 代表 媒体访问控制。它是分配给网络接口控制器(NIC)的唯一标识符——即将你的设备连接到网络的硬件。

MAC 地址的形式如下:

00:1A:2B:3C:4D:5E

它是 48 位(6 字节) 长,通常写作六对十六进制数字,用冒号或连字符分隔。

MAC 地址的结构

部分大小示例
OUI(组织唯一标识符)3 bytes00:1A:2B
NIC‑specific(特定于 NIC)3 bytes3C:4D:5E
  • 前三个字节用于标识制造商。IEEE 向公司分配 OUI 块。
  • 后三个字节由制造商分配,用于唯一标识每个设备。使用 24 bits,每个 OUI 块可支持约 1670 万个唯一设备。

OUI 示例

OUI制造商
00:00:0CCisco
00:1A:11Google
3C:22:FBApple
DC:A6:32Raspberry Pi
00:50:56VMware

第一个字节中的重要标志

含义
0 (LSB)0 = 单播, 1 = 多播
10 = 全局唯一, 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
VMware00:50:56
VirtualBox08: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:5E192.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:5ELinux, macOS
连字符分隔00-1A-2B-3C-4D-5EWindows
点分隔001A.2B3C.4D5ECisco
无分隔符001A2B3C4D5E某些 API

它们都表示相同的地址,只是格式不同。

MAC 地址和 IPv6(EUI‑64)

IPv6 可以使用 EUI‑64 格式从 MAC 地址派生接口标识符:

  1. 在中间插入 FF:FE
    00:1A:2B:3C:4D:5E00:1A:2B:FF:FE:3C:4D:5E
  2. 翻转第 7 位(即 “U/L” 位)
    00:1A:2B:FF:FE:3C:4D:5E02:1A:2B:FF:FE:3C:4D:5E

得到的 IPv6 链路本地地址:

fe80::21a:2bff:fe3c:4d5e

因此,MAC 随机化也会影响 IPv6 隐私。

生成用于测试的有效 MAC 地址

如果您需要用于开发或文档的真实 MAC 地址,randommac.com 可以即时生成,结构正确——有效的 OUI 前缀、正确的标志位,以及多种输出格式。无需注册;直接在浏览器中使用。

结论

MAC 地址是网络基础,绝大多数开发者使用它的频率比他们意识到的要高。Docker 容器、虚拟机、物联网设备以及网络调试都依赖它们。了解其结构、标志位和厂商前缀有助于更快排查问题,构建更好的网络感知应用。

你最有趣的 MAC 地址调试故事是什么?在评论区分享吧!

Back to Blog

相关文章

阅读更多 »

揭秘 Web 2:互联网的语言

第2集 – 为网络提供动力的网络协议 在第1集中,我们走遍了网页工作原理的基础:输入 URL、DNS 查询、安全连接……

🔒 HTTPS 像5岁小孩一样解释

完整的深度解析并附带代码示例 https://sreekarreddy.com/learn/eli5/https 明信片 vs. 密封信 HTTP 无 S:像明信片——任何处理它的人都可以读取…