组播路由协议实验手册

Multicast Routing Protocols — Lab Manual

实验平台:EVE-NG(Emulated Virtual Environment) · 设备厂商:Cisco(IOS / IOS-XE 系列)

覆盖:IGMP / IGMP Snooping PIM-DM / PIM-SM 静态/Auto-RP/BSR Anycast RP PIM-SSM MSDP 跨域 9 个完整实验

前言 · 如何使用本手册

组播(Multicast)是网络通信里最容易让人"一听就懂、一配就懵"的技术。它的核心思想其实朴素得不能再朴素:一份数据,从源出发,只发一次,沿途按需复制,最终精准抵达所有想接收的人,而完全不惊扰无关的人。听起来像广播?像,但本质不同——广播是"挨家挨户敲门",组播是"只把传单塞进举手说'我要'的信箱"。

本手册的定位是一本可上手、能讲透、配得通的实验指南。我们不以考试或背诵为目标,而是带你从"为什么需要组播"出发,逐层拆解地址、协议、树、RP、跨域,最后落到 EVE-NG 真机上一条一条敲命令、看现象、读输出。每一章先讲"它解决什么问题、脑子里该有怎样一幅图",再给出实验命令与show输出示范。

阅读建议若你是零基础,请按第 1~12 章顺序通读,建立全景;若你已了解理论只想练手,可直接跳到第 13 章和 9 个实验。每个实验都包含"拓扑目标 → 配置命令 → 验证现象 → 原理对应"四段式。

关于符号约定:文中所有以!开头的行是 Cisco IOS 注释;所有以浅色显示、带Router#提示符的块是可执行命令;以浅蓝字展示的块是期望看到的输出示例。本手册命令均基于 Cisco IOS 15.x / IOS-XE,绝大多数在 EVE-NG 中运行的 vIOS / IOL(IOS on Linux)镜像上可原样复现。

一个关键前提组播能否工作,99% 取决于单播路由表是否已经通。因为组播路由依赖 RPF(反向路径转发)检查,而 RPF 查的就是单播路由表里的"回源路径"。所以每个实验的第一步永远是:先让全网单播 IP 互通(OSPF/IS-IS/EIGRP 等 IGP 收齐路由),再谈组播。

第1章 组播是什么:从"快递"说起

想象一个讲师在千人礼堂里发讲义。有三种派发方式,恰好对应网络里三种通信模型:

1.1 单播(Unicast):点对点,一人一份

讲师把同一份讲义复印一千份,挨个递给每位学员。网络里就是源给每个接收者单独发一个完整 IP 包。代价显而易见:源要发 N 份,带宽随接收者数量线性增长。直播一万人时,源的带宽就被榨干。单播适合"一对一私聊",不适合"一对多群发"。

1.2 广播(Broadcast):全网洪泛,不管你要不要

讲师把讲义往空中一撒,礼堂里所有人都收到,哪怕睡觉的人也被砸醒。网络里是发往 255.255.255.255 或子网广播地址,二层全网洪泛。代价是:无关主机被迫处理、跨网段无法传递(路由器默认不转发广播)、无法精细控制。广播只适合"同网段内极少量控制信令"。

1.3 组播(Multicast):只对"举手的人"投递

讲师只把讲义发给举手的学员,且只在每个过道(链路)上传递一份,由过道尽头的组长负责复印分发给本排举手的人。网络里:源只产生一份流量(以组地址 239.x.x.x 为目的),路由器在有接收者的分支上复制转发,在没有接收者的分支上完全不浪费。带宽开销与接收者分布有关,而与单纯的数量弱相关。

源S R1 R2 实线=有接收者→转发;虚线=无接收者→不浪费
图1-1 组播"按需复制"示意:源只发一份,仅在朝向接收者的链路上复制

1.4 组播到底用在哪

  • IPTV / 视频会议 / 网络电视:一对多实时流,最经典的组播场景。
  • 金融行情推送:交易所把行情以组播发给所有券商终端,毫秒级、低开销。
  • 企业内网直播 / 培训:CEO 讲话,千人同时看,源不爆。
  • 软件分发 / 镜像下发:向全网终端同时推送系统镜像或病毒库。
  • 某些路由协议与发现机制:OSPF 用 224.0.0.5/6、RIP 用 224.0.0.9、PIM 用 224.0.0.13,这些链路本地组播是协议自身运转的"内部语言"。
一句话总结组播解决的是"一对多、且接收者动态可变"场景下的带宽与源负载问题。凡是"一个源、很多接收者、内容相同"的需求,都该先想组播。

第2章 组播地址与 MAC 映射:信号的"门牌号"

组播通信里有两个必须分清的地址概念:组播 IP 地址(三层,给路由器寻路用)和组播 MAC 地址(二层,给交换机在局域网里转发用)。理解它们的映射关系,是排查"为什么二层收到了不想要的组播"的关键。

2.1 IPv4 组播地址范围

IPv4 组播地址占用整个 224.0.0.0/4 块,即 224.0.0.0 ~ 239.255.255.255,共约 2.68 亿个地址。它不属于任何主机,而属于"一个组"。常见的细分:

范围名称用途 / 示例
224.0.0.0 – 224.0.0.255链路本地(保留)路由协议内部用,路由器不转发。如 224.0.0.1 全主机、224.0.0.2 全路由器、224.0.0.5/6 OSPF、224.0.0.9 RIP、224.0.0.13 PIM、224.0.0.22 IGMPv3
224.0.1.0 – 224.0.1.255互联网控制如 224.0.1.1 NTP、224.0.1.39/40 Auto-RP
224.0.2.0 – 238.255.255.255AD-HOC / 用户可分配(ASM 范围)企业内普通组播业务,如 239.1.1.1 视频流
232.0.0.0/8SSM 指定源组播PIM-SSM 专用,(S,G) 模型,必须指定源
233.0.0.0/8GLOP / AS 内早期与 AS 号绑定的分配方案
239.0.0.0/8管理 scoped(私有)类似私网地址,企业内部随意用,不跨公网,强烈推荐
实战建议做实验或企业部署,优先用 239.0.0.0/8 私有范围(如 239.1.1.1),避免和公网真实组地址冲突,也避免误把流量送出国网。

2.2 组播 IP 到 MAC 的映射(必考且易错)

以太网组播 MAC 地址有固定的"前缀":01:00:5E 开头。映射规则如下:

  • MAC 前 25 位固定为 0000 0001 0000 0000 0000 0101 1110(即 01:00:5E)。
  • 把 32 位的组播 IP 地址的前 4 位(1110)去掉,取其低 23 位,直接拼到 01:00:5E 后面。
  • 因此一个组播 MAC 只承载了 IP 的 23 位,而 IP 组地址 28 位可变 → 存在 32:1 的地址重叠(2^(28-23)=32)。即多个不同组播 IP 可能映射到同一个 MAC。
这个坑很关键因为 32 个组播 IP 共享一个 MAC,二层交换机看到组播帧时,若不做 IGMP Snooping,可能把某组的帧也"误送"给加入了另一个同 MAC 组的主机。主机网卡靠 IP 层再过滤一次。所以IGMP Snooping 不是可选项,是组播在二层正常工作的必需

2.3 把规则算一遍(例子)

239.1.1.1 为例:

; 239.1.1.1 的二进制(只看后 28 位,前 4 位 1110 固定):
; 239 = 11101111 → 去掉最高 1110,剩 1111(=15的高4位)
; 更简单做法:取 IP 后三段对应的低23位
; 01:00:5E : (低23位)
; 239.1.1.1 → MAC = 01:00:5E:01:01:01
;   高字节 01:00:5E,然后 01:01:01 直接对应 IP 的后三段低23位

更一般地:组 IP 234.a.b.c → MAC 01:00:5E:(a & 0x7F):b:c。注意 a 的最高位被丢弃(这就是为什么重叠)。例如 225.1.1.1224.1.1.1 映射到相同 MAC,因为 a=224 和 a=225 的低 7 位都是 0000001。

