跳至正文
老丹的足迹 —— 代码写给机器,游记写给自己,感悟写给时间
老丹的足迹 老丹的足迹
老丹的足迹 老丹的足迹
  • 首页
  • 示例页面
  • 首页
  • 示例页面
老丹的足迹 老丹的足迹
老丹的足迹 老丹的足迹
  • 首页
  • 示例页面
  • 首页
  • 示例页面

从 ip maddr show 命令输出看 ens38 接口的多播组加入情况

一、命令与输出

执行以下命令查看网络接口 ens38 当前加入的所有多播组:

ip maddr show dev ens38

命令输出如下:

3:      ens38
        link  01:00:5e:00:00:01
        link  33:33:00:00:00:01
        link  33:33:ff:7b:3c:3f
        link  01:00:5e:00:00:fb
        link  33:33:00:00:00:fb
        inet  224.0.0.251
        inet  224.0.0.1
        inet6 ff02::fb
        inet6 ff02::1:ff7b:3c3f
        inet6 ff02::1
        inet6 ff01::1

输出结果中,link 行表示数据链路层的以太网多播 MAC 地址,inet 行表示 IPv4 多播 IP 地址,inet6 行表示 IPv6 多播 IP 地址。

二、IPv4 多播地址与 MAC 地址映射

IPv4 多播 MAC 地址的映射规则如下:

  • MAC 地址前三字节固定为 01:00:5e
  • MAC 地址后三字节中,只有低 23 位取自 IPv4 多播地址的低 23 位
  • MAC 地址后三字节的最高位(第 25 位)固定为 0

该接口的 IPv4 多播映射关系见下表:

IPv4 多播地址对应 MAC 地址用途说明
224.0.0.101:00:5e:00:00:01所有主机多播地址,用于本地子网通用多播通信
224.0.0.25101:00:5e:00:00:fbmDNS 协议地址,用于局域网零配置服务发现

以 224.0.0.1 为例,其二进制形式为 11100000.00000000.00000000.00000001,取低 23 位为 0000000.00000000.00000001,高位补一个 0 后得到 24 位 00000000.00000000.00000001,即 MAC 后三字节 00:00:01,完整 MAC 为 01:00:5e:00:00:01。

224.0.0.251 的低 23 位对应十六进制 00:00:fb,高位补 0 后得到 00:00:fb,完整 MAC 为 01:00:5e:00:00:fb。

输出结果中的两条 link 记录与上表中的 MAC 地址完全吻合。

三、IPv6 多播地址与 MAC 地址映射

IPv6 多播 MAC 地址的映射规则如下:

  • MAC 地址前两字节固定为 33:33
  • MAC 地址后四字节取自 IPv6 多播地址的最后 32 位

该接口的 IPv6 多播映射关系见下表:

IPv6 多播地址对应 MAC 地址用途说明
ff02::133:33:00:00:00:01链路本地所有节点多播地址,功能类似 IPv4 的 224.0.0.1
ff02::fb33:33:00:00:00:fbmDNS over IPv6 地址,与 IPv4 mDNS 功能对等
ff02::1:ff7b:3c3f33:33:ff:7b:3c:3f被请求节点多播地址,用于 IPv6 邻居发现协议(NDP)地址解析,相当于 IPv4 的 ARP

具体映射过程如下:

  • ff02::1 的最后 32 位为 00:00:00:01,MAC 为 33:33:00:00:00:01
  • ff02::fb 的最后 32 位为 00:00:00:fb,MAC 为 33:33:00:00:00:fb
  • ff02::1:ff7b:3c3f 的最后 32 位为 ff:7b:3c:3f,MAC 为 33:33:ff:7b:3c:3f

输出中的三条 link 记录与上表中的 MAC 地址完全匹配。

四、IPv4 与 IPv6 映射规则对比

对比项IPv4IPv6
MAC 地址前缀01:00:5e33:33
MAC 地址后段取值IPv4 地址的低 23 位,高位补 0IPv6 地址的最后 32 位
MAC 地址可用位数23 位32 位
是否可能多个 IP 映射到同一 MAC是(低 23 位映射,32 个 IP 对应一个 MAC)否(直接取 32 位,一一对应)

由于 IPv4 和 IPv6 使用完全不同的 MAC 地址前缀(01:00:5e 与 33:33),二者在同一个物理链路上可以共存而互不干扰。

五、关于 ff01::1 的特殊说明

多播地址是否有对应 MAC原因分析
ff01::1无该地址作用域为”接口本地”,数据包不离开本接口,无需封装以太网帧,因此不需要 MAC 映射

ff01::1 的有效范围被严格限制在本网络接口内部,数据包永远不会发送到物理链路上。正因如此,为其分配 MAC 地址毫无意义,输出中自然没有与之匹配的 link 记录。这完全符合 IPv6 协议规范,并非异常。

