📚 前置知识(先确认你会这些)
| 知识点 | 你需要知道 |
|---|---|
| IP地址分类 | A/B/C/D/E类地址的区别 |
| MAC地址 | 48位二层地址,以太网帧使用 |
| 单播路由 | 路由器如何查表转发数据包 |
| 子网/网段 | 什么是广播域、什么是路由器隔离 |
| 基本命令行 | 华为VRP系统的基本操作 |
如果你还不熟悉以上概念,建议先学习HCNA/HCIP-Datacom的基础路由模块。
第一部分:组播是什么?
1.1 生活中的比喻
想象你在一个微信群里发消息:
| 通信方式 | 生活比喻 | 特点 |
|---|---|---|
| 单播 | 私聊 | 你发10条私聊给10个人,发送10次 |
| 广播 | 大喇叭全村广播 | 全村人都听见,不管想不想听 |
| 组播 | 微信群发 | 只发给群里的人,没进群的人收不到 |
组播的核心价值:发送方只发一次,网络自动复制给所有需要的人。
1.2 技术定义
组播(Multicast):一种一对多的通信技术,发送者向一个"组地址"发送一份数据,网络中的路由器根据组成员的位置,在合适的地方复制数据,只发送给加入该组的接收者。
1.3 为什么不用广播代替组播?
❌ 广播的问题: - 路由器会阻断广播(不能跨网段) - 所有主机都要处理广播包(CPU浪费) - 造成广播风暴 ✅ 组播的优势: - 可以跨网段传输 - 只有加入组的主机才会接收 - 发送方只发一份,节省上游带宽第二部分:组播地址体系
2.1 IPv4组播地址范围(D类地址)
224.0.0.0 ~ 239.255.255.255 即:1110xxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx 前缀:1110(二进制)= 224(十进制开始)2.2 组播地址分段详解(必须背下来)
| 地址范围 | 名称 | 用途 |
|---|---|---|
224.0.0.0 ~ 224.0.0.255 | 本地链路组播 | 不跨路由器,用于协议本身(如OSPF、PIM Hello) |
224.0.1.0 ~ 231.255.255.255 | 全局范围组播 | 可跨Internet |
232.0.0.0 ~ 232.255.255.255 | SSM专用 | 源特定组播(IGMPv3使用) |
233.0.0.0 ~ 233.255.255.255 | GLOP地址 | 基于AS号的静态分配 |
239.0.0.0 ~ 239.255.255.255 | 私有组播 | 类似192.168.x.x,企业内部使用,不会进入公网 |
常见保留地址:
| 地址 | 用途 |
|---|---|
224.0.0.1 | 所有主机(All Hosts) |
224.0.0.2 | 所有路由器(All Routers) |
224.0.0.5 | OSPF路由器 |
224.0.0.6 | OSPF DR/BDR |
224.0.0.9 | RIP-2路由器 |
224.0.0.13 | 所有PIM路由器 |
224.0.0.18 | VRRP |
224.0.0.22 | 所有IGMPv3路由器 |
2.2 组播MAC地址映射
问题:以太网帧的目的MAC地址决定了帧被谁接收。组播IP地址如何变成MAC地址?
映射公式:
组播MAC = 01-00-5E-XX-XX-XX具体步骤:
步骤1:取组播IP地址的后23位 步骤2:在前面加上固定的25位:00000001-00000000-01011110-0 步骤3:组合成48位MAC地址 示例: 组播IP:224.1.1.1 二进制:11100000.00000001.00000001.00000001 后23位: 0000000.00000001.00000001 MAC: 00000001-00000000-01011110-00000000-00000001-00000001 即:01-00-5E-00-01-01为什么有32:1的冲突?
组播IP有28位可变(32-4位固定前缀1110) MAC只有23位来自IP 28 - 23 = 5位丢失 2^5 = 32个IP可能映射到同一个MAC第三部分:组播转发的基础机制
3.1 单播转发 vs 组播转发
单播转发(你熟悉的):
数据包:源IP = 10.1.1.1,目的IP = 10.2.2.2 路由器动作:查路由表,找"如何到达10.2.2.2" → 确定出接口,转发出去组播转发(新问题):
数据包:源IP = 10.1.1.1,目的IP = 224.1.1.1(组播组) 路由器困惑: 1. 224.1.1.1不是一台具体主机,路由表里没有! 2. 可能有多个接收者在不同接口下 3. 怎么防止环路?(组播包复制后可能绕回来)3.2 RPF检查(Reverse Path Forwarding,逆向路径转发)
这是组播防环的核心机制!
场景:路由器R1收到一个组播包,源IP是10.1.1.1,从接口G0/0/1进入。
RPF检查三步骤:
步骤1:提取源IP地址(10.1.1.1) 步骤2:查单播路由表:"我到10.1.1.1应该从哪个接口出去?" 假设查表结果:最优路径出接口是G0/0/1 步骤3:比较 如果"查表得到的接口" == "报文实际进入的接口" → RPF通过,可以转发 如果"查表得到的接口" != "报文实际进入的接口" → RPF失败,丢弃报文!为什么这样能防环?
假设网络中有环路: R1 ←→ R2 ←→ R3 ←→ R1 源在R1后面,R1从G0/0/1收到 R1转发给R2,R2转发给R3,R3又转发给R1 当R1再次收到这个包时: - 源IP还是原来的源 - 但入接口变成了G0/0/2(来自R3) - 查表到源的最优路径还是G0/0/1 - G0/0/2 != G0/0/1 → 丢弃!RPF路由来源优先级(如果有多条路径到源):
优先级1:组播静态路由(ip rpf-route-static) 优先级2:MBGP路由(组播专用的BGP) 优先级3:单播路由表(默认使用)第四部分:IGMP协议详解(主机如何加入组)
4.1 为什么需要IGMP?
问题:路由器怎么知道它的哪个接口下面有组播接收者?
答案:主机通过IGMP协议主动告诉路由器:“我想接收某个组的流量”。
运行位置:主机 ←→ 直连路由器(同一网段内,不跨路由)
4.2 IGMPv1(最原始版本)
两种报文:
| 报文类型 | 发送者 | 目的地址 | 作用 |
|---|---|---|---|
| Report(成员报告) | 主机 | 组播组地址G | “我要加入组G” |
| Query(普遍组查询) | 路由器 | 224.0.0.1 | “你们还在吗?” |
完整工作流程:
【主机加入组】 主机A想接收224.1.1.1的流量 ↓ 主机A发送IGMP Report 目的IP = 224.1.1.1 目的MAC = 01-00-5E-00-01-01 ↓ 路由器收到后,记录:"G0/0/1接口下有224.1.1.1的组成员" ↓ 路由器开始转发224.1.1.1的流量到G0/0/1接口 【路由器维护】 路由器每60秒发送一次普遍组查询(General Query) 目的IP = 224.0.0.1(所有主机) ↓ 如果主机还在组内,就回复Report ↓ 如果路由器130秒内没收到某个组的Report → 认为该组没人了,停止转发 【主机离开】 主机A直接关闭应用,**不发任何消息**! ↓ 路由器等到130秒超时后,才停止转发 → 离开延迟很大!IGMPv1的缺陷:
- 离开不通知,130秒后才停止转发(带宽浪费)
- 没有查询器选举,多台路由器会都发Query(混乱)
- 只能加入组,不能选择接收哪个源的流量
4.3 IGMPv2(最常用版本)⭐
四种报文:
| 报文类型 | 发送者 | 目的地址 | 作用 |
|---|---|---|---|
| Report | 主机 | 组播组地址G | “我要加入组G” |
| Leave | 主机 | 224.0.0.2 | “我要离开组G” |
| General Query | 查询器路由器 | 224.0.0.1 | 查询所有组 |
| Specific Query | 查询器路由器 | 组播组地址G | 查询特定组 |
完整工作流程:
【主机加入组】(同v1) 主机发送Report → 路由器记录 → 开始转发 【主机离开组】(重大改进!) 主机A要离开224.1.1.1 ↓ 主机A发送Leave报文 目的IP = 224.0.0.2(所有路由器组) ↓ 路由器收到Leave后,不能立即停止!(因为可能有其他主机也在该组) ↓ 路由器发送Specific Query(特定组查询) 目的IP = 224.1.1.1 间隔1秒,连续发2次 ↓ 如果还有其他主机在组内,它们会回复Report ↓ 如果2秒内没有任何Report → 确认该组无成员,立即停止转发! → 离开延迟从130秒降到2秒! 【查询器选举】(解决多路由器冲突) 网段内有R1(10.1.1.1)和R2(10.1.1.2) ↓ 初始都认为自己是查询器,都发General Query ↓ R1收到R2的Query,比较IP地址 10.1.1.1 < 10.1.1.2 → R1成为查询器 ↓ R2收到R1的Query,发现对方IP更小 → R2成为非查询器,停止发Query ↓ 非查询器启动125秒定时器 如果125秒内没收到查询器的Query → 认为查询器挂了,重新选举IGMPv2 vs v1 对比表:
| 功能 | IGMPv1 | IGMPv2 |
|---|---|---|
| 加入机制 | Report | Report(相同) |
| 离开机制 | 静默离开,130秒超时 | 主动Leave,2秒确认 |
| 查询类型 | 只有普遍组查询 | 普遍组查询 +特定组查询 |
| 查询器选举 | 没有,依赖PIM | 自动选举,IP小优先 |
| 报文类型 | 2种 | 4种 |
| 实际使用 | 已淘汰 | 主流版本 |
4.4 IGMPv3(支持特定源组播)
核心增强:主机可以指定"我只接收来自某个特定源的组播流量"。
应用场景:
- 电视台A和电视台B都在发送"体育频道"(组224.1.1.1)
- 用户只想看电视台A的体育频道,不想看电视台B的
- IGMPv3可以精确过滤
Report报文格式变化:
IGMPv3 Report包含: - 组地址:224.1.1.1 - 过滤模式:INCLUDE(只接收列出的源)或 EXCLUDE(排除列出的源) - 源列表:[10.1.1.10, 10.1.1.20]示例:
主机发送Report: 组 = 224.1.1.1 模式 = INCLUDE 源列表 = [10.1.1.10] 含义:我只接收源10.1.1.10发送到224.1.1.1的流量SSM地址范围:232.0.0.0/8专门用于IGMPv3的源特定组播
4.5 IGMP Snooping(二层交换机优化)
问题:交换机收到组播帧怎么办?
默认行为:泛洪! 原因:组播MAC在交换机的MAC地址表中没有记录 结果:同一个VLAN内,不管想不想接收,所有主机都收到IGMP Snooping原理:
交换机"偷听"(Snoop)主机和路由器之间的IGMP报文 ↓ 记录哪个接口收到了Report(表示该接口下有组成员) ↓ 建立二层组播转发表: 组播MAC 01-00-5E-00-01-01 → 出接口:G0/0/1, G0/0/3 ↓ 后续收到该组播MAC的帧,只转发到记录的接口 ↓ 不再泛洪,节省带宽!第五部分:PIM协议详解(路由器之间如何转发组播)
5.1 PIM基本概念
PIM(Protocol Independent Multicast):
- 协议无关:不维护自己的拓扑,直接使用单播路由表做RPF检查
- 两种模式:DM(密集模式)和SM(稀疏模式)
PIM接口配置:
[Router] multicast routing-enable ← 全局使能组播路由(必须先做!) [Router] interface GigabitEthernet0/0/1 [Router-GigabitEthernet0/0/1] pim dm ← 接口使能PIM-DM 或 [Router-GigabitEthernet0/0/1] pim sm ← 接口使能PIM-SM5.2 PIM邻居发现(Hello机制)
所有PIM路由器启动后自动发送Hello报文:
目的IP:224.0.0.13(所有PIM路由器) 发送间隔:30秒 保持时间:105秒(3.5倍Hello间隔)Hello报文携带信息:
- 优先级(默认1,可配置)
- Holdtime
- 生成ID(用于检测邻居重启)
DR选举(在共享网段,如以太网):
比较Hello中的优先级,优先级高者成为DR 如果优先级相同,IP地址大者成为DR DR的作用: - PIM-DM:发起Assert竞选 - PIM-SM:负责发送Register和Join报文5.3 PIM-DM(密集模式)完整流程
适用场景:接收者密集,大多数子网都有接收者(如企业内网全员会议)
核心机制:泛洪-剪枝(Flood & Prune)
阶段一:邻居建立
R1、R2、R3启动PIM-DM ↓ 互相发送Hello,建立PIM邻居关系 ↓ 形成邻居表: 邻居IP 接口 优先级 10.1.1.2 G0/0/1 1 10.1.1.3 G0/0/2 1阶段二:首次泛洪(First Flood)
组播源S(10.10.10.10)开始发送流量到组G(224.1.1.1) ↓ 源DR(离源最近的路由器R1)收到流量 ↓ R1执行RPF检查:入接口是否朝向源的最优路径?是,通过。 ↓ R1向**所有PIM邻居接口**(除了RPF接口)泛洪 → 发给R2和R3 ↓ R2收到后,继续向自己的所有PIM邻居泛洪(除了来时的接口) ↓ 流量到达全网所有路由器阶段三:剪枝(Prune)
叶子路由器R4检查:我的接口下有加入组G的主机吗? ↓ 情况A:有主机加入 → 保持转发,什么都不做 情况B:没有主机加入,也没有下游PIM邻居需要 → R4向上游R2发送Prune报文 "我不需要组G的流量,请剪枝我" ↓ R2收到Prune后: 将连接R4的接口从出接口列表中移除 ↓ R2检查:如果我现在所有下游接口都被剪枝了 → R2继续向上游R1发送Prune ↓ 逐层向上剪枝,直到只剩有接收者的分支剪枝报文格式:
Upstream Neighbor: R2的地址(告诉R2剪哪个接口) Joined/Pruned State: Source: 10.10.10.10 Group: 224.1.1.1 Action: Prune阶段四:嫁接(Graft)
被剪枝的网段突然有新主机加入组G ↓ 主机发送IGMP Report ↓ R4(叶子路由器)收到Report,但自己已经被剪枝了,没有流量 ↓ R4不能等下一次泛洪(默认210秒才泛洪一次) ↓ R4立即向上游R2发送Graft报文 "快恢复给我转发!" ↓ R2收到Graft,立即恢复转发 并回复Graft-Ack确认 ↓ 如果R2之前也向上游剪枝了,R2继续向上游发Graft ↓ 流量立即恢复,无需等待!阶段五:状态刷新(State Refresh)
剪枝状态不是永久的! 默认每210秒,剪枝状态会超时 ↓ 超时后,路由器会再次泛洪 ↓ 没有接收者的分支再次剪枝 ↓ 周而复始...Assert机制(多路访问网络)
问题:R2和R3都连接到同一个以太网,都收到上游泛洪 都可能向下游转发,导致下游收到重复流量 ↓ 解决:发送Assert报文竞选 ↓ 竞选规则: 1. 比较到源的单播路由优先级(Preference),小者胜 2. 优先级相同,比较到源的开销(Cost),小者胜 3. 开销相同,比较IP地址,大者胜 ↓ 胜者继续转发,败者剪枝PIM-DM的(S,G)表项:
display pim routing-table (S, G) = (10.10.10.10, 224.1.1.1) Protocol: pim-dm Flag: ACT UpTime: 00:05:30 Expire: 00:02:10 Upstream interface: GigabitEthernet0/0/0 ← RPF接口(朝向源) Upstream neighbor: 10.1.1.1 ← 上游邻居 Downstream interface list: ← 下游出接口 1: GigabitEthernet0/0/1 2: GigabitEthernet0/0/2 (Pruned) ← 被剪枝的接口5.4 PIM-SM(稀疏模式)完整流程 ⭐⭐⭐
适用场景:接收者稀疏分布(如Internet IPTV、跨省会议)
核心思想:不泛洪!按需建立路径,没有接收者的地方绝不发送流量。
必须角色:RP(Rendezvous Point,汇聚点)
RP是什么?
RP = 组播流量的"中转站" / " rendezvous( rendezvous = 会合点)" 所有组播源先把流量送到RP 所有接收者先到RP去"领取"流量 RP是连接源和接收者的桥梁关键角色总结
| 角色 | 位置 | 职责 |
|---|---|---|
| 源DR | 离组播源最近的路由器 | 负责把源的流量注册给RP |
| 接收者DR | 离接收者最近的路由器 | 负责向RP发送加入请求 |
| RP | 网络中某台指定路由器 | 接收注册,分发流量,是共享树的根 |
完整工作流程(分步骤详解)
步骤0:网络准备
配置所有路由器: [Router] multicast routing-enable [Router] interface GigabitEthernet0/0/1 [Router-GigabitEthernet0/0/1] pim sm 配置RP(三种方式): 方式A - 静态RP: [Router] pim [Router-pim] static-rp 10.1.1.100 方式B - BSR动态(见后文)步骤1:建立RPT(Rendezvous Point Tree,共享树)——接收者侧
主机A想接收组G(224.1.1.1)的流量 ↓ 主机A发送IGMP Report ↓ 接收者DR(R4)收到IGMP Report ↓ R4查询:组G对应的RP是谁? (查静态配置或BSR通告,假设RP = 10.1.1.100) ↓ R4向RP方向发送(*, G) Join报文 * = 任意源(Any Source) 报文逐跳转发,目的IP = 224.0.0.13(PIM路由器) ↓ R3收到(*, G) Join: 记录下游接口(收到Join的接口) 继续向RP方向转发Join ↓ R2收到(*, G) Join: 同样记录,继续转发 ↓ RP收到(*, G) Join: 记录下游接口 此时RPT建立完成! 树的路径:RP → R2 → R3 → R4 → 主机A(*, G) 表项:
(*, 224.1.1.1) Upstream interface: 朝向RP的接口 Upstream neighbor: 朝向RP的下一跳 Downstream interface list: 收到Join的接口步骤2:源注册(Source Registration)——源侧
组播源S(10.10.10.10)开始发送流量到组G(224.1.1.1) ↓ 源DR(R1)收到组播流量 ↓ R1检查:我有该组的下游接收者吗? 没有!RPT还没延伸到我这里 ↓ R1不能丢弃,否则接收者永远收不到 ↓ R1将组播流量封装在**单播Register报文**中 源IP = R1的地址 目的IP = RP的地址(10.1.1.100) payload = 原始组播包(源10.10.10.10,目的224.1.1.1) ↓ Register报文通过单播路由到达RP ↓ RP收到Register后: a) 解封装,恢复原始组播包 b) 沿RPT转发给所有接收者(R4方向) c) 同时,向源方向发送(S, G) Join!为什么RP要发(S, G) Join?
RP知道源是10.10.10.10 RP向源方向发送(S, G) Join S = 10.10.10.10, G = 224.1.1.1 ↓ 沿途路由器R2收到(S, G) Join: 建立(S, G)表项 继续向源方向转发 ↓ R1收到(S, G) Join: 记录下游接口 现在从源到RP的源树分支建立了! ↓ R1开始沿原生组播路径向RP转发流量(不再封装) ↓ RP收到原生组播流量后,向R1发送Register-Stop报文 "别再用单播封装了,原生路径已建立!" ↓ R1停止发送Register报文步骤3:流量转发路径
源S(10.10.10.10) ↓ 源DR(R1) ---原生组播---> R2 ---原生组播---> RP ↓ 沿RPT转发 ↓ RP ---> R2 ---> R3 ---> R4(接收者DR) ---> 主机A步骤4:RPT向SPT切换(可选优化)
问题:RP是固定点,RP到接收者的路径可能不是最优的! 示例: 源在北京,接收者在上海,RP被配置在广州 路径:北京→广州→上海(绕远路!) 最优路径应该是:北京→上海(直连)切换机制:
接收者DR(R4)收到组播流量后,统计速率 ↓ 当速率超过阈值(默认是0,表示立即切换) 或管理员手动配置 ↓ R4向源S(10.10.10.10)方向发送(S, G) Join 不是向RP,而是直接向源! ↓ 沿途建立(S, G)表项,形成从源到R4的最短路径树(SPT) ↓ R4同时沿RPT向RP发送(S, G) Prune "我不再需要经过RP的路径了" ↓ RP收到Prune后,剪除到R4的分支 ↓ 最终流量路径:源 → R1 → R2 → R4 → 主机(最优路径!)切换命令:
[Router] pim [Router-pim] spt-switch-threshold 0 ← 0表示立即切换(默认) [Router-pim] spt-switch-threshold 1000 ← 流量超过1000kbps才切换 [Router-pim] spt-switch-threshold infinity ← 永远不切换5.5 RP发现机制详解
方式一:静态RP(最简单)
在所有PIM-SM路由器上配置: [Router] pim [Router-pim] static-rp 10.1.1.100 优点:简单,无需额外协议 缺点: - RP单点故障(没有备份) - 网络变化需手动修改所有路由器 - 不同组不能配置不同RP方式二:BSR(Bootstrap Router,标准协议)
三个角色:
| 角色 | 说明 |
|---|---|
| BSR | 负责收集和分发RP信息(类似DHCP服务器的角色) |
| C-BSR | 候选BSR,参与BSR选举 |
| C-RP | 候选RP,向BSR报告自己能服务哪些组 |
BSR选举过程:
步骤1:C-BSR配置 [Router] pim [Router-pim] c-bsr GigabitEthernet0/0/1 30 (接口 + Hash掩码长度,优先级隐含在配置中) 步骤2:C-BSR互相发送Bootstrap报文 目的IP = 224.0.0.13 携带:优先级、BSR地址 步骤3:竞选规则 优先级高者胜 优先级相同,IP地址大者胜 步骤4:胜者成为BSR,周期性泛洪Bootstrap报文 让全网知道"我是BSR"C-RP通告过程:
步骤1:C-RP配置 [Router] pim [Router-pim] c-rp GigabitEthernet0/0/2 group-policy 2000 (接口 + ACL过滤能服务的组范围 + 优先级) 步骤2:C-RP向BSR单播发送Advertisement报文 携带:RP地址、服务的组范围、优先级、保持时间 步骤3:BSR汇总所有C-RP信息,生成RP-Set 步骤4:BSR将RP-Set封装在Bootstrap报文中 泛洪到全网所有PIM-SM路由器RP选择算法:
路由器收到RP-Set后,为每个组播组计算RP: 1. 筛选出服务范围包含该组的C-RP 2. 使用Hash算法计算: Hash值 = (组地址 + 掩码长度 + C-RP地址 + 优先级) 取模 3. 选择Hash值最大的C-RP作为该组的RP 4. 结果:每个组有且只有一个RP,但不同组可以映射到不同RP(负载分担)BSR配置示例:
# Router1 作为BSR和RP [Router1] acl number 2000 [Router1-acl-basic-2000] rule permit source 224.0.0.0 15.255.255.255 [Router1-acl-basic-2000] quit [Router1] pim [Router1-pim] c-bsr GigabitEthernet0/0/1 30 [Router1-pim] c-rp GigabitEthernet0/0/2 group-policy 2000 # Router2 仅作为RP备份 [Router2] pim [Router2-pim] c-rp GigabitEthernet0/0/2 group-policy 2000 # 其他路由器无需任何RP配置,自动通过BSR学习第六部分:完整配置实验(从零开始)
实验拓扑
[Source]10.10.10.10 | [R1]源DR / \ [R2] [R3] \ / [R4]RP/BSR | [R5]接收者DR | [Host]接收者基础配置(IP地址已配好,只写组播相关)
R1(源DR):
[R1] multicast routing-enable [R1] interface GigabitEthernet0/0/0 # 连接Source [R1-GigabitEthernet0/0/0] pim sm [R1] interface GigabitEthernet0/0/1 # 连接R2 [R1-GigabitEthernet0/0/1] pim sm [R1] interface GigabitEthernet0/0/2 # 连接R3 [R1-GigabitEthernet0/0/2] pim sm [R1] pim [R1-pim] c-bsr GigabitEthernet0/0/0 30 [R1-pim] c-rp GigabitEthernet0/0/0 group-policy 2000R2、R3(中间路由器):
[Rx] multicast routing-enable [Rx] interface GigabitEthernet0/0/0 # 连接R1 [Rx-GigabitEthernet0/0/0] pim sm [Rx] interface GigabitEthernet0/0/1 # 连接R4 [Rx-GigabitEthernet0/0/1] pim smR4(RP/BSR - 假设RP地址在这里):
[R4] multicast routing-enable [R4] interface GigabitEthernet0/0/0 # 连接R2 [R4-GigabitEthernet0/0/0] pim sm [R4] interface GigabitEthernet0/0/1 # 连接R3 [R4-GigabitEthernet0/0/1] pim sm [R4] interface GigabitEthernet0/0/2 # 连接R5 [R4-GigabitEthernet0/0/2] pim sm [R4] pim [R4-pim] c-bsr GigabitEthernet0/0/2 30 [R4-pim] c-rp GigabitEthernet0/0/2 group-policy 2000R5(接收者DR):
[R5] multicast routing-enable [R5] interface GigabitEthernet0/0/0 # 连接R4 [R5-GigabitEthernet0/0/0] pim sm [R5] interface GigabitEthernet0/0/1 # 连接接收者网段 [R5-GigabitEthernet0/0/1] pim sm [R5-GigabitEthernet0/0/1] igmp enable [R5-GigabitEthernet0/0/1] igmp version 2第七部分:验证与排障命令
7.1 必会查看命令
# 1. 查看PIM邻居(确认邻居关系建立)display pim neighbor# 2. 查看PIM接口状态display pim interface# 3. 查看IGMP组成员(确认主机加入)display igmp group# 4. 查看IGMP接口状态display igmp interface# 5. 查看PIM路由表(核心!)display pim routing-table# 6. 查看组播RPF信息display multicast rpf-info10.10.10.10# 7. 查看BSR信息display pim bsr-info# 8. 查看RP信息display pim rp-info# 9. 查看组播数据包统计display multicast forwarding-table7.2 排障思路
问题:接收者收不到组播流量
排查步骤: 1. 检查IGMP(主机到接收者DR) display igmp group → 有没有该组的记录? → 没有:检查主机是否发送了Report,检查IGMP是否使能 2. 检查PIM邻居(路由器之间) display pim neighbor → 邻居是否建立? → 没有:检查接口是否使能PIM,检查Hello是否被ACL阻断 3. 检查RPT是否建立(接收者DR到RP) display pim routing-table → 有没有(*, G)表项? → 没有:检查RP是否可达,检查Join报文是否被转发 4. 检查源注册(源DR到RP) 在RP上:display pim routing-table → 有没有(S, G)表项? → 没有:检查源DR是否发送Register,检查到源的路由 5. 检查RPF(最常见问题!) display multicast rpf-info 源IP地址 → RPF接口是否正确? → 如果不正确:检查单播路由表,检查是否有组播静态路由覆盖第八部分:学习路径建议
第一阶段:理解概念(1-2天)
- 理解单播/广播/组播的区别(用生活比喻)
- 背下组播地址范围(224-239)
- 理解MAC映射和32:1冲突
- 理解RPF检查的原理和作用
第二阶段:掌握IGMP(1-2天)
- 理解为什么需要IGMP
- 对比v1/v2/v3的区别(重点v2)
- 掌握IGMPv2的完整流程(加入、离开、查询、选举)
- 理解IGMP Snooping的作用
第三阶段:掌握PIM-DM(1天)
- 理解泛洪-剪枝-嫁接机制
- 理解Assert机制
- 能画出PIM-DM的转发树形成过程
第四阶段:掌握PIM-SM(3-4天)⭐重点
- 理解RP的作用
- 理解RPT和SPT的区别
- 掌握完整的PIM-SM流程(Join → Register → 转发 → SPT切换)
- 掌握BSR机制
- 能在模拟器上独立完成配置实验
第五阶段:综合练习(2-3天)
- 做HCIP组播相关真题
- 在eNSP/PNETlab上搭建复杂拓扑实验
- 练习排障命令和思路
📌 核心知识点速查表
| 知识点 | 一句话总结 |
|---|---|
| 组播地址 | 224.0.0.0/4,D类地址 |
| 组播MAC | 01-00-5E + IP后23位 |
| RPF | 查源IP,入接口必须等于最优出接口 |
| IGMPv2 | 加入Report,离开Leave,查询器IP小优先 |
| IGMPv3 | 支持SSM,可指定接收哪个源的流量 |
| PIM-DM | 泛洪-剪枝-嫁接,无RP,适合密集 |
| PIM-SM | 拉模式,必须RP,RPT→SPT切换,适合稀疏 |
| RP | 组播中转站,源注册到这里,接收者加入到这里 |
| BSR | 自动选举和分发RP信息的标准协议 |
| SPT切换 | 接收者DR直接向源建立最优路径,绕过RP |
| DR | 共享网段中负责发Register/Join的路由器 |