2.4 源地址与组地址的角色

组播包里:目的 IP = 组地址(G)源 IP = 发送者单播地址(S)。组播的"寻址"不是找源,而是找"哪个组"。路由时用 (S, G)(*, G) 这样的"源-组"对来标识一条流,这是后续所有组播路由表的核心条目格式。

第3章 组播服务模型:ASM 与 SSM

在你动手配命令之前,必须先决定用哪种"服务模型"——它决定了接收者如何表达"我要加入"。这就像订牛奶:是"不管谁送的,只要是鲜奶就要"(ASM),还是"我只认准老张家的奶,别家不要"(SSM)。

3.1 ASM(Any-Source Multicast,任意源)

接收者只关心"组地址 G",不关心也不指定源是谁。任何源只要往 G 发,接收者都收。这是最传统、最通用的模型,也是 PIM-SM/DM 工作的基础。

  • 优点:接收者零配置源信息,适合"不知道谁在发"的场景(如 IPTV 频道,频道号就是 G)。
  • 代价:需要一个"会合点"(Rendezvous Point, RP)来把源和接收者撮合到一起,协议复杂度高。
  • 典型地址范围:224.0.0.0 – 238.255.255.255(含 239.x 私有)。

3.2 SSM(Source-Specific Multicast,指定源)

接收者加入时必须同时指定源 S 和组 G,形式为 (S, G)。它只收"来自 S 发往 G"的流量。

  • 优点:根本不需要 RP,直接从源建一棵树,架构极简、安全(防私搭源)、延迟低。
  • 代价:接收者(或 IGMPv3/应用)必须知道源的 IP;依赖 IGMPv3 或 MLDv2。
  • 典型地址范围:232.0.0.0/8(Cisco 默认 SSM 范围)。
怎么选如果你能提前知道源 IP(绝大多数企业视频、行情推送其实都知道),优先 SSM,省掉 RP 这一大坨复杂度。如果源动态未知(如开放的 IPTV 频道),用 ASM + PIM-SM。

3.3 一个贯穿全书的记号

组播路由表里你会反复看到两种条目:

  • (*, G) —— 共享树(RPT)条目,表示"本路由器已为组 G 建立了朝向 RP 的接收通道,愿意接收来自任意源的 G 流量"。
  • (S, G) —— 源树(SPT)条目,表示"本路由器已建立从具体源 S 到自己的最短路径树条目"。

记住这两个记号,后面 PIM 的所有行为都是在维护、切换、剪枝这两类条目。

第4章 IGMP:最后一公里的"举手协议"

IGMP(Internet Group Management Protocol,互联网组管理协议)运行在主机与直连路由器(最后一跳路由器,即 DR/接收者侧网关)之间。它的唯一使命:让路由器知道"我这个网段上,有没有人想收某个组"。它就是那个"举手登记"的过程。

重要边界IGMP 只在主机到路由器这一段(通常是用户 VLAN 的三层接口)有用。路由器之间怎么传组播,靠的是 PIM,不是 IGMP。别混淆:IGMP 管"谁要",PIM 管"怎么送"。

4.1 三个版本对比

特性IGMPv1IGMPv2IGMPv3(SSM 基石)
离开机制无主动离开,靠超时有 Leave 报文,快速离开有,且可携带多组
查询器选举靠上层单播路由协议(如 OSPF DR)自身 IP 地址比较选举自身选举
成员报告ReportReport + LeaveReport 含 (S,G) 列表(支持 SSM)
指定源不支持不支持支持(INCLUDE/EXCLUDE 源)
SSM

现代网络几乎一律用 IGMPv2(ASM)或 IGMPv3(SSM)。Cisco 默认在接口上使用的是 v2(若未显式开启 v3)。

4.2 IGMP 的工作流程(以 v2 为例)

  1. 查询(Query):网段上的查询器(Querier)周期性(默认每 60s)发一个目的 224.0.0.1(所有主机)的 General Query,问"谁要哪个组?"
  2. 报告(Report):主机想收 G,就回一个目的为 G 的 Report。为避免同网段多主机重复上报,IGMP 用"报告抑制":先监听一小段随机时间,若别人已报,自己就静音。
  3. 加入即上报:主机启动想接收时,不必等查询,立刻主动发 Report(立即加入)。
  4. 离开(Leave):主机不想收了,发 Leave 给 224.0.0.2(所有路由器)。查询器收到后发特定组查询(Group-Specific Query)确认"还有人要吗?",没人回就撤掉该组状态。
路由器 主机A 主机B ① Query (224.0.0.1) ③ Leave (224.0.0.2) ② Report (G) 主机A举手
图4-1 IGMPv2 交互:查询器发 Query,主机 Report 举手,离开时发 Leave

4.3 查询器(Querier)选举与定时器

一个网段可能有多台路由器(冗余网关)。为避免"群龙治水",只留一个当查询器:比较接口 IP,IP 最小者胜出。落选者沉默,但照常转发流量。

关键定时器(接口级,可调整):

  • query-interval:查询周期,默认 60s。
  • query-timeout / querier-timeout:若这么久没收到别人更优的查询,就认为自己该当查询器。
  • max-response-time:主机收到查询后,最多多久内必须回应(随机退避上限),默认 10s。
  • last-member-query-interval:收到 Leave 后,追问"还有人吗"的间隔,默认 1s。
排错常客如果主机"离开后流量还在",多半是 last-member 相关定时器太大,或查询器没切换。如果"刚开机要等快一分钟才收到流",多半把 query-interval 调太大了。

第5章 IGMP Snooping:让交换机"听得懂"组播

二层交换机天生"看不懂" IP,它只认 MAC。对组播帧,默认行为是当未知目的 MAC 处理——于是在 VLAN 内洪泛,和广播一样糟糕。这就完全丧失了组播"不惊扰无关主机"的优势。IGMP Snooping 就是用来修正这一点的。

5.1 Snooping 在做什么

交换机"偷听"(snoop)主机和路由器之间的 IGMP 报文,建立一张 组播 MAC → 端口 的映射表。于是组播帧只从"有成员"的端口转发出去,其余端口安静如初。

  • 监听 IGMP Report:把上报端口加入该组的转发表。
  • 监听 IGMP Leave:把离开的端口从组里摘除。
  • 监听 IGMP Query:识别哪台路由器是查询器,把"路由器端口(mrouter port)"标记出来,确保组播能上行到路由器。

5.2 必须知道的几个细节

  • mrouter 端口:交换机必须知道"组播该往哪个口送回路由器",否则接收者发的 Report 到不了路由器。Snooping 通过监听 Query 自动发现;也可手动指定 ip igmp snooping mrouter … 或静态加入。
  • 报告抑制(Report Suppression):主机为省带宽会"别人报了我就闭嘴"。但这会让交换机只看到一个端口的 Report,误以为只有一台主机。Cisco 提供 ip igmp snooping report-suppression(默认视平台)来优化,必要时关闭抑制让交换机看清每台主机。
  • 查询器问题:若 VLAN 内没有路由器(纯二层环境,比如接收者和源都在交换机下、由三层交换机做网关但不发 IGMP Query),交换机会因为没有 Query 而学不到 mrouter 端口。此时需在交换机上启用 ip igmp snooping querier,让交换机自己发 Query。
二层组播三连坑① 没开 snooping → 全 VLAN 洪泛;② 开了但没 mrouter 端口 → 接收者收不到、路由器收不到 Report;③ 纯二层没路由器 → 必须配 snooping querier。这三点占组播二层故障的 80%。

5.3 MLD Snooping(IPv6 对应)

IPv6 里对应协议是 MLD(Multicast Listener Discovery),二层对应是 MLD Snooping,原理完全一致,只是报文类型从 IGMP 换成 MLD。Cisco 命令形如 ipv6 mld snooping

第6章 组播分发树、RPF 与 Assert:路由器怎么"不绕路、不环回"