六、补充说明:IPv4 映射规则中为什么第 25 位必须为 0?

细心的读者可能会注意到一个细节:IPv4 组播地址有 28 位可用空间(高 4 位固定为 1110),但映射到 MAC 地址时只取了低 23 位,而 MAC 地址的后三字节共有 24 位,似乎“少用了一位”。实际情况是,MAC 地址后三字节的最高位(即第 25 位)被 IANA 强制固定为 0,所以虽然从 IP 地址取了 23 位,但为了填满 MAC 地址后三字节的 24 位,需要在高位补一个 0。这就是所谓“差一位”的来源。

映射过程图解

步骤内容说明
IPv4 地址224.0.0.1二进制:11100000.00000000.00000000.00000001
取低 23 位0000000.00000000.00000001共 23 位,即 0x00 00 01
高位补 000000000.00000000.00000001补 1 位 0,凑成 24 位,即 0x00 00 01
MAC 后三字节00:00:01
完整 MAC01:00:5e:00:00:01前三字节固定 + 后三字节

为什么第 25 位必须为 0?

原因说明
历史兼容性IEEE 在分配多播 MAC 地址时,已将 01:00:5e 前缀下的部分空间预留给早期以太网上的其他非 IP 协议(如 DECnet、NetBIOS 等)。为避免 IPv4 多播与这些协议在二层发生 MAC 地址冲突,IPv4 只能使用该空间的一半,即高位置 0 的那一半。
后果由于损失了 1 位地址空间(2^5 = 32),会导致 32 个不同的 IPv4 组播地址映射到同一个 MAC 地址。但多播接收依赖于 IP 层的过滤而非 MAC 层的唯一性,因此这一冲突在设计中是被刻意容忍的。

七、所有对应关系汇总

序号网络层多播地址数据链路层 MAC 地址协议族用途
1224.0.0.101:00:5e:00:00:01IPv4所有主机多播
2224.0.0.25101:00:5e:00:00:fbIPv4mDNS 服务发现
3ff02::133:33:00:00:00:01IPv6所有节点多播
4ff02::fb33:33:00:00:00:fbIPv6mDNS over IPv6
5ff02::1:ff7b:3c3f33:33:ff:7b:3c:3fIPv6NDP 邻居解析(类似 ARP)
6ff01::1无对应 MACIPv6接口本地范围,无需二层封装

八、总结

通过 ip maddr show dev ens38 命令的输出可以看出,ens38 接口同时注册了 IPv4 和 IPv6 共六个多播地址(其中五个具有 MAC 映射,一个因作用域特殊无需映射),涵盖了通用多播通信、mDNS 服务发现和 IPv6 邻居解析三大功能场景。通过上述表格可以清晰看出,三层 IP 多播地址与二层 MAC 多播地址之间存在严谨的映射规则,所有对应关系完整无误,该接口的多播注册状态正常。

作者

老丹

关注我
其他文章
上一个

令牌桶算法详解:从原理到工程实践

下一个

dropwatch:Linux内核网络丢包的”火眼金睛”——从原理到实战

关于博主

    老丹是一名C/C++后台开发工程师,信奉“无抽象不设计,无性能不生产”。

  • 技术栈:Modern C++、Linux环境编程、多线程/并发、网络编程等。
  • 信条:能用constexpr解决的问题绝不拖到运行时,能靠RAII避免的泄漏绝不写析构。
  • 正在填坑:从解封装到渲染的C++全链路实现,正在驯服FFmpeg与H.264/H.265。
  • 输出原则:这里的每一段代码都经过-Wall -Wextra -Werror -O2的洗礼。

近期文章

  • Ubuntu 防火墙迁移指南:从 UFW 到 firewalld 的完整实践 2026年9月12日
  • Nano 编辑器完全操作指南:从入门到熟练 2026年9月12日
  • SSCG:让自签名证书不再“危险”的生成工具 2026年9月12日
  • Ubuntu Samba 服务安装与配置完全指南 2026年9月12日
  • 从零开始:用 Docker 部署 Jellyfin 并启用英特尔核显硬件加速 2026年9月11日

文章分类

  • C/C++开发 (22)
  • Docker容器 (5)
  • Linux工具包 (17)
  • Linux服务配置 (50)
  • Linux系统 (16)
  • OpenWrt路由 (3)
  • Shell脚本 (3)
  • 代码管理 (1)
  • 安防技术 (4)
  • 数据安全 (36)
  • 未分类 (1)
  • 网络协议 (25)
  • 计算机理论 (23)
  • 音视频技术 (5)
联系我们:📍 地址:中国·广东省深圳市   |   ✉️ 邮箱:support@tanglinux.com   |   💬 QQ:870866607
版权所有:老丹的足迹粤ICP备2026061170号-1       公安备案图标 粤公网安备44030002013274号