TOC

MAC 地址

MAC 地址的正式名称应该是 Media Access Control Address, 翻译过来就是 “媒体接入控制层地址”。

这个名字应该是来自网络分层模型中,链路层的子层 —— 媒体接入控制层 (https://zh.wikipedia.org/wiki/介质访问控制)。

此外还有以下名字:

  1. Physical Address, 物理地址
  2. Ethernet Hardware Address, EHA, 以太网硬件地址
  3. Ethernet Address, 以太网地址
  4. LAN Address, 局域网地址
  5. NIC Address, 网卡地址

作用在链路层。

表示方法

MAC 地址一共 6 个字节,也就是 48 bits。

每个字节用两个 16 进制数表示,中间用横线连接,或者用分号连接,比如 00-00-00-00-00-0000:00:00:00:00:00

组成结构

MAC

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
  • 后三个字节:设备标识

此外:

  1. MAC 地址首字节的倒数第一位(I/G 位):
  2. 0 表示 unicast 单播 (individual)
  3. 1 表示 multicast 组播 (group)
  4. MAC 地址首字节的倒数第二位(U/L 位):
  5. 0 表示 Universal 全局,这种地址叫 通用管理地址 UAA
  6. 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))

参考资料与拓展阅读