PIM(协议无关组播)负责在路由器之间建"转发树"。理解树、RPF、Assert 这三个概念,就理解了组播路由 90% 的行为逻辑。

6.1 两种分发树

  • SPT(Shortest Path Tree,最短路径树 / 源树):以源 S 为根,沿单播路由的"源到接收者最短路径"建树,条目为 (S, G)。优点:路径最优、延迟最低;缺点:每个源一棵树,状态多。
  • RPT(Rendezvous Point Tree,共享树 / 会合树):以RP 为根,所有接收者先朝 RP 聚合,条目为 (*, G)。优点:状态少、收敛快(先有树再找源);缺点:路径可能不是最优(要经过 RP)。
源S RP SPT (S,G) 源树:S直达收 RPT (*,G) 共享树:经RP
图6-1 SPT 以源为根、RPT 以 RP 为根。PIM-SM 通常先建 RPT,再按需切 SPT

6.2 RPF(Reverse Path Forwarding,反向路径转发)

组播最怕两件事:环路重复包。RPF 是组播的"防伪标签"机制:

  • 当路由器从某接口收到一个 (S, G) 包,它去查单播路由表:"要到源 S,最佳出接口是哪个?"
  • 如果这个包的入接口正好等于"去往 S 的最佳出接口"(即 RPF 接口),则通过 RPF 检查,转发;否则丢弃。
  • 换句话说:组播包必须"顺着单播回到源的路"进来,才被认为是合法的。这巧妙杜绝了环路和重复。
RPF 查谁RPF 默认查单播路由表(最长匹配)。也可用 ip mroute 配置静态组播路由指定 RPF 接口;或配 ip pim rp-address 等。记住:没有去往源的路由 = RPF 失败 = 组播不通。这是排错第一刀。

6.3 Assert(断言):多路由器争一路时谁说话

当一条链路上连着两台及以上的下游路由器都收到了同一个 (S, G) 包(典型:两台路由器都连到同一个多接入网段,且都朝该网段转发),它们会互相发 Assert 报文争吵"该谁转发"。规则:

  • 比较 去往源 S 的管理距离(AD),小者胜;
  • AD 相同比 度量值(Metric),小者胜;
  • 都相同比 路由器 IP,大者胜(Cisco 实现)。

输家会在该接口上把自己"剪掉"(prune),只留赢家转发,从而避免同网段重复包。

6.4 TTL 与组播边界

组播包也有 TTL,默认发送 TTL=1(链路本地)。路由器转发时会减 1。可用 ip multicast ttl-threshold 在接口设阈值,或 ip multicast boundary 用 ACL 限制哪些组能进出某接口,实现"组播管理边界"(scoping),防止内部组播泄漏到其他域。

第7章 PIM-DM 密集模式:先全部发,再剪掉不要的

PIM(Protocol Independent Multicast)"协议无关"的意思是:它不自己算路由,而是"借用"任何现成的单播路由协议(OSPF/EIGRP/静态)来当 RPF 依据。PIM 分 DM(密集)和 SM(稀疏)两种模式。

7.1 DM 的核心哲学:洪泛-剪枝(Flood & Prune)

DM 假设"网络里处处都要组播"(接收者密集)。所以源一发包:

  1. 扩散(Flood):从源开始,沿所有 PIM 邻居接口把 (S, G) 包全发出去(靠 RPF 防环)。
  2. 剪枝(Prune):某下游路由器发现自己这棵分支没有接收者(没有 IGMP 成员、也没有 PIM 下游要),就向上游发 Prune,上游在该接口"剪掉"。
  3. 状态维持:被剪掉的分支并非永久沉默。每过一段时间(默认 3 分钟 Prune 定时器 / State Refresh),会重新扩散一次,确认是否还有人要。
DM 适用场景接收者分布非常密集、且带宽充裕的局域网或小型网络。它简单(无需 RP),但周期性全网络扩散在大型网络里浪费严重,所以生产网基本用 SM。实验里 DM 常用于理解"扩散-剪枝"本质。

7.2 配置要点

DM 不需要 RP,配置极简:全局开组播路由 + 接口开 dense-mode 即可。

! 全局启用组播路由
Router(config)# ip multicast-routing
! 在需要参与组播转发的接口上开启 PIM 密集模式
Router(config)# interface GigabitEthernet0/1
Router(config-if)# ip pim dense-mode
Router(config-if)# interface GigabitEthernet0/2
Router(config-if)# ip pim dense-mode
别忘了凡是有接收者或会转发组播流量的三层接口(含连接源、连接接收者、互联链路)都要开 ip pim dense-mode。漏一个接口,树就断在那。

7.3 DM 的验证

! 看 PIM 邻居(DM 也会建邻居)
Router# show ip pim neighbor
PIM Neighbor Table
Neighbor      Interface            Uptime/Expires    Ver   DR
10.0.12.2     GigabitEthernet0/1   00:15:22/00:01:25 v2    1/0
! 看组播路由表,DM 主要是 (S,G) 条目
Router# show ip mroute 239.1.1.1
(192.168.1.10, 239.1.1.1), 00:02:10/00:02:48, flags: T
  Incoming interface: GigabitEthernet0/1   ; RPF 接口
  RPF neighbor: 10.0.12.2
  Outgoing interface list:
    GigabitEthernet0/2, Forward/Sparse-Dense, 00:02:10/00:00:00

第8章 PIM-SM 稀疏模式:先找 RP 会合,再切最优路径

SM(稀疏模式)假设"接收者稀少分散",不能无脑洪泛。它引入一个关键角色——RP(Rendezvous Point,会合点),作为源和接收者初次"相亲"的中介。

8.1 SM 的两个阶段

阶段一:共享树 RPT(接收者侧先动)

  1. 接收者侧路由器收到 IGMP 加入,生成 (*, G) 条目,沿"朝向 RP"的 RPF 路径向上逐跳建共享树。
  2. 此时树根是 RP,所有接收者通过这个 (*, G) 通道"等着收"。

阶段二:源注册(源侧先动)

  1. 源一开始发包,第一跳路由器(DR)发现没有下游要,但知道 RP,于是把包单播封装成 Register 报文发给 RP(这就是"注册")。
  2. RP 解封装,沿 RPT 把流量发给接收者。同时 RP 沿"朝向源"的 RPF 路径向源发 (S, G) Join,建立真正的源树 SPT。
  3. 源树建好后,流量直接从源经 SPT 流到 RP,再经 RPT 到接收者。此时 RP 发 Register-Stop 给源 DR,停止单播注册封装。
源S RP 收R 收R ① Register 单播封装 ② RPT(*,G) 下发 阶段二后:源→(S,G)SPT→RP→RPT→接收者
图8-1 PIM-SM 注册过程:源 DR 单播 Register 到 RP,RP 建 SPT 后停注册

8.2 SPT 切换(RPT→SPT)

流量经 RP 绕路,可能不是最优。SM 有个优化:当接收者侧路由器发现某 (S, G) 流量"大到阈值"(默认速率超 0 kbps,即一收到就切),就直接向源 S 发起 (S, G) Join,建立直达源的 SPT,并把自己从 RPT 上剪掉。这就是 SPT 切换(SPT Switchover),让流量走最优路径。

! 调整 SPT 切换阈值(默认 0 = 立即切换)。设为 128kbps:
Router(config)# ip pim spt-threshold 128
! 也可指定只对某些组切换;或设 infinity 永远不切(一直走 RPT)
为什么默认立即切现代网络带宽足,绕 RP 反而增加延迟和 RP 负载,所以收齐第一个包就切 SPT。若 RP 本身就是流量汇聚点(如视频源站),可设 infinity 保持走 RPT 简化路径。

8.3 PIM-SM 的基础配置(静态 RP 版,详见实验4)

