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.5 | OSPF 路由器 |
224.0.0.9 | RIPv2 路由器 |
224.0.0.13 | PIM 路由器 |
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 |
|---|---|
| 130 | Query(通用/特定查询) |
| 131 | Report(成员报告) |
| 132 | Done(离开,对应 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 让交换机智能转发组播,避免泛洪
动手实践
查看本机加入的组播组:
# Windows netsh interface ip show joins # Linux ip maddrWireshark 过滤
igmp,观察 Membership Report 和 Leave 报文在支持组播的路由器/交换机上查看 IGMP Snooping 表:
# Cisco show ip igmp snooping groups思考:为什么 IGMPv1 没有离开机制会导致带宽浪费?如果 100 台主机轮流加入又离开,IGMPv1 和 IGMPv2 的表现差异有多大?