MAC 地址的正式名称应该是 Media Access Control Address, 翻译过来就是 “媒体接入控制层地址”。
这个名字应该是来自网络分层模型中,链路层的子层 —— 媒体接入控制层 (https://zh.wikipedia.org/wiki/介质访问控制)。
此外还有以下名字:
- Physical Address, 物理地址
- Ethernet Hardware Address, EHA, 以太网硬件地址
- Ethernet Address, 以太网地址
- LAN Address, 局域网地址
- NIC Address, 网卡地址
作用在链路层。
表示方法
MAC 地址一共 6 个字节,也就是 48 bits。
每个字节用两个 16 进制数表示,中间用横线连接,或者用分号连接,比如 00-00-00-00-00-00
,00:00:00:00:00:00
。
组成结构
MAC 地址是跟设备的网络接口绑定的,比如我的笔记本有一个有线网口、一张无线网卡,它们在出厂时就各分配了一个 MAC 地址,再比如我的路由器有一个 WAN 口和 4 个 LAN 口,那它出厂的时候就应该分配了 5 个 MAC 地址。
PS: 当然也可以在操作系统层面修改设备的 MAC 地址。
PS:我听说普通的家用路由器并不是每个端口都有一个 NIC,因为不需要复杂的子网管理,一般只用区分内网和外网,所以只有 2 个 MAC 地址(WAN 口一个,LAN 口共用一个)。
PS:虚拟机可以使用物理网卡 MAC 地址,也可以自定义 MAC 地址。
- 前三个字节:厂商标识 (Organizationally Unique Identifier, OUI)
由 IEEE 指定机构负责分配。
网上有很多工具可以查 OUI 分配情况,比如 http://www.coffer.com/mac_find/?string=xiaomi - 后三个字节:设备标识
此外:
- MAC 地址首字节的倒数第一位(I/G 位):
- 0 表示 unicast 单播 (individual)
- 1 表示 multicast 组播 (group)
- MAC 地址首字节的倒数第二位(U/L 位):
- 0 表示 Universal 全局,这种地址叫 通用管理地址 UAA
- 1 表示 Local 本地,这种地址叫 本地管理地址 LAA
以太网数据帧格式
ETHERNET II
Python 生成 MAC 地址
# 545200: KVM
# 00163E: Xen
def generate_mac_address():
mac = [0x00, 0x16, 0x3e,
random.randint(0x00, 0x7f),
random.randint(0x00, 0xff),
random.randint(0x00, 0xff)]
return ':'.join(map(lambda x: "%02x" % x, mac))