! 全局启用 + 接口 sparse-mode
Router(config)# ip multicast-routing
Router(config)# interface range Gi0/1 - 2
Router(config-if-range)# ip pim sparse-mode
! 静态指定 RP(全网一致)
Router(config)# ip pim rp-address 3.3.3.3

8.4 PIM 路由器角色补充

  • DR(Designated Router,指定路由器):在源侧,DR 负责把源注册到 RP;在接收者侧,DR 负责把 IGMP 加入朝 RP 上送。多路由器网段通过比较优先级(ip pim dr-priority,大者胜;相同比 IP 大者)选一个 DR 干活,避免重复注册/加入。
  • BSR / Auto-RP:动态发现 RP 的机制(第9章)。

第9章 RP 发现机制:静态、Auto-RP 与 BSR

SM 里所有路由器都得知道"RP 是谁、在哪"。有三种方式让全网达成共识:

9.1 静态 RP(手工指定)

最简单、最可控:每台路由器手工敲 ip pim rp-address <IP>。优点是无依赖、好排错;缺点是 RP 变了要全网改,且无法做 RP 冗余(一台挂全网瘫)。

! 每台路由器都配(通常指向 RP 的环回口地址)
Router(config)# ip pim rp-address 3.3.3.3
! 可只对特定组生效(ACL 限定),实现"不同组用不同 RP"
Router(config)# access-list 10 permit 239.1.1.0 0.0.0.255
Router(config)# ip pim rp-address 3.3.3.3 10

9.2 动态 RP 的两套机制

机制Auto-RP(Cisco 私有)BSR(Bootstrap Router,标准 RFC5059)
标准Cisco 私有IETF 标准,跨厂商通用
角色候选 RP 发 224.0.1.39(Announce);映射代理 224.0.1.40(Discovery)候选 BSR + 候选 RP,BSR 收集后全网泛洪
依赖需 PIM 先跑起来;SM 模式下需 ip pim autorp listener 让 39/40 组走稀疏BSR 消息用 PIM 原生携带,不依赖组播组
冗余支持多个候选 RP(按 hash 分配组)支持多个候选 RP + BSR 主备

9.3 Auto-RP 配置

; ===== 在 RP 候选路由器上 =====
Router(config)# ip pim send-rp-announce Loopback0 scope 10
;   ↑ 宣告自己 Loopback0 是候选 RP,scope=10 限制泛洪 TTL 范围
; ===== 在映射代理(可与 RP 同机或独立)=====
Router(config)# ip pim send-rp-discovery Loopback0 scope 10
; ===== 若接口跑 sparse-mode,必须放行 224.0.1.39/40 =====
Router(config)# ip pim autorp listener
Auto-RP 的"鸡生蛋"问题Auto-RP 自己要靠组播(224.0.1.39/40)传递,可接口是 sparse-mode 时这些组也得靠 RP 才能通——而 RP 还没选出来。破解法:① 用 ip pim autorp listener 让这两个组以 dense 方式传递;② 或接口用 sparse-dense-mode(既能 sparse 又能 dense)。

9.4 BSR 配置(推荐,标准做法)

; ===== 在候选 BSR 上(通常就是 RP 或独立设备)=====
Router(config)# ip pim bsr-candidate Loopback0 0
;   ↑ 0 是哈希掩码长度,决定组到 RP 的映射粒度
; ===== 在候选 RP 上 =====
Router(config)# ip pim rp-candidate Loopback0
; ===== 其余路由器无需额外命令,自动从 BSR 消息学习 RP =====
选哪种跨厂商环境、或追求标准 → BSR。纯 Cisco 老网络 → Auto-RP 也可。生产网要做 RP 冗余时,两者都能配多个候选,按组哈希分摊,一台挂了其他 RP 接管对应组。

9.5 验证 RP 映射

! 看本机学到的 RP 映射表
Router# show ip pim rp mapping
PIM Group-to-RP Mappings
Group(s) 224.0.0.0/4
  RP 3.3.3.3 (?), v2
    Info source: 3.3.3.3 (?), elected via Auto-RP
         Uptime: 00:30:12, expires: 00:02:25
! 看某个组当前的 RP 是谁
Router# show ip pim rp 239.1.1.1

第10章 Anycast RP:一台 RP 挂了,另一台无缝顶上

静态 RP 没有冗余;动态 RP 虽有多候选,但每个组只映射到一个 RP,那个 RP 挂了,对应组的组播就瘫。Anycast RP 解决这个问题:让多台 RP 共用同一个 RP 地址(anycast 地址),通过单播路由(IGP)让每台路由器自动把流量送到"最近的"那台 RP。

10.1 工作原理

  • 给所有 RP 配置相同的环回地址(如 3.3.3.3/32),并把它通告进 IGP。由于单播路由选最近,每台路由器"去 3.3.3.3"自然指向离自己最近的 RP。
  • 但问题是:源在 RP-A 注册,接收者在 RP-B 会合,两者看不到彼此的 (S,G) 状态,组播就不通。所以需要 MSDP 在 RP 之间同步"源活跃信息"。
  • 因此 Anycast RP = 相同 RP 地址 + MSDP 互联。任一 RP 故障,IGP 收敛后流量自动切到另一台,且 MSDP 已让所有 RP 都知道了源。
源S RP-A RP-B MSDP 同步源 两台 RP 共用 3.3.3.3,IGP 决定就近;MSDP 互告源
图10-1 Anycast RP:相同 RP 地址 + MSDP 源同步,实现无缝冗余

10.2 配置要点

; ===== 每台 RP(以 RP-A 为例)=====
Router(config)# interface Loopback0
Router(config-if)# ip address 3.3.3.3 255.255.255.255   ; 所有 RP 相同
Router(config)# ip pim rp-address 3.3.3.3
; 用 BSR 或静态通告该 RP(静态需在每台路由器配,BSR 在候选上配)
Router(config)# ip pim rp-candidate Loopback0
; 配置 MSDP 邻居(指向其他 RP 的真实环回地址,不是 anycast 地址!)
Router(config)# ip msdp peer 4.4.4.4 connect-source Loopback1
Router(config)# ip msdp originator-id Loopback1   ; 用唯一地址标识自己
致命细节MSDP 邻居必须用各 RP 的唯一真实地址(如 Loopback1 4.4.4.4),绝不能用 anycast 地址 3.3.3.3——否则所有 RP 的 MSDP 都指向"最近的自己",邻居建不起来。这是 Anycast RP 配置里最容易翻车的一点。

第11章 PIM-SSM:不要 RP,直接从源建树

SSM(Source-Specific Multicast)是组播里"返璞归真"的模型:接收者明确说"我只收来自源 S 的组 G"。既然源已知,根本不需要 RP 来撮合,直接建 (S, G) 最短路径树即可。

11.1 为什么 SSM 简单又安全

  • 没有 RP → 没有 RP 单点、没有注册过程、没有 RPT→SPT 切换抖动。
  • 指定源 → 天然防"私搭源冒充",因为只有白名单里的 (S,G) 才被接收。
  • 依赖 IGMPv3(接收者上报时带源列表)或 MLDv2。

11.2 配置(极简)

; 1) 开启 SSM 默认范围(232.0.0.0/8,Cisco 默认已开,显式写更清晰)
Router(config)# ip pim ssm default
; 或自定义范围:ip pim ssm range <ACL>
; 2) 接口用 sparse-mode(SSM 跑在 sparse 框架上,但行为像直连源树)
Router(config)# interface Gi0/1
Router(config-if)# ip pim sparse-mode
Router(config-if)# ip igmp version 3   ; 接收者侧需 v3

11.3 接收者如何加入 (S, G)

在最后一跳路由器(或主机)上用 IGMPv3 指定源:

! 在接收者侧接口上静态模拟"指定源加入"(实验常用)
Router(config)# interface Gi0/2
Router(config-if)# ip igmp version 3
Router(config-if)# ip igmp join-group 232.1.1.1 source 192.168.1.10

