六个字节,从中间一分为二
MAC 地址是 48 位,写作六个字节。前三个字节是组织唯一标识符(OUI),由 IEEE 出售给制造商;后三个字节由该制造商自行分配,保证它生产的每个网卡都不重复。厂商查询的全部依据就是这一划分:你识别的不是设备,而是"谁买下了这段号码"。
由此带来一个常被忽略的后果:查到的厂商是网络芯片的制造者,未必是机器外壳上的品牌。笔记本电脑经常报出无线网卡芯片厂商而不是整机品牌;虚拟机报出的则是虚拟化平台,因为地址由虚拟化层生成。
书写格式纯粹是外观差异。冒号分隔的字节对、连字符分隔的字节对、Cisco 的三组四位以及纯十六进制,描述的是同样的 48 位。只不过厂商和操作系统在展示方式上各行其是,所以格式互转才成了高频琐事。
改变含义的两个比特
第一个字节的次低位是"通用/本地"标志。该位为 0 表示地址来自 IEEE 分配的地址块,此时厂商查询才有意义;该位为 1 表示地址是本地选定的,任何注册表都不会收录它——查不到是预期结果,而不是数据缺失。
这一位正是现代手机和笔记本"查不到厂商"的原因。随机 MAC 地址如今已是 Wi-Fi 扫描的默认行为,连接时往往也启用,它会刻意置上本地位,就是为了无法被追溯到制造商、也无法跨网络关联。看到本地管理地址时,隐私随机化是最可能的解释。
第一个字节的最低位是"单播/组播"标志。为 0 表示该帧发往单个接口,为 1 表示发往一组接口;广播地址(48 位全为 1)只是其极端情形。如果你以为在看设备地址却发现组播位被置上,通常说明你看到的是协议地址而非硬件地址。
从 MAC 到 IPv6,以及它为何被弃用
页面上显示的"修改版 EUI-64",是过去用硬件地址构造 IPv6 地址的方法:在 MAC 中间插入 FF 和 FE 两个字节,并翻转通用/本地位,得到 64 位接口标识符,再接到网络前缀之后。
它能用,而且完全确定——而这恰恰是问题所在。这样生成的地址会把你的硬件身份带进你加入的每一个网络,让任何人都能跨地点关联你的流量。RFC 8981 的隐私扩展与 RFC 7217 的稳定但不透明标识符取代了这种做法,现代系统默认不再从 MAC 推导地址。
但这个转换仍然值得理解,因为它正是让 fe80:: 链路本地地址变得可读的关键。看到接口标识符中间出现 FF FE 模式,你就能一眼判断它派生自 MAC,并据此还原出原始硬件地址。