第146篇:PIM-DM 与 PIM-SM 组播路由协议
关键词:PIM-DM、PIM-SM、组播路由、泛洪剪枝、RPT、SPT、组播树、华为
一、引言
第144篇和第145篇分别介绍了 IGMP 和 IGMP Snooping——它们解决的是局域网内主机与路由器之间、交换机感知组播的问题。但当组播流量需要跨越多个子网、经过多台路由器时,就需要组播路由协议来建立和维护跨子网的组播转发树。
PIM(Protocol Independent Multicast,协议无关组播)是目前应用最广泛的组播路由协议。所谓"协议无关",是指 PIM 使用单播路由协议(如 OSPF、IS-IS、静态路由)提供的反向路径信息来构建组播树,而不依赖特定的单播路由协议。
二、核心概念
2.1 PIM 两大模式对比
| 特性 | PIM-DM(密集模式) | PIM-SM(稀疏模式) |
|---|---|---|
| 转发模型 | Push(推送),先泛洪后剪枝 | Pull(拉取),按需加入 |
| 适用网络 | 组播接收者密集的网络 | 组播接收者稀疏的网络 |
| 初始行为 | 向所有方向泛洪组播数据 | 不转发,等待接收者加入 |
| 控制报文 | Prune(剪枝)、Graft(重嫁接) | Join(加入)、Prune(剪枝)、Register(注册) |
| 带宽消耗 | 初期大(泛洪),剪枝后减小 | 始终精准,带宽效率高 |
| 收敛速度 | 剪枝/重嫁接有延迟 | 初始加入有延迟 |
| 典型场景 | 小型局域网、接收者均匀分布 | 园区网、广域网、IPTV |
2.2 PIM-DM 工作原理:泛洪与剪枝

PIM-DM 的工作流程: 1. 泛洪:组播源开始发送数据,PIM-DM 路由器立即向所有 PIM 接口(反向路径除外)泛洪 2. 剪枝:下游没有组播接收者的路由器发送 Prune 报文给上游,上游停止向该方向转发 3. 重嫁接(Graft):剪枝后有新的接收者加入,下游路由器发送 Graft 报文请求恢复转发 4. 周期性剪枝:Prune 有时效性,超时后恢复泛洪,需要重新剪枝
2.3 PIM-SM 工作原理:注册与加入
PIM-SM 引入的核心概念是 RP(Rendezvous Point,汇集点)。所有组播源和接收者都通过 RP 建立联系。