此时路由器直接朝源 192.168.1.10 建 (192.168.1.10, 232.1.1.1) 的 SPT,全程无 RP 参与。看 show ip mroute 会出现 Joined: (192.168.1.10, 232.1.1.1) 且无 RPT 标记。

SSM 的工程建议只要业务模式允许(源 IP 已知且固定),一律优先 SSM。它把"RP 规划、动态发现、注册、切换"这一整套复杂度整个砍掉,排错面小一大半。视频会议、金融行情推送几乎都是 SSM 的绝佳场景。

第12章 MSDP:让组播跨越 AS / 管理域

MSDP(Multicast Source Discovery Protocol,组播源发现协议)解决一个具体问题:不同 PIM 域(不同 AS 或不同管理域)各有各的 RP,彼此不知道对方的源在哪。MSDP 让一个域的 RP 把"我这里有源 S 在发组 G"的消息,通过 TCP 告诉对端域的 RP,从而让对端接收者也能建树收到。

12.1 为什么需要 MSDP

PIM-SM 的 RP 只在本域有效。源在域 A 注册到 RP-A,域 B 的接收者只认 RP-B,两者隔阂。MSDP 在 RP 之间建立 TCP 邻居,互发 Source-Active (SA) 消息:"我是 RP-A,源 1.1.1.1 正在发 239.1.1.1"。RP-B 收到后,若本地有接收者要 239.1.1.1,就朝源 1.1.1.1 建跨域 SPT 拉流。

域A RP-A + 源S 域B RP-B + 接收者 MSDP (TCP) 传 SA 消息 RP-B 得知源S后,跨域建 (S,G) SPT 拉流
图12-1 MSDP 在域间 RP 同步源活跃信息,实现跨域组播

12.2 配置

; 在 RP 上配置 MSDP 邻居(对端 RP 的真实地址)
Router(config)# ip msdp peer 200.1.1.2 connect-source Loopback0
Router(config)# ip msdp originator-id Loopback0
; 可选:限制只和对端交换特定组的 SA
Router(config)# ip msdp sa-filter out 200.1.1.2 list 20
Router(config)# ip msdp cache-sa-state   ; 缓存 SA,加速收敛
MSDP 与 Anycast RP 的关系MSDP 既用于跨 AS 域间组播,也用于同 AS 内 Anycast RP 之间的源同步(第10章)。两套场景命令一样,只是邻居是跨域还是跨 RP 的区别。

12.3 验证

! 看 MSDP 邻居状态(应为 Up)
Router# show ip msdp peer
Peer address: 200.1.1.2, AS 65001, local address: 3.3.3.3
  State: Up, Resets: 0, Connection retries: 0
! 看收到的 SA 缓存(源活跃条目)
Router# show ip msdp sa-cache
(192.168.1.10, 239.1.1.1)  RP 200.1.1.2  Uptime 00:10:02

第13章 EVE-NG 平台准备:把"实验室"搭起来

EVE-NG(Emulated Virtual Environment - Next Generation)是网络工程师的"虚拟机箱",能在单台物理服务器/PC 上跑 Cisco、Juniper、Arista 等多厂商设备的镜像,用浏览器就能连控制台。本手册所有实验都基于它。

13.1 EVE-NG 是什么、为什么用它

  • 不用真机:一台笔记本跑 EVE-NG,就能模拟十几台路由器,省下几十万设备费。
  • 拓扑可视化:拖拽节点、连线,像画网络图一样搭实验。
  • 多厂商:除了 Cisco IOS/IOL/XE,还能跑其他厂商,方便对比。
  • 支持云化:可装在 Proxmox/ESXi/裸机,团队共享。

13.2 安装与初始登录

  1. 下载 EVE-NG 社区版(Community)或专业版 ISO,装到 VM(建议 4 核 8G 起步,组播实验多节点可 8 核 16G)。
  2. 启动后浏览器访问 http://<EVE-IP>/,默认账号 admin / eve
  3. 左侧 Add / Lab 新建一个实验室,命名如 "Multicast_Lab"。

13.3 导入 Cisco 镜像(关键!)

EVE-NG 本身不带厂商镜像(版权原因),需自行准备并上传。组播实验推荐镜像:

镜像类型说明适合
Cisco vIOS / IOL (IOS on Linux)轻量、启动快、完整支持 PIM/IGMP首选,跑大量节点不卡
Cisco IOSv / IOSvL2更接近真实 IOS,L2 镜像支持 Snooping需要二层交换实验时
Cisco CSR1000v (IOS-XE)真 XE 特性全,但吃资源需要 XE 专属命令时

上传步骤(以 IOL 为例):用 WinSCP/SCP 把镜像目录传到 /opt/unetlab/addons/iol/bin/,然后在 EVE Web 里 Tools → Fix Permissions。镜像文件夹命名需符合 EVE 规范(如 i86bi_linux_l3-...)

组播实验镜像选择提醒IOL 对 PIM/IGMP/MSDP 支持良好,做本书 9 个实验足够。若要做IGMP Snooping 的二层验证,需加一台 IOSvL2 交换机(路由器做不了真正的二层 snooping 表)。

13.4 推荐基础拓扑(贯穿全书实验)

R1 (源DR) R2 R3 (RP) R4 R5 (接收DR) 源: R1 Lo0 192.168.1.10 接收者: R5 后接 PC
图13-1 通用组播实验拓扑:每台路由器环回口作 Router-ID / RP 地址,互联用 10.0.x.x

地址规划(示例):

  • 路由器环回口 Lo0:R1=1.1.1.1,R2=2.2.2.2,R3=3.3.3.3(RP),R4=4.4.4.4,R5=5.5.5.5。
  • 互联链路:10.0.12.0/30、10.0.13.0/30、10.0.14.0/30、10.0.23.0/30、10.0.34.0/30、10.0.35.0/30。
  • 源网段(R1 后):192.168.1.0/24,源 IP 192.168.1.10。
  • 接收者网段(R5 后):192.168.5.0/24,PC 192.168.5.10,网关 R5 Gi 接口。
  • 组地址:239.1.1.1(ASM 实验)、232.1.1.1(SSM 实验)。

13.5 所有实验的"地基"配置

无论做哪个实验,先把这些敲好(以 R1、R3 为例,其余类比):

; ---- 通用:环回口 + 接口 IP ----
R1(config)# interface Loopback0
R1(config-if)# ip address 1.1.1.1 255.255.255.255
R1(config-if)# interface GigabitEthernet0/0   ; 连 R2
R1(config-if)# ip address 10.0.12.1 255.255.255.252
R1(config-if)# no shutdown
; ---- 通用:IGP(OSPF)让全网单播通 ----
R1(config)# router ospf 1
R1(config-router)# router-id 1.1.1.1
R1(config-router)# network 1.1.1.1 0.0.0.0 area 0
R1(config-router)# network 10.0.12.0 0.0.0.3 area 0
R1(config-router)# network 192.168.1.0 0.0.0.255 area 0
; ---- 通用:验证单播已通 ----
R1# ping 3.3.3.3   ; 应能通,否则组播必失败
黄金法则每个实验开始前,先 ping 通所有环回口和源/接收者地址。单播不通,组播免谈。RPF 检查查的就是这些路由。

实验1 环境搭建与三层组播基础

目标

在 EVE-NG 中搭好图13-1 拓扑,全网 OSPF 通,启用组播路由,验证 PIM 邻居建立,用环回口模拟源发组播,确认 (S,G) 条目生成。

步骤 1:搭拓扑 & 配基础 IP/OSPF

按第 13.5 节把 5 台路由器的接口 IP 与 OSPF 配好,确保任意两环回口互 ping 通。

步骤 2:全局启用组播路由

; 每台路由器都执行
R1..R5(config)# ip multicast-routing

步骤 3:在互联接口与用户接口开 PIM(先以 DM 演示基础)

