3. 多播网络体系结构

单播通信中,一台主机发出的每个数据包只对应一个目的地址,路由器只需按目的前缀查表转发。多播改变了这个前提:一个数据包要同时送达一组可能分布在不同网段、不同自治系统中的接收者,而发送者事先并不知道接收者是谁、有多少、在哪里。因此多播网络体系结构必须解决三个层次的问题:主机如何向路由器表达"我要加入某个组",路由器之间如何知道"哪些方向有接收者",以及数据包在转发时如何避免环路并只沿有需求的分支扩散。本节围绕主机—路由器接口、多播路由域、组播分发树、反向路径转发检查以及多播转发信息库展开。

主机—路由器接口:IGMP 与 MLD

主机与直连多播路由器之间的交互由 IGMP(IPv4)或 MLD(IPv6)承担。它并不是路由协议,而是一种"成员关系报告"机制:主机通过报告消息声明自己加入了某个组,路由器通过查询消息周期性地确认该组是否仍有成员。以 IGMPv2 为例,主机加入组 G 时主动发送 Membership Report;路由器定期向 224.0.0.1(所有主机组)发送 General Query,主机对仍感兴趣的组回应报告。若路由器连续多个查询周期未收到某组的报告,就认为该网段已无该组成员,停止向此接口转发。

IGMPv3 增加了源过滤能力,报告消息中可携带源列表,形成 INCLUDE(只接收指定源)和 EXCLUDE(除指定源外都接收)两种模式。这使主机可以精确表达"我只想接收 192.0.2.10 发往 239.1.1.1 的流量",为 SSM(特定源多播)奠定基础。需要强调的是,IGMP 只影响最后一跳路由器与主机之间的本地行为,它不参与跨网段的组播路由决策。

多播路由域与协议分工

多播路由域是指由同一套多播路由策略和协议管理的一组连续网络。域内多播(如 PIM-SM、PIM-DM、DVMRP)负责在域内建立分发路径;域间多播(如 MSDP、PIM-SM 的域间扩展、BGP 多播地址族)负责把不同域连接起来。一个典型部署中,域内运行 PIM-SM,由候选 RP(汇聚点)承担共享树的根;域间通过 MSDP 在多个 RP 之间交换活跃源信息,使接收者能跨域发现源。

多播路由域与单播自治域并不必然重合,但工程上常按单播域边界划分,以便复用已有的 IGP 拓扑和策略。域边界路由器需要同时处理单播与多播的边界策略,例如用 MSDP 对等体限制哪些源可以被通告出去。

组播分发树:源基树与共享树

分发树决定了数据包从源到接收者的路径形状。源基树(SPT,最短路径树)以源为根,每个源对应一棵独立的树,路径是源到各接收者的最短路径,延迟最优但路由器需为每个源维护状态。共享树(RPT,汇聚点树)以 RP 为根,所有源先把数据送到 RP,再由 RP 沿同一棵树分发,状态数量少、扩展性好,但路径可能非最优,且 RP 是潜在瓶颈和单点。

PIM-SM 的典型行为是:接收者先加入共享树((*, G) 加入),数据经 RP 到达;当流量超过阈值或需要优化路径时,最后一跳路由器向源发起 (S, G) 加入,切换到源基树,并向 RP 发送剪枝。这个"先共享、后切换"的过程兼顾了快速建树与路径优化。

源基树(SPT)与共享树(RPT)对比 源基树 SPT(以源为根) 源 S R1 R2 R3 接收者 接收者 每源一棵树,路径最短 状态量 ∝ 源数 × 组数 共享树 RPT(以 RP 为根) RP R4 R5 R6 接收者 接收者 所有源共用一棵树 状态量 ∝ 组数,路径可能非最优 源 S 注册/封装 SPT:延迟优、状态多 RPT:状态少、RP 为瓶颈

反向路径转发(RPF)检查

多播转发最核心的防环机制是 RPF 检查。单播转发看目的地址,多播转发看源地址:路由器收到一个多播包时,取出其源地址 S,在单播路由表中查 S 的最优下一跳,该下一跳对应的接口就是 RPF 接口。只有当数据包从 RPF 接口到达时,才允许继续转发;从其他接口到达的包被丢弃。这样,多播流量天然沿单播路由的逆向路径扩散,形成一棵无环的树。

RPF 检查依赖单播路由表,因此多播部署的前提是单播路由收敛且对称。若存在非对称路由,RPF 接口可能与实际来向不一致,导致合法流量被丢弃。工程上可用静态 mroute 指定 RPF 邻居,或调整单播路由使路径对称。在 PIM-SM 中,RPF 还用于判断 (*, G) 与 (S, G) 表项的入接口,以及决定是否向 RP 发送注册消息。

多播转发信息库(MFIB)与转发表项

MFIB 是路由器中真正驱动多播转发的数据结构,由多播路由协议(如 PIM)计算出的路由表项下发而来。一个典型的 (S, G) 表项包含:组地址 G、源地址 S、入接口(RPF 接口)、出接口列表(OIL),以及标志位(如是否直接连接、是否剪枝)。转发时,路由器在 MFIB 中匹配 (S, G),把包从入接口复制到所有未剪枝的出接口。

以 Cisco 风格命令为例,查看多播路由表与转发状态:

Router# show ip mroute 239.1.1.1
(*, 239.1.1.1), 00:12:34/00:02:59, RP 10.0.0.1, flags: S
  Incoming interface: GigabitEthernet0/0, RPF nbr 10.0.0.2
  Outgoing interface list:
    GigabitEthernet0/1, Forward/Sparse, 00:12:34/00:02:59

(192.0.2.10, 239.1.1.1), 00:05:12/00:02:47, flags: T
  Incoming interface: GigabitEthernet0/2, RPF nbr 10.0.0.3
  Outgoing interface list:
    GigabitEthernet0/1, Forward/Sparse, 00:05:12/00:02:47

输出中 (*, G) 表项表示共享树状态,入接口是到 RP 的 RPF 接口;(S, G) 表项表示已切换到源基树,入接口是到源 S 的 RPF 接口。Outgoing interface list 中的 Forward 表示该接口有下游接收者,Prune 表示已剪枝。通过对比 (*, G) 与 (S, G) 的入接口和出接口,可以判断当前流量走的是共享树还是源基树,以及切换是否完成。

判断多播转发是否正常的三个观察点:一是 (S, G) 表项是否存在且入接口 RPF 正确;二是出接口列表中目标接口是否为 Forward;三是用 show ip mfib 确认 MFIB 中对应表项已下发,避免"路由表有、转发表无"的情况。

综上,主机—路由器接口负责本地成员管理,多播路由域界定协议作用范围,分发树决定路径形状,RPF 检查保证无环转发,MFIB 承载最终转发动作。这五者构成多播网络体系结构的完整链条,缺一不可。