组播 MAC 地址的映射规则
IP 组播要在以太网上传输,必须映射到一个二层组播地址,否则交换机不知道该怎么处理。这套映射规则是固定算法,不需要任何协议协商,理解它能解释很多抓包中看到的奇怪地址。
判断组播的依据
第一字节的最低位为 1 就是组播。写成十六进制,看第一字节是奇数还是偶数即可。完整的标志位含义见读懂 MAC 地址第一字节。
IPv4 的映射:01:00:5E 开头
IPv4 组播地址范围是 224.0.0.0/4。映射规则是:
- 前 25 位固定为
01:00:5E加一个 0 位 - 后 23 位直接取 IPv4 组播地址的低 23 位
举例,224.0.0.1(所有主机)映射为 01:00:5E:00:00:01。239.255.255.250(SSDP 使用)映射为 01:00:5E:7F:FF:FA。
这里有个必须知道的缺陷。IPv4 组播地址有 28 位可变部分,但只有 23 位被映射进 MAC 地址,5 位信息被丢弃。结果是 32 个不同的 IPv4 组播组共享同一个 MAC 地址。224.1.1.1 和 225.1.1.1 的低 23 位相同,二层地址完全一致。
实际影响是网卡会收到自己没订阅的组播帧,由内核在三层过滤掉。流量不大时无所谓,在组播密集的网络里会造成可观的无效中断开销。
IPv6 的映射:33:33 开头
IPv6 组播地址以 ff00::/8 开头,映射规则更简单:
- 前 16 位固定为
33:33 - 后 32 位直接取 IPv6 地址的最后 32 位
例如 ff02::1(链路本地所有节点)映射为 33:33:00:00:00:01。
IPv6 保留了 32 位,重叠概率远低于 IPv4,但仍然不是一一对应。33:33 这个前缀的来历常被认为与 Xerox 在帕洛阿尔托的地址门牌号有关。
常见的固定组播地址
| MAC 地址 | 用途 |
|---|---|
01:00:5E:00:00:01 | IPv4 所有主机(224.0.0.1) |
01:00:5E:00:00:02 | IPv4 所有路由器(224.0.0.2) |
33:33:00:00:00:01 | IPv6 所有节点(ff02::1) |
33:33:00:00:00:02 | IPv6 所有路由器(ff02::2) |
01:80:C2:00:00:00 | 生成树协议 BPDU |
01:80:C2:00:00:0E | LLDP 邻居发现 |
01:1B:19:00:00:00 | PTP 精确时间协议 |
看到 01:80:C2 开头的帧不用在查询页查厂商,那是 IEEE 保留给桥接协议的范围。
广播是组播的一个特例,与它相关的保留地址见广播地址与特殊 MAC 地址。
IGMP Snooping:避免组播变广播
交换机默认把组播帧当广播处理,向 VLAN 内所有端口泛洪。在有 IPTV 或视频监控的网络里,这会让所有端口都承受组播流量。
IGMP Snooping 让交换机偷看 IGMP 的加入和离开报文,只向真正订阅了该组的端口转发。这在部署组播业务时是必备配置,IPv6 环境对应的是 MLD Snooping。
有一个例外要注意:224.0.0.0/24 范围内的地址(对应 01:00:5E:00:00:xx)是链路本地控制流量,IGMP Snooping 通常不做抑制,始终泛洪。