; 暂用 dense 快速看到现象(实验3 再深入 DM)
R1(config)# interface range Gi0/0 - 2
R1(config-if-range)# ip pim dense-mode
; 接收者侧接口(R5 连 PC 的口)也要开
R5(config)# interface Gi0/3
R5(config-if)# ip pim dense-mode

步骤 4:模拟接收者加入 & 源发包

; 在 R5 接收者接口静态加入组(实验用,免去真 PC)
R5(config)# interface Gi0/3
R5(config-if)# ip igmp join-group 239.1.1.1
; 在 R1 源接口(或环回)用流量生成器发组播(实验也可直接 ping 组地址)
R1# ping 239.1.1.1 source 192.168.1.10 repeat 5

步骤 5:验证

! PIM 邻居应看到对端
R3# show ip pim neighbor
Neighbor      Interface           Uptime/Expires  Ver  DR
10.0.23.2    Gi0/0               00:20:10/00:01:20 v2  1/0
10.0.34.4    Gi0/1               00:20:10/00:01:21 v2  1/0
! 组播路由表应有 (S,G)
R5# show ip mroute 239.1.1.1
(192.168.1.10, 239.1.1.1), 00:00:05/00:02:50, flags: T
  Incoming interface: GigabitEthernet0/0
  Outgoing interface list:
    GigabitEthernet0/3, Forward/Dense, 00:00:05/00:00:00
现象解读Incoming interface 是 RPF 接口(朝源),Outgoing interface list 是朝接收者的出接口且状态 Forward。看到这俩,恭喜,三层组播基础通了。

实验2 IGMP 与 IGMP Snooping

目标

验证 IGMP 查询器选举、成员加入/离开、报告抑制;再用一台 IOSvL2 交换机验证 IGMP Snooping 的二层转发表与 mrouter 端口。

2.1 IGMP 查询器与成员

; 接收者侧(R5 连 PC 口)开 IGMP 并加入
R5(config)# interface Gi0/3
R5(config-if)# ip igmp version 2
R5(config-if)# ip igmp join-group 239.1.1.1
; 若同网段还有另一台路由器 R6,比较 IP 看谁当查询器
R5# show ip igmp interface Gi0/3
GigabitEthernet0/3 is up, line protocol is up
  Internet address is 192.168.5.1/24
  IGMP is enabled on interface
  Current IGMP version is 2
  IGMP query interval is 60 seconds
  IGMP querier timeout is 120 seconds
  IGMP querier is 192.168.5.1 (this system)   ; 本机是查询器

2.2 看成员组与离开

! 查看本机已加入的组
R5# show ip igmp groups
Group Address  Interface   Uptime   Expires
239.1.1.1      Gi0/3       00:05:10  00:00:50
; 取消加入,观察 Leave 报文与状态消失
R5(config)# interface Gi0/3
R5(config-if)# no ip igmp join-group 239.1.1.1
R5# show ip igmp groups   ; 239.1.1.1 应消失

2.3 IGMP Snooping(二层交换机)

; 在 IOSvL2 交换机上
SW(config)# ip igmp snooping            ; 默认已开,确认
SW(config)# vlan 10
SW(config-vlan)# ip igmp snooping
; 若 VLAN 内无路由器(纯二层),必须开 snooping querier
SW(config)# ip igmp snooping querier
SW(config)# ip igmp snooping vlan 10 querier address 192.168.5.254
! 验证 snooping 表
SW# show ip igmp snooping groups
Vlan  Group        Type     Version  Port List
10    239.1.1.1    IGMP      v2      Gi0/5      ; 仅成员端口
SW# show ip igmp snooping mrouter
Vlan  ports
10    Gi0/1                         ; 路由器端口(上行)
判卷标准Snooping 表只在有成员的端口出现该组,mrouter 端口正确指向路由器。若组成员端口里出现了"不该收的主机端口",检查是否关了报告抑制或 MAC 重叠(第2章)。

实验3 PIM-DM 密集模式

目标

理解 DM 的"扩散-剪枝"。观察无接收者分支如何被 Prune,有接收者分支如何 Forward;观察 Prune 定时器到期后的重新扩散。

3.1 配置

; 全网接口 dense-mode(参照实验1 步骤3,确保所有相关口都开)
R1..R5(config)# ip multicast-routing
R1..R5(config)# interface range Gi0/0 - 3
R1..R5(config-if-range)# ip pim dense-mode
; 只在 R5 接收者口加组成员
R5(config)# interface Gi0/3
R5(config-if)# ip igmp join-group 239.1.1.1

3.2 源发包,观察扩散

; R1 持续发组播
R1# ping 239.1.1.1 source 192.168.1.10 repeat 1000
! 在"无接收者"的 R4 上看:接口应被 prune(不在出接口列表)
R4# show ip mroute 239.1.1.1
(192.168.1.10, 239.1.1.1), 00:01:00/00:02:40, flags: T
  Incoming interface: GigabitEthernet0/0
  Outgoing interface list: NULL        ; 无出接口 = 已剪枝
! 在 R3(通往 R5 的路径上)看:出接口应包含朝 R5 的口
R3# show ip mroute 239.1.1.1
  Outgoing interface list:
    GigabitEthernet0/2, Forward/Dense, 00:01:00/00:00:00

3.3 观察 Prune 与重新扩散

! 看接口的 prune 状态(DM 会周期性重扩散)
R4# show ip pim interface detail Gi0/0
... Dense mode, Prune limit: 3 min ...
; 停掉 R5 的 join,再看 R3 出接口应变为 NULL(被 R5 剪枝)
R5(config)# interface Gi0/3
R5(config-if)# no ip igmp join-group 239.1.1.1
R3# show ip mroute 239.1.1.1   ; 出接口列表变 NULL
核心收获DM 的精髓就是"先发全场,谁不要谁举手(Prune)"。它简单但浪费带宽,适合接收者密。生产网几乎不用,但它是理解 PIM 状态机的最佳入门。

实验4 PIM-SM 与静态 RP

目标

配置 PIM-SM + 静态 RP(R3=3.3.3.3),完整走一遍"接收者建 RPT → 源注册 → RP 建 SPT → 流量下发 → 接收者切 SPT"的全过程,并读关键状态。

4.1 配置

; 1) 全网启用组播 + 接口 sparse-mode
R1..R5(config)# ip multicast-routing
R1..R5(config)# interface range Gi0/0 - 3
R1..R5(config-if-range)# ip pim sparse-mode
; 2) 全网一致指定静态 RP(指向 R3 环回)
R1..R5(config)# ip pim rp-address 3.3.3.3
; 3) 接收者侧加组
R5(config)# interface Gi0/3
R5(config-if)# ip igmp join-group 239.1.1.1

4.2 验证 RPT 建立(接收者侧)

! R5 应有 (*,G) 条目,出接口朝接收者,入接口朝 RP
R5# show ip mroute 239.1.1.1
(*, 239.1.1.1), 00:00:30/stopped, RP 3.3.3.3, flags: SJC
  Incoming interface: GigabitEthernet0/0 (toward RP)
  Outgoing interface list:
    GigabitEthernet0/3, Forward/Sparse, 00:00:30/00:02:30
; 沿途 R4/R3 也应有 (*,G) 朝 RP 上行
R4# show ip mroute 239.1.1.1   ; 显示 (*,G) 入接口朝 R3

4.3 源发包,走注册流程

; R1 发包
R1# ping 239.1.1.1 source 192.168.1.10 repeat 5
! R1(源 DR)应出现 (S,G),并朝 RP 发 Register(先单播)
R1# show ip mroute 239.1.1.1
(192.168.1.10, 239.1.1.1), 00:00:03/00:02:57, flags: T
  Incoming interface: GigabitEthernet0/0
  Outgoing interface list:
    GigabitEthernet0/1, Register, 00:00:03/00:00:00  ; 单播注册中
! R3(RP)应同时有 (*,G) 和 (S,G),并向源建树
R3# show ip mroute 239.1.1.1
(*, 239.1.1.1), 00:05:00/stopped, RP 3.3.3.3, flags: S
(192.168.1.10, 239.1.1.1), 00:00:05/00:02:55, flags: T
  Incoming interface: GigabitEthernet0/0 (toward source)

