飞翔飞翔
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
  • 学习路径
  • IP协议

    • 认识 IP 协议与网络层定位
    • IPv4 编址体系与分类地址
    • CIDR 与子网划分实战
    • IPv6 编址体系
    • ARP 协议详解
    • NDP 协议详解
    • IGMP 与 MLD 组播侦听发现
    • VRRP 与网关冗余
    • IPv4 数据报首部解析
    • IPv6 数据报与扩展首部
    • IPsec 安全扩展
    • 分片、MTU 与路径发现
    • ICMP 与 Traceroute 原理
    • 路由基础与转发流水线
    • 动态路由协议
    • NAT 网络地址转换
    • DHCP 与自动配置
    • Wireshark 与命令行工具
    • IPv6 过渡技术
    • IP 协议栈排障与攻击防御
  • TCP协议

    • 认识 TCP 协议与传输层定位
    • TCP 报文段首部解析
    • 三次握手与连接建立
    • 四次挥手与连接释放
    • TCP 有限状态机
    • 序列号与确认机制
    • 超时重传与 RTO 计算
    • 滑动窗口与流量控制
    • 拥塞控制基础
    • 现代拥塞控制算法
    • TCP 选项与扩展
    • TCP 性能调优与内核参数
    • Nagle 算法与糊涂窗口综合征
    • TCP 定时器与 Keep-Alive 机制
    • TCP 安全与攻击防御
    • TCP 与上层/下层交互
    • TCP 综合实践与排障

IGMP 与 MLD 组播侦听发现

什么是组播(Multicast)

单播是一对一(你私聊朋友),广播是一对所有(你在广场用大喇叭喊话),组播是一对多中的特定群体(你在微信群发消息,只有群成员收到)。

IP 组播的应用场景:

  • 视频会议:1 个发言者,100 个听众
  • 在线直播:1 路视频流,10 万观众
  • 股票行情:服务器推送,数千客户端接收
  • 网络克隆:机房同时给 50 台电脑装系统

如果用单播实现直播,服务器要给每个观众发一份同样的数据,带宽 = 码率 × 观众数,服务器直接爆炸。用组播,服务器只发一份,路由器负责"复制"给需要的分支,带宽与观众数无关。

IPv4 组播地址与 MAC 映射

IPv4 组播地址范围是 224.0.0.0 ~ 239.255.255.255(D 类地址)。

特殊组播地址

地址用途
224.0.0.1子网内所有主机
224.0.0.2子网内所有路由器
224.0.0.5OSPF 路由器
224.0.0.9RIPv2 路由器
224.0.0.13PIM 路由器
239.0.0.0/8管理范围组播(私网可用)

组播 IP 到 MAC 的映射

以太网组播 MAC 以 01:00:5e 开头,后 23 位取自组播 IP 的低 23 位:

组播 IP: 224.10.20.30
二进制:  11100000.00001010.00010100.00011110
取低 23 位:          010.00010100.00011110
                    = 0x14.0x1e
MAC: 01:00:5e:0a:14:1e

注意:32 位 IP 中只有 23 位映射到 MAC,有 9 位(第 1 位固定为 0,加上高 5 位)丢失。这意味着 32 个不同的组播 IP 可能映射到同一个 MAC,网卡收到后由 IP 层再过滤。

IGMP:IPv4 组播成员管理

IGMP(Internet Group Management Protocol)运行在主机和本地路由器之间,告诉路由器"这个子网里有人想看哪个频道"。

IGMPv1(RFC 1112):最简版

  • 主机加入组播组时发 Membership Report(成员报告)
  • 路由器周期性发 General Query(通用查询)问"还有人想看吗?"
  • 主机收到查询后回复 Report
  • 问题:没有离开机制!主机悄悄走了,路由器继续转发流量,浪费带宽直到查询超时

IGMPv2(RFC 2236):加入离开机制

  • 新增 Leave Group Message(离开组消息)
  • 主机离开组时主动通知路由器
  • 路由器收到 Leave 后发 Specific Query(特定组查询)确认是否还有其他人想看
  • 如果没人回复,路由器停止向该子网转发此组播流

IGMPv3(RFC 3376):源特定组播(SSM)

  • 主机可以指定"我只想看来自 特定源 的组播"
  • 例如:"我要加入 232.1.1.1,但只接收来自 10.0.0.1 的流"
  • 支持 INCLUDE(只看这些源)和 EXCLUDE(不看这些源)模式
  • 彻底解决了组播源伪造问题

IGMP 工作流程示例

主机 A 想看直播(加入 239.1.2.3):
→ 发 IGMPv2 Membership Report(目的 239.1.2.3)

路由器收到后:
→ 记录"eth0 子网有 239.1.2.3 的成员"
→ 向上游请求 239.1.2.3 的组播流
→ 收到流后向 eth0 转发

主机 A 不想看了:
→ 发 IGMPv2 Leave(目的 224.0.0.2)

路由器收到 Leave:
→ 向 eth0 发 Specific Query:"还有人看 239.1.2.3 吗?"
→ 3 秒内无人回复 → 停止向 eth0 转发 239.1.2.3

IGMPv1 与 IGMPv2+ 的关键差异就在这个状态图上:IGMPv1 没有 Leaving 机制,主机离开后路由器继续转发流量,直到查询超时(通常 3 分钟左右)。对于频繁切换频道的场景,这会造成大量带宽浪费。

MLD:IPv6 的 IGMP 替代者

IPv6 没有广播,组播更重要。MLD(Multicast Listener Discovery)集成在 ICMPv6 中:

ICMPv6 类型对应 IGMPv2
130Query(通用/特定查询)
131Report(成员报告)
132Done(离开,对应 Leave)

MLDv2(RFC 3810)对应 IGMPv3,支持源过滤。

IGMP Snooping:交换机的组播优化

如果没有 IGMP Snooping,交换机收到组播帧后会泛洪到所有端口(除了入端口),就像大喇叭广播,整个楼层都听见。

开启 IGMP Snooping 后,交换机"偷听"主机和路由器之间的 IGMP 对话,建立组播转发表:

组播 MAC: 01:00:5e:01:02:03
转发端口: eth1, eth3, eth5

只有订阅了该组播的端口才会收到流量,其他端口不受影响。

上图直观展示了 IGMP Snooping 的价值:没有它,组播流量像广播一样泛洪到所有端口;有了它,交换机只转发给订阅端口,节省带宽、降低主机 CPU 负担。

注意:IGMP Snooping 需要交换机能识别 IP 层(三层信息),严格来说是"二层设备做三层偷听"。

本篇小结

  • 组播是一对特定群体的通信,节省服务器带宽
  • IPv4 组播地址 224.0.0.0/4,映射到 MAC 01:00:5e:xx:xx:xx
  • IGMPv1 只有加入和查询;IGMPv2 增加离开机制;IGMPv3 支持源过滤(SSM)
  • MLD 是 IPv6 的 IGMP,集成在 ICMPv6 中
  • IGMP Snooping 让交换机智能转发组播,避免泛洪

动手实践

  1. 查看本机加入的组播组:

    # Windows
    netsh interface ip show joins
    
    # Linux
    ip maddr
    
  2. Wireshark 过滤 igmp,观察 Membership Report 和 Leave 报文

  3. 在支持组播的路由器/交换机上查看 IGMP Snooping 表:

    # Cisco
    show ip igmp snooping groups
    
  4. 思考:为什么 IGMPv1 没有离开机制会导致带宽浪费?如果 100 台主机轮流加入又离开,IGMPv1 和 IGMPv2 的表现差异有多大?

上一页
NDP 协议详解
下一页
VRRP 与网关冗余