第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 工作原理:泛洪与剪枝 - 图示

PIM-DM 的工作流程: 1. 泛洪:组播源开始发送数据,PIM-DM 路由器立即向所有 PIM 接口(反向路径除外)泛洪 2. 剪枝:下游没有组播接收者的路由器发送 Prune 报文给上游,上游停止向该方向转发 3. 重嫁接(Graft):剪枝后有新的接收者加入,下游路由器发送 Graft 报文请求恢复转发 4. 周期性剪枝:Prune 有时效性,超时后恢复泛洪,需要重新剪枝

2.3 PIM-SM 工作原理:注册与加入

PIM-SM 引入的核心概念是 RP(Rendezvous Point,汇集点)。所有组播源和接收者都通过 RP 建立联系。

PIM-SM 工作原理:注册与加入 - 图示

关键流程详解

  1. 源注册(Register):源侧 DR(Designated Router)收到组播数据后,将数据封装在 PIM Register 报文中,以单播方式发送给 RP
  2. RPT 树建立(*,G):接收者通过 IGMP 报告加入组播组,接收者侧 DR 向 RP 发送 Join,建立 RP→接收者的共享树(RPT)
  3. 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 邻居、组播路由表

思考

  1. PIM-DM 的泛洪+剪枝模型在初始阶段会造成带宽浪费。如果一个网络的组播接收者分布非常均匀(每个子网都有接收者),PIM-DM 是否反而比 PIM-SM 更高效?

  2. PIM-SM 中,接收者先通过 RP(RPT 树)接收数据,再切换到 SPT。如果 SPT 切换后的路径经过的链路带宽小于 RPT 路径,是否会导致组播流卡顿?PIM-SM 会做带宽检查后再切换吗?

  3. PIM 被称为"协议无关"组播。但如果单播路由表出现黑洞或不一致,PIM 组播转发会受到什么影响?

下篇预告:第147篇:RP(汇集点)的选举与配置