4.4 观察 SPT 切换

; 接收者侧 R5 收到 (S,G) 流量后,默认立即切 SPT
R5# show ip mroute 239.1.1.1
(192.168.1.10, 239.1.1.1), 00:00:10/00:02:50, flags: T
  Incoming interface: GigabitEthernet0/0 (now toward SOURCE, not RP)
  Outgoing interface list:
    GigabitEthernet0/3, Forward/Sparse, 00:00:10/00:02:30
; 看 SPT 切换计数
R5# show ip pim topology 239.1.1.1   ; 可见 SPT 标志
判卷标准① R5 先有 (*,G) 朝 RP;② R1 出现 Register 出接口;③ R3 同时有 (*,G)(S,G);④ 流量通后 R5 的 (S,G) 入接口从"朝 RP"变成"朝源"。四步全看到 = SM 真正跑通。

实验5 动态 RP:Auto-RP 与 BSR

目标

去掉静态 RP,分别用 Auto-RP 和 BSR 让全网自动发现 RP=3.3.3.3,对比两种机制并验证收敛。

5.1 方案 A:Auto-RP

; 先清掉静态 RP
R1..R5(config)# no ip pim rp-address 3.3.3.3
; 接口改为 sparse-dense-mode(让 224.0.1.39/40 以 dense 传递,破解鸡生蛋)
R1..R5(config)# interface range Gi0/0 - 3
R1..R5(config-if-range)# ip pim sparse-dense-mode
; 在 R3(候选 RP)上宣告
R3(config)# ip pim send-rp-announce Loopback0 scope 10
; 在 R3(兼映射代理)上发发现消息
R3(config)# ip pim send-rp-discovery Loopback0 scope 10
; 若接口仍想用纯 sparse,则加:ip pim autorp listener(放行 39/40)
! 验证:全网应自动学到 RP
R1# show ip pim rp mapping
Group(s) 224.0.0.0/4
  RP 3.3.3.3, Info source: 3.3.3.3, elected via Auto-RP

5.2 方案 B:BSR(推荐,标准)

; 清掉 Auto-RP,接口改回 sparse-mode
R3(config)# no ip pim send-rp-announce Loopback0
R3(config)# no ip pim send-rp-discovery Loopback0
R1..R5(config)# interface range Gi0/0 - 3
R1..R5(config-if-range)# ip pim sparse-mode
; R3 同时当候选 BSR 和候选 RP
R3(config)# ip pim bsr-candidate Loopback0 0
R3(config)# ip pim rp-candidate Loopback0
; 其余路由器无需命令,自动从 BSR 消息学习
! 验证 BSR
R1# show ip pim bsr-router
PIMv2 Bootstrap information
  BSR address: 3.3.3.3 (?), priority 0
  Uptime: 00:02:10
R1# show ip pim rp mapping
  RP 3.3.3.3, Info source: 3.3.3.3, elected via bootstrap
对比结论BSR 是标准、无需 sparse-dense 这种"补丁",跨厂商友好,生产网首选。Auto-RP 是 Cisco 老办法,配置稍绕(sparse-dense / autorp listener),纯 Cisco 环境仍可用。两者都能做 RP 冗余——多加几个 rp-candidate 即可。

实验6 PIM-SSM 指定源组播

目标

用 SSM 模型,接收者明确指定源 192.168.1.10 和组 232.1.1.1,验证全程无 RP、直接建 (S,G) 源树、流量通。

6.1 配置

; 1) 开启 SSM 默认范围
R1..R5(config)# ip pim ssm default
; 2) 接口 sparse-mode(SSM 跑在 sparse 框架,但无 RP 行为)
R1..R5(config)# interface range Gi0/0 - 3
R1..R5(config-if-range)# ip pim sparse-mode
; 3) 接收者侧用 IGMPv3 指定源加入(无需 RP!)
R5(config)# interface Gi0/3
R5(config-if)# ip igmp version 3
R5(config-if)# ip igmp join-group 232.1.1.1 source 192.168.1.10

6.2 源发包 & 验证

; R1 往 232.1.1.1 发
R1# ping 232.1.1.1 source 192.168.1.10 repeat 5
! R5 应直接出现 (S,G),且无 (*,G)、无 RP 参与
R5# show ip mroute 232.1.1.1
(192.168.1.10, 232.1.1.1), 00:00:04/00:02:56, flags: sT  ; 注意 's' = SSM
  Incoming interface: GigabitEthernet0/0 (toward source directly)
  Outgoing interface list:
    GigabitEthernet0/3, Forward/Sparse, 00:00:04/00:02:30
; 确认 RP 表里 232 不在静态/动态 RP 范围
R5# show ip pim rp mapping 232.1.1.1
SSM domain, no RP required
判卷标准mroute 条目标记含 s(SSM)、有 (S,G) (*,G)、RP mapping 显示"SSM domain, no RP required"。三者齐 = SSM 跑通,且无任何 RP 配置。

实验7 Anycast RP 冗余

目标

配置两台 RP(R3=3.3.3.3、R4=3.3.3.3 共用 anycast 地址),用 BSR 通告,MSDP 互联(用各自真实环回 Lo1),验证任一 RP 故障后组播不中断。

7.1 配置 anycast 地址与 BSR

; R3 和 R4 都配相同 anycast 环回(作为 RP 地址)
R3(config)# interface Loopback0
R3(config-if)# ip address 3.3.3.3 255.255.255.255
R4(config)# interface Loopback0
R4(config-if)# ip address 3.3.3.3 255.255.255.255   ; 与 R3 相同!
; 各自再有一个唯一真实环回用于 MSDP
R3(config)# interface Loopback1
R3(config-if)# ip address 33.33.33.33 255.255.255.255
R4(config)# interface Loopback1
R4(config-if)# ip address 44.44.44.44 255.255.255.255
; 全网接口 sparse + BSR 通告 anycast RP
R3(config)# ip pim rp-candidate Loopback0
R3(config)# ip pim bsr-candidate Loopback0 0
R4(config)# ip pim rp-candidate Loopback0
R4(config)# ip pim bsr-candidate Loopback0 0

7.2 配置 MSDP(用真实地址互联)

; R3 的 MSDP 邻居指向 R4 的真实地址 44.44.44.44
R3(config)# ip msdp peer 44.44.44.44 connect-source Loopback1
R3(config)# ip msdp originator-id Loopback1
; R4 反向
R4(config)# ip msdp peer 33.33.33.33 connect-source Loopback1
R4(config)# ip msdp originator-id Loopback1

7.3 验证与故障演练

! MSDP 邻居 Up
R3# show ip msdp peer
Peer 44.44.44.44, state Up, local 33.33.33.33
! 源在 R1 注册到"就近 RP",R5 会合到"就近 RP",MSDP 让两者互通
R1# ping 239.1.1.1 source 192.168.1.10 repeat 10
; 演练:shutdown R3 的 Lo0,观察流量是否切到 R4(IGP 收敛后)
R3(config)# interface Loopback0
R3(config-if)# shutdown
; R5 的 RP 映射应自动指向 3.3.3.3 但下一跳变为 R4,流量不中断
R5# show ip pim rp mapping   ; RP 仍是 3.3.3.3,但路由走 R4
核心坑回顾MSDP 一定用真实唯一地址(Lo1)建邻居,不能用 anycast 3.3.3.3。另外要让 anycast 地址通过 IGP 正常通告,才能使"就近 RP"成立。Failover 时间取决于 IGP 收敛,OSPF 通常亚秒到几秒。

实验8 MSDP 跨域组播

目标

把拓扑拆成两个 AS(域 A:R1-R2-R3,域 B:R4-R5),各自有 RP,通过 MSDP 让域 B 接收者收到域 A 源发的组播,理解 SA 消息跨域同步。