关键流程详解
- 源注册(Register):源侧 DR(Designated Router)收到组播数据后,将数据封装在 PIM Register 报文中,以单播方式发送给 RP
- RPT 树建立(*,G):接收者通过 IGMP 报告加入组播组,接收者侧 DR 向 RP 发送 Join,建立 RP→接收者的共享树(RPT)
- SPT 切换(S,G):为优化路径,接收者侧 DR 可以直接向组播源发送 Join,建立源→接收者的最短路径树(SPT)。RP 向源侧发送 RPT Prune,停止从 RP 转发
2.4 组播树的两种形态
| 属性 | SPT(源树) | RPT(共享树) |
|---|---|---|
| 根节点 | 组播源 | RP |
| 表示方式 | (S, G) | (*, G) |
| 路径 | 最优(最短路径) | 可能绕道 RP |
| 路由表项 | 每个源独立(多) | 共享(少) |
| 延迟 | 低 | 可能较高 |
| 切换 | PIM-SM 支持 RPT→SPT 切换 | - |
三、技术细节
3.1 PIM-DM 配置
# ========== PIM-DM 配置 ==========
[HUAWEI] sysname PIM-DM-R1
# 全局使能组播路由
[PIM-DM-R1] multicast routing-enable
# 在接口上使能 PIM-DM
[PIM-DM-R1] interface Vlanif 10
[PIM-DM-R1-Vlanif10] ip address 10.1.10.1 255.255.255.0
[PIM-DM-R1-Vlanif10] pim dm
[PIM-DM-R1-Vlanif10] pim dm rp 10.1.10.1 group 239.0.0.0 255.0.0.0
# 配置剪枝/重嫁接超时时间
[PIM-DM-R1-Vlanif10] pim dm prune-timeout 60 # 剪枝超时60s
[PIM-DM-R1-Vlanif10] pim dm graft-ack-timeout 10 # Graft确认超时10s
3.2 PIM-SM 基本配置
# ========== PIM-SM 配置 ==========
[HUAWEI] sysname PIM-SM-R1
# 全局使能组播路由
[PIM-SM-R1] multicast routing-enable
# 在接口上使能 PIM-SM
[PIM-SM-R1] interface Vlanif 10
[PIM-SM-R1-Vlanif10] ip address 10.1.10.1 255.255.255.0
[PIM-SM-R1-Vlanif10] pim sm
# 配置 RP(静态方式)
[PIM-SM-R1] pim sm
[PIM-SM-R1-pim] static-rp 10.1.1.1 group 239.0.0.0 255.0.0.0
# 或者在接口上指定 RP
[PIM-SM-R1] interface Vlanif 10
[PIM-SM-R1-Vlanif10] pim sm rp 10.1.1.1
3.3 PIM-SM 的 SPT 切换阈值
PIM-SM 支持配置 SPT 切换的带宽阈值,当组播流的带宽超过阈值时,自动从 RPT 切换到 SPT。
# 配置 SPT 切换阈值(默认 0,即立即切换)
[PIM-SM-R1] pim sm
[PIM-SM-R1-pim] spt-threshold 0 # 立即切换
# [PIM-SM-R1-pim] spt-threshold 1000 # 带宽>1000kbps时切换
# [PIM-SM-R1-pim] spt-threshold 0 # 永不切换(固定RPT)
| 阈值 | 行为 | 适用场景 |
|---|---|---|
| 0(默认) | 立即切换 | 推荐,最优路径 |
| > 0 | 带宽超过阈值时切换 | 小流量走 RPT 节省资源 |
| never | 永不切换 | 所有流量走 RPT |
3.4 PIM 邻居关系
PIM 路由器之间通过 Hello 报文建立和维护邻居关系:
| 参数 | 默认值 | 说明 |
|---|---|---|
| Hello 间隔 | 30s | 发送 Hello 的间隔 |
| Hello 超时 | 3 × 间隔 + 10s | 未收到 Hello 的超时时间 |
| DR 优先级 | 0 | 值越大优先级越高 |
# 修改 PIM Hello 参数
[PIM-SM-R1] interface Vlanif 10
[PIM-SM-R1-Vlanif10] pim hello-interval 10 # Hello 间隔 10s
[PIM-SM-R1-Vlanif10] pim hello-byeway 40 # Hello 超时 40s
[PIM-SM-R1-Vlanif10] pim dr-priority 100 # DR 优先级 100
四、实战配置/案例分析
4.1 PIM-SM 完整组网配置
# ========== RP 设备(同时也是源侧路由器)==========
[HUAWEI] sysname RP-R1
# 使能组播路由
[RP-R1] multicast routing-enable
# 配置环回口作为 RP 地址
[RP-R1] interface LoopBack 0
[RP-R1-LoopBack0] ip address 10.1.1.1 255.255.255.255
# 配置接口 PIM-SM
[RP-R1] interface Vlanif 10
[RP-R1-Vlanif10] ip address 10.1.10.1 255.255.255.0
[RP-R1-Vlanif10] pim sm
[RP-R1] interface Vlanif 20
[RP-R1-Vlanif20] ip address 10.1.20.1 255.255.255.0
[RP-R1-Vlanif20] pim sm
# 配置静态 RP
[RP-R1] pim sm
[RP-R1-pim] static-rp 10.1.1.1
# ========== 中间路由器 ==========
[HUAWEI] sysname MID-R2
[MID-R2] multicast routing-enable
[MID-R2] interface Vlanif 20
[MID-R2-Vlanif20] ip address 10.1.20.2 255.255.255.0
[MID-R2-Vlanif20] pim sm
[MID-R2] interface Vlanif 30
[MID-R2-Vlanif30] ip address 10.1.30.1 255.255.255.0
[MID-R2-Vlanif30] pim sm
# 配置静态 RP(所有PIM路由器必须配置相同的RP)
[MID-R2] pim sm
[MID-R2-pim] static-rp 10.1.1.1
# ========== 接收者侧路由器 ==========
[HUAWEI] sysname DR-R3
[DR-R3] multicast routing-enable
[DR-R3] interface Vlanif 30
[DR-R3-Vlanif30] ip address 10.1.30.2 255.255.255.0
[DR-R3-Vlanif30] pim sm
[DR-R3] interface Vlanif 40
[DR-R3-Vlanif40] ip address 10.1.40.1 255.255.255.0
[DR-R3-Vlanif40] pim sm
[DR-R3-Vlanif40] igmp enable
# 配置静态 RP
[DR-R3] pim sm
[DR-R3-pim] static-rp 10.1.1.1
4.2 验证命令
# 查看 PIM 邻居
[RP-R1] display pim neighbor
# Neighbor Address: 10.1.20.2
# Interface: Vlanif20
# DR Priority: 1
# Type: PIM-SM
# Uptime: 01:23:45
# 查看 PIM 组信息
[RP-R1] display pim group
# Group Address: 239.1.1.1
# Type: Sparse
# RP Address: 10.1.1.1
# Uptime: 00:45:30
# 查看组播路由表
[RP-R1] display multicast routing-table
# Mrib items: 2
# (S, G) IncomingIF Age OutgoingIF List
# (*, 239.1.1.1) RP 00:45:30 Vlanif20
# (10.1.10.100, 239.1.1.1) Vlanif10 00:30:15 Vlanif20
# 查看 PIM 接口信息
[RP-R1] display pim interface
# Interface IP Address PIM Status Mode DR Address
# Vlanif10 10.1.10.1 Enable SM 10.1.10.1
# Vlanif20 10.1.20.1 Enable SM 10.1.20.2
4.3 故障案例:PIM-SM 组播不通
场景:部署 PIM-SM 组播网络后,接收者加入组播组 239.1.1.1,但无法收到组播数据。
排查过程:
# 1. 检查组播路由表
[RP-R1] display multicast routing-table
# 没有 (*, 239.1.1.1) 或 (S, 239.1.1.1) 表项
# ← 组播路由表为空!
# 2. 检查 PIM 邻居
[RP-R1] display pim neighbor
# Neighbor Address: 10.1.20.2 ← 邻居正常
[MID-R2] display pim neighbor
# Neighbor Address: 10.1.20.1 ← 与RP邻居正常
# Neighbor Address: 10.1.30.2 ← 与接收者侧邻居正常
# 3. 检查 RP 配置一致性
[RP-R1] display pim rp
# RP Address: 10.1.1.1
[DR-R3] display pim rp
# RP Address: 10.1.2.1 ← RP 地址不一致!
# 4. 检查静态 RP 配置
[DR-R3] display current-configuration | include static-rp
# static-rp 10.1.2.1 ← 配错了!
根因:接收者侧路由器 DR-R3 的静态 RP 配置为 10.1.2.1,而实际 RP 地址为 10.1.1.1。RP 地址不一致导致接收者侧的 Join 报文发往错误的 RP,组播流无法建立。
解决方案:
# 修正 RP 配置
[DR-R3] pim sm
[DR-R3-pim] undo static-rp 10.1.2.1
[DR-R3-pim] static-rp 10.1.1.1
# 验证
[DR-R3] display pim rp
# RP Address: 10.1.1.1 ← 一致
[DR-R3] display multicast routing-table
# (*, 239.1.1.1) RP(10.1.1.1) 00:00:30 Vlanif30 ← 已建立
4.4 故障案例:PIM-DM 剪枝超时导致周期性泛洪
场景:某小型园区使用 PIM-DM,非组播接收者所在的子网周期性(每 3 分钟)出现组播流量泛洪,导致带宽浪费。
排查过程:
# 1. 检查 PIM-DM 配置
[R1] display current-configuration | include pim dm
# pim dm
# pim dm prune-timeout 180 # 剪枝超时180秒
# 2. 检查 PIM 路由表状态
[R1] display pim routing-table
# (S,G) IncomingIF OutgoingIF State
# 10.1.10.100/239.1.1.1 Vlanif10 Vlanif20 Forward
# 10.1.10.100/239.1.1.1 Vlanif10 Vlanif30 Pruned ← 已剪枝
# 3. 观察 180 秒后
[R1] display pim routing-table
# 10.1.10.100/239.1.1.1 Vlanif10 Vlanif30 Forward ← 恢复泛洪!
# ← 剪枝超时,重新泛洪
根因:PIM-DM 的 Prune 具有时效性(默认 180s)。超时后自动恢复泛洪,需要下游路由器重新发送 Prune。在接收者长期不加入的情况下,这种"泛洪→剪枝→超时→再泛洪"的循环持续发生。
解决方案:
# 方案一:延长剪枝超时时间
[R1] interface Vlanif 30
[R1-Vlanif30] pim dm prune-timeout 600 # 延长到600秒
# 方案二(推荐):改用 PIM-SM
[R1] interface Vlanif 10
[R1-Vlanif10] undo pim dm
[R1-Vlanif10] pim sm
[R1] pim sm
[R1-pim] static-rp 10.1.1.1
# PIM-SM 不会出现周期性泛洪
五、总结
| 项目 | 说明 |
|---|---|
| PIM-DM | 泛洪+剪枝,适合接收者密集的小网络 |
| PIM-SM | 注册+加入,适合接收者稀疏的大网络 |
| RP | PIM-SM 的核心,所有源和接收者通过 RP 建立联系 |
| RPT | 共享树(*,G),以 RP 为根 |
| SPT | 源树(S,G),以组播源为根,路径最优 |
| SPT 切换 | PIM-SM 支持 RPT→SPT 切换,默认立即切换 |
| 故障排查 | 检查 RP 一致性、PIM 邻居、组播路由表 |
思考
-
PIM-DM 的泛洪+剪枝模型在初始阶段会造成带宽浪费。如果一个网络的组播接收者分布非常均匀(每个子网都有接收者),PIM-DM 是否反而比 PIM-SM 更高效?
-
PIM-SM 中,接收者先通过 RP(RPT 树)接收数据,再切换到 SPT。如果 SPT 切换后的路径经过的链路带宽小于 RPT 路径,是否会导致组播流卡顿?PIM-SM 会做带宽检查后再切换吗?
-
PIM 被称为"协议无关"组播。但如果单播路由表出现黑洞或不一致,PIM 组播转发会受到什么影响?
下篇预告:第147篇:RP(汇集点)的选举与配置