8.1 域划分与 RP

  • 域 A:R1(源DR)、R2、R3(RP-A=3.3.3.3),AS 65001,内部 OSPF。
  • 域 B:R4、R5(RP-B=5.5.5.5,接收者在此),AS 65002,内部 OSPF。
  • R3 与 R4 之间用 eBGP 或静态互联(模拟跨 AS 链路),需互相可达(可借底层 IGP 或静态路由让环回通)。

8.2 配置域内 PIM-SM + RP

; 域 A
R3(config)# ip pim rp-address 3.3.3.3   ; 或 BSR
; 域 B
R5(config)# ip pim rp-address 5.5.5.5

8.3 跨域 MSDP

; RP-A 与 RP-B 建立 MSDP 邻居
R3(config)# ip msdp peer 5.5.5.5 connect-source Loopback0
R3(config)# ip msdp originator-id Loopback0
R5(config)# ip msdp peer 3.3.3.3 connect-source Loopback0
R5(config)# ip msdp originator-id Loopback0

8.4 验证

; 域 A 源发包
R1# ping 239.1.1.1 source 192.168.1.10 repeat 10
; 域 B 接收者加入
R5(config)# interface Gi0/3
R5(config-if)# ip igmp join-group 239.1.1.1
! RP-A 发出 SA,RP-B 收到并建跨域 (S,G)
R5# show ip msdp sa-cache
(192.168.1.10, 239.1.1.1) RP 3.3.3.3, Uptime 00:00:30
R5# show ip mroute 239.1.1.1
(192.168.1.10, 239.1.1.1), ... Incoming interface: Gi0/0 (toward R4/R3)
关键理解跨域组播里,组播流量本身走 PIM 建的树跨越域边界(R4 朝源 192.168.1.10 建 SPT 拉流),而 MSDP 只传"源在哪"的元数据(SA),不传流量。两者分工:MSDP 指路,PIM 送货。

实验9 综合排错实战

目标

模拟 5 类典型故障,训练"从现象到根因"的排错肌肉。每个故障给出症状 → 排查命令 → 根因 → 修复

故障1:RPF 失败(最常见)

  • 症状show ip mroute(S,G) 的入接口是 NULL 或显示 RPF 失败,收不到流。
  • 排查show ip rpf <源IP>,若返回"fail"则单播路由缺失或下一跳不对。
  • 根因:没通告源网段进 IGP,或用了默认路由导致 RPF 接口错乱。
  • 修复:把源网段 network 进 OSPF;必要时 ip mroute <源> <掩码> <下一跳> 静态指定 RPF 接口。
; 验证 RPF
R5# show ip rpf 192.168.1.10
RPF information for 192.168.1.10
  RPF interface: GigabitEthernet0/0
  RPF neighbor: 10.0.35.3
  Routing Table: ospf 1, 192.168.1.0/24

故障2:接口没开 PIM

  • 症状:邻居看不到对端,mroute 无条目。
  • 排查show ip pim interface 看接口是否 listed、模式对不对。
  • 修复:漏的接口补 ip pim sparse-mode / dense-mode

故障3:RP 不可达 / RP 映射错误

  • 症状:只有 (*,G) 但没流量,或在 RP 上 (S,G) 不出现。
  • 排查show ip pim rp mapping 看 RP 是否正确、RP 环回能否 ping 通。
  • 修复:修正静态 RP、或修复 BSR/Auto-RP;确保 RP 环回进 IGP。

故障4:二层 Snooping 把流量吃了

  • 症状:路由器侧 mroute 正常,但 PC 收不到;或交换机端口看不到组成员。
  • 排查show ip igmp snooping groupsshow ip igmp snooping mrouter
  • 修复:确认 snooping 已开、mrouter 端口正确;纯二层环境补 ip igmp snooping querier

故障5:SSM 用错版本 / 没指定源

  • 症状:232 组不通,mroute 只有 (*,G) 或无条目。
  • 排查:接口是否 ip igmp version 3;加入命令是否带 source;是否配 ip pim ssm default
  • 修复:补齐 v3 + source + ssm 范围。
排错口诀"单播先通 → 接口开 PIM → RP 要对 → RPF 通过 → Snooping 放行 → 版本匹配"。按这个顺序逐层 check,90% 的组播故障能在 5 分钟内定位。

附录 A 命令速查表

功能命令
全局启用组播路由ip multicast-routing
接口开 PIM 密集ip pim dense-mode
接口开 PIM 稀疏ip pim sparse-mode
接口开 PIM 稀疏-密集ip pim sparse-dense-mode
静态指定 RPip pim rp-address <IP> [ACL]
Auto-RP 宣告候选ip pim send-rp-announce <接口> scope <n>
Auto-RP 映射代理ip pim send-rp-discovery <接口> scope <n>
放行 Auto-RP 组ip pim autorp listener
BSR 候选ip pim bsr-candidate <接口> <hash>
RP 候选ip pim rp-candidate <接口>
开启 SSM 默认范围ip pim ssm default
IGMP 版本ip igmp version 2|3
静态加入组(测试)ip igmp join-group <G> [source <S>]
IGMP Snooping 查询器ip igmp snooping querier
MSDP 邻居ip msdp peer <对端IP> connect-source <接口>
静态 RPF 路由ip mroute <源> <掩码> <下一跳/接口>

常用查看命令

看什么命令
PIM 邻居show ip pim neighbor
组播路由表show ip mroute [group]
PIM 接口show ip pim interface
RP 映射show ip pim rp mapping
BSR 状态show ip pim bsr-router
RPF 检查show ip rpf <源IP>
IGMP 接口/组show ip igmp interface / show ip igmp groups
Snooping 组/路由器口show ip igmp snooping groups / show ip igmp snooping mrouter
MSDP 邻居/SAshow ip msdp peer / show ip msdp sa-cache
PIM 拓扑细节show ip pim topology [group]

附录 B 术语表

缩写全称一句话
ASMAny-Source Multicast任意源组播,接收者只认组不认源
SSMSource-Specific Multicast指定源组播,必须指定 (S,G),无 RP
IGMPInternet Group Management Protocol主机-路由器间"举手"协议
PIMProtocol Independent Multicast路由器间组播路由,借用单播路由
DM / SMDense / Sparse Mode密集(洪泛剪枝) / 稀疏(经RP会合)
RPRendezvous Point会合点,SM 中源与接收者中介
RPT / SPT共享树 / 源树(*,G) 树 / (S,G) 最短路径树
RPFReverse Path Forwarding反向路径转发检查,防环防重
Assert多路由器争一路时的转发权裁决
BSRBootstrap Router标准动态 RP 发现机制
Auto-RPCisco 私有动态 RP 发现
MSDPMulticast Source Discovery Protocol域间/Anycast RP 间同步源信息
DRDesignated Router指定路由器,源侧注册/接收侧加入的干活者
SPT 切换SPT SwitchoverRPT 收到流量后切到直达源的 SPT

附录 C 写给进阶者的话

恭喜你走完这本手册。如果还想继续深挖,方向有:① BiDir-PIM(双向共享树,无注册过程,适合很多源 many-to-many,如视频会议);② MLD / PIMv6(IPv6 组播,命令几乎同构);③ 组播流量工程(用 MBGP 携带组播路由、与单播路由分离);④ 组播 OAMmtrace 追踪组播路径,定位断点神器);⑤ 在真实 Cisco 设备与 EVE-NG 的差异(部分 TCAM / 硬件复制行为需真机验证)。

组播不是"高级而冷门"的技术——它恰恰是视频、行情、会议这些最"烧带宽"的业务背后的功臣。把本手册的 9 个实验在 EVE-NG 上亲手敲一遍,你会对"一份流量、按需复制"有肌肉记忆级别的理解。祝你实验顺利,包包 Forward,树树 SPT!

—— 组播路由协议实验手册 · 基于 EVE-NG 与 Cisco · 全文完 ——