目 录
PIM是Protocol Independent Multicast(协议无关组播)的简称,表示可以利用静态路由或者任意单播路由协议(包括RIP、OSPF、IS-IS、BGP等)所生成的单播路由表为IP组播提供路由。组播路由与所采用的单播路由协议无关,只要能够通过单播路由协议产生相应的组播路由表项即可。PIM借助RPF(Reverse Path Forwarding,逆向路径转发)机制实现对组播报文的转发。当组播报文到达本地设备时,首先对其进行RPF检查:若RPF检查通过,则创建相应的组播路由表项,从而进行组播报文的转发;若RPF检查失败,则丢弃该报文。
根据实现机制的不同,PIM分为以下两种模式:
l PIM-DM(Protocol Independent Multicast-Dense Mode,协议无关组播—密集模式)
l PIM-SM(Protocol Independent Multicast-Sparse Mode,协议无关组播—稀疏模式)
& 说明:
为了描述的方便,本文中把由支持PIM协议的组播路由器所组成的网络简称为“PIM域”。
PIM-DM属于密集模式的组播路由协议,使用“推(Push)模式”传送组播数据,通常适用于组播组成员相对比较密集的小型网络。
PIM-DM的基本原理如下:
l PIM-DM假设网络中的每个子网都存在至少一个组播组成员,因此组播数据将被扩散(Flooding)到网络中的所有节点。然后,PIM-DM对没有组播数据转发的分支进行剪枝(Prune),只保留包含接收者的分支。这种“扩散—剪枝”现象周期性地发生,被剪枝的分支也可以周期性地恢复成转发状态。
l 当被剪枝分支的节点上出现了组播组的成员时,为了减少该节点恢复成转发状态所需的时间,PIM-DM使用嫁接(Graft)机制主动恢复其对组播数据的转发。
一般说来,密集模式下数据包的转发路径是有源树(Source Tree,即以组播源为“根”、组播组成员为“枝叶”的一棵转发树)。由于有源树使用的是从组播源到接收者的最短路径,因此也称为最短路径树(Shortest Path Tree,SPT)。
在PIM域中,路由器通过周期性地的向所有PIM路由器(224.0.0.13)以组播方式发送PIM Hello报文(以下简称Hello报文),以发现PIM邻居,维护各路由器之间的PIM邻居关系,从而构建和维护SPT。
& 说明:
路由器每个运行了PIM协议的接口都会周期性地发送Hello报文,从而了解与该接口相关的PIM邻居信息。
构建SPT的过程也就是“扩散—剪枝”的过程:
(1) 在PIM-DM域中,组播源S向组播组G发送组播报文时,首先对组播报文进行扩散:路由器对该报文的RPF检查通过后,便创建一个(S,G)表项,并将该报文向网络中的所有下游节点转发。经过扩散,PIM-DM域内的每个路由器上都会创建(S,G)表项。
(2) 然后对那些下游没有接收者的节点进行剪枝:由没有接收者的下游节点向上游节点发剪枝报文(Prune Message),以通知上游节点将相应的接口从其组播转发表项(S,G)所对应的出接口列表中删除,并不再转发该组播组的报文至该节点。
& 说明:
l (S,G)表项包括组播源的地址S、组播组的地址G、出接口列表和入接口等。
l 路由器上收到组播数据的接口称为“上游”,转发组播数据的接口称为“下游”。
剪枝过程最先由叶子路由器发起,如图1所示,没有接收者(Receiver)的路由器(如与Host A直连的路由器)主动发起剪枝,并一直持续到PIM-DM域中只剩下必要的分支,这些分支共同构成了SPT。
图1 PIM-DM中构建SPT示意图
“扩散—剪枝”的过程是周期性发生的。各个被剪枝的节点提供超时机制,当剪枝超时后便重新开始这一过程。
& 说明:
剪枝在PIM-SM中有着相似的应用。
当被剪枝的节点上出现了组播组的成员时,为了减少该节点恢复成转发状态所需的时间,PIM-DM使用嫁接机制主动恢复其对组播数据的转发,过程如下:
(1) 需要恢复接收组播数据的节点向其上游节点发送嫁接报文(Graft Message)以申请重新加入到SPT中;
(2) 当上游节点收到该报文后恢复该下游节点的转发状态,并向其回应一个嫁接应答报文(Graft-Ack Message)以进行确认;
(3) 如果发送嫁接报文的下游节点没有收到来自其上游节点的嫁接应答报文,将重新发送嫁接报文直到被确认为止。
在一个网段内如果存在多台组播路由器,则相同的组播报文可能会被重复发送到该网段。为了避免出现这种情况,就需要通过断言(Assert)机制来选定唯一的组播数据转发者。
图2 Assert机制示意图
如图2所示,当Router A和Router B从上游节点收到(S,G)组播报文后,都会向本地网段转发该报文,于是处于下游的节点Router C就会收到两份相同的组播报文,Router A和Router B也会从各自的本地接口收到对方转发来的该组播报文。此时,Router A和Router B会通过本地接口向所有PIM路由器(224.0.0.13)以组播方式发送断言报文(Assert Message),该报文中携带有以下信息:组播源地址S、组播组地址G、到组播源的单播路由的优先级和度量值。通过一定的规则对这些参数进行比较后,Router A和Router B中的获胜者将成为(S,G)组播报文在本网段的转发者,比较规则如下:
(1) 到组播源的单播路由的优先级较高者获胜;
(2) 如果到组播源的单播路由的优先级相等,那么到组播源的度量值较小者获胜;
(3) 如果到组播源的度量值也相等,则本地接口IP地址较大者获胜。
PIM-DM使用以“扩散—剪枝”方式构建的SPT来传送组播数据。尽管SPT的路径最短,但是其建立的过程效率较低,并不适合大中型网络。
PIM-SM属于稀疏模式的组播路由协议,使用“拉(Pull)模式”传送组播数据,通常适用于组播组成员分布相对分散、范围较广的大中型网络。
PIM-SM的基本原理如下:
l PIM-SM假设所有主机都不需要接收组播数据,只向明确提出需要组播数据的主机转发。PIM-SM实现组播转发的核心任务就是构造并维护RPT(Rendezvous Point Tree,共享树或汇集树),RPT选择PIM域中某台路由器作为公用的根节点RP(Rendezvous Point,汇集点),组播数据通过RP沿着RPT转发给接收者;
l 连接接收者的路由器向某组播组对应的RP发送加入报文(Join Message),该报文被逐跳送达RP,所经过的路径就形成了RPT的分支;
l 组播源如果要向某组播组发送组播数据,首先由与组播源侧DR(Designated Router,指定路由器)负责向RP进行注册,把注册报文(Register Message)通过单播方式发送给RP,该报文到达RP后触发建立SPT。之后组播源把组播数据沿着SPT发向RP,当组播数据到达RP后,被复制并沿着RPT发送给接收者。
复制仅发生在分发树的分支处,这个过程能够自动重复直到数据包最终到达接收者。
PIM-SM使用与PIM-DM类似的邻居发现机制,具体请参见“邻居发现”一节。
借助Hello报文还可以为共享网络(如Ethernet)选举DR,DR将作为该共享网络中组播数据的唯一转发者。
无论是与组播源相连的网络,还是与接收者相连的网络,都需要选举DR。接收者侧的DR负责向RP发送加入报文;组播源侧的DR负责向RP发送注册报文。
& 说明:
l 各路由器之间通过比较Hello报文中所携带的优先级和IP地址,可以为多路由器网段选举DR。选举出的DR对于PIM-SM有实际的意义;而对于PIM-DM来说,其本身其实并不需要DR,但如果PIM-DM域中的共享网络上运行了IGMPv1,则需要选举出DR来充当共享网络上的IGMPv1查询器。
l 在充当DR的设备上必须使能IGMP,否则连接在该DR上的接收者将不能通过该DR加入组播组。
图3 DR选举示意图
如图3所示,DR的选举过程如下:
(1) 共享网络上的各路由器相互之间发送Hello报文(携带有竞选DR优先级的参数),拥有最高优先级的路由器将成为DR;
(2) 如果优先级相同,或者网络中至少有一台路由器不支持在Hello报文中携带竞选DR优先级的参数,则根据各路由器的IP地址大小来竞选DR,IP地址最大的路由器将成为DR。
当DR出现故障时,其余路由器在超时后仍没有收到来自DR的Hello报文,则会触发新的DR选举过程。
RP是PIM-SM域中的核心设备。在结构简单的小型网络中,组播信息量少,整个网络仅依靠一个RP进行组播信息的转发即可,此时可以在PIM-SM域中的各路由器上静态指定RP的位置;但是在更多的情况下,PIM-SM域的规模都很大,通过RP转发的组播信息量巨大。为了缓解RP的负担并优化RPT的拓扑结构,可以在PIM-SM域中配置多个C-RP(Candidate-RP,候选RP),通过自举机制来动态选举RP,使不同的RP服务于不同的组播组,此时需要配置BSR(BootStrap Router,自举路由器)。BSR是PIM-SM域的管理核心,一个PIM-SM域内只能有一个BSR,但可以配置多个C-BSR(Candidate-BSR,候选BSR)。这样,一旦BSR发生故障,其余C-BSR能够通过自动选举产生新的BSR,从而确保业务免受中断。
& 说明:
l 一个RP可以同时服务于多个组播组,但一个组播组只能唯一对应一个RP。
l 一台设备可以同时充当C-RP和C-BSR。
如图4所示,BSR负责收集网络中由C-RP发来的宣告报文(Advertisement Message),该报文中携带有C-RP的地址和优先级以及其服务的组范围,BSR将这些信息汇总为RP-Set(RP集,即组播组与RP的映射关系数据库),封装在自举报文(Bootstrap Message)中并发布到整个PIM-SM域。
图4 RP与BSR信息交互示意图
网络中的各路由器将依据RP-Set提供的信息,使用相同的规则从众多C-RP中为特定组播组选择其对应的RP,具体规则如下:
(1) 首先比较C-RP的优先级,优先级较高者获胜。
(2) 若优先级相同,则使用哈希(Hash)函数计算哈希值,该值较大者获胜。
(3) 若优先级和哈希值都相同,则C-RP地址较大者获胜。
哈希函数的表达式为:Value (G, M, Ci) = (1103515245 * ( (1103515245 * (G & M) + 12345) XOR Ci) + 12345) mod 231,其中各符号的含义如表1所示。
符号 | 含义 |
Value | 哈希值 |
G | IP组播组的地址 |
M | 哈希掩码长度(Hash Mask Length) |
Ci | C-RP的IP地址 |
& | 逻辑运算符,表示与运算 |
XOR | 逻辑运算符,表示异或运算 |
mod | 算术运算符,表示整除取余 |
图5 PIM-SM中构建RPT示意图
如图5所示,RPT的构建过程如下:
(1) 当接收者加入一个组播组G时,先通过IGMP报文通知与其直连的DR;
(2) DR掌握了组播组G的接收者的信息后,向该组所对应的RP方向逐跳发送加入报文;
(3) 从DR到RP所经过的路由器就形成了RPT的分支,这些路由器都在其转发表中生成了(*,G)表项,这里的“*”表示来自任意组播源。RPT以RP为根,以DR为叶子。
当发往组播组G的组播数据流经RP时,数据就会沿着已建立好的RPT到达DR,进而到达接收者。
当某接收者对组播组G的信息不再感兴趣时,与其直连的DR会逆着RPT向该组的RP方向逐跳发送剪枝报文;上游节点收到该报文后在其出接口列表中删除与下游节点相连的接口,并检查自己是否拥有该组播组的接收者,如果没有则继续向其上游转发该剪枝报文。
组播源注册的目的是向RP通知组播源的存在。
如图6所示,组播源向RP注册的过程如下:
(1) 当组播源S向组播组G发送了一个组播报文时,与组播源直连的DR在收到该报文后,就将其封装成注册报文,并通过单播方式发送给相应的RP;
(2) 当RP收到该报文后,一方面解封装注册报文并将封装在其中的组播报文沿着RPT转发给接收者,另一方面向组播源逐跳发送(S,G)加入报文。这样,从RP到组播源所经过的路由器就形成了SPT的分支,这些路由器都在其转发表中生成了(S,G)表项。SPT以组播源为根,以RP为叶子。
(3) 组播源发出的组播数据沿着已建立好的SPT到达RP,然后由RP把组播数据沿着RPT向接收者进行转发。当RP收到沿着SPT转发来的组播数据后,通过单播方式向与组播源直连的DR发送注册停止报文(Register-Stop Message),组播源注册过程结束。
当接收者侧的DR发现从RP发往组播组G的组播数据速率超过了一定的阈值时,将由其发起从RPT向SPT的切换,过程如下:
(1) 首先,接收者侧DR向组播源S逐跳发送(S,G)加入报文,并最终送达组播源侧DR,沿途经过的所有路由器在其转发表中都生成了(S,G)表项,从而建立了SPT分支;
(2) 随后,接收者侧DR向RP逐跳发送包含RP位的剪枝报文,RP收到该报文后会向组播源方向继续发送剪枝报文(假设此时只有这一个接收者),从而最终实现从RPT向SPT的切换。
从RPT切换到SPT后,组播数据将直接从组播源发送到接收者。通过由RPT向SPT的切换,PIM-SM能够以比PIM-DM更经济的方式建立SPT。
PIM-SM使用与PIM-DM类似的断言机制,具体请参见“断言”一节。
一般情况下,在一个PIM-SM域内只能有一个BSR,并由该BSR负责在整个PIM-SM域内宣告RP-Set信息,所有组播组的信息都在此BSR管理的网络范围内进行转发,我们称之为非管理域机制。
考虑到管理的精细化,可以将整个PIM-SM域划分为一个Global域(Global-scope Zone)和多个管理域(Admin-scope Zone),一方面可以有效分担单一BSR的管理压力,另一方面可以使用私有组地址为特定区域提供专门的服务。相应地,我们称之为管理域机制。
管理域与组播组相对应,针对不同组播组划分相应的管理域。管理域的边界由ZBR(Zone Border Router,区域边界路由器)构成,每个管理域各维护一个BSR,为特定范围的组播组服务,属于此范围的组播协议报文(如断言报文、BSR自举报文等)无法通过管理域边界。不同管理域所服务的组播组范围可以重叠,该组播组只在本管理域内有效,相当于私有组地址。不属于任何管理域的组播组则一律属于Global域的服务范围,Global域中维护一个BSR,为剩余的所有组播组服务。
每个管理域和Global域都有独立的C-RP和BSR设备,这些设备仅在其所属域有效,也就是说BSR机制与RP选举在各管理域之间是隔离的;每个管理域都有自己的边界,各管理域所服务组播组范围内的组播信息不能进、出该边界。为了更清晰地理解管理域和Global域,可以从以下两个角度进行考虑:
(1) 地域空间角度
管理域是针对特定组播组的逻辑管理区域,各管理域在地域上必须相互独立,如图7所示。
图7 地域空间上管理域与Global域的关系
在地域空间上,各管理域之间相互隔离,即同一路由器不能从属于多个管理域。换句话说,各管理域所包含的路由器互不相同。而Global域则包含了PIM-SM域内的所有路由器。
(2) 组地址范围角度
每个管理域为特定的组播组提供服务,这些组播组地址之间通常没有交集,但是也可能存在相互交叉和重叠关系。
如图8所示,管理域1与管理域2所对应的组地址范围无交集,而管理域3的组地址是管理域1组地址的子集;Global域所对应的组地址范围是除各管理域组地址外的其它所有组地址,即G−G1−G2。也就是说,Global域和所有管理域之间就组地址范围来说是互补关系。
SSM(Source-Specific Multicast,指定信源组播)模型和ASM(Any-Source Multicast,任意信源组播)模型是两个完全对等的模型。目前,ASM模型包括PIM-DM和PIM-SM两种模式,SSM模型能够借助PIM-SM的部分技术来实现。
SSM模型为指定源组播提供了解决方案,通过IGMPv3来维护主机与路由器之间的关系。在实际应用中,通常采用PIM-SM模式的一部分技术来实现SSM模型。由于接收者已经通过其它渠道(如广告咨询等)知道了组播源的具体位置,因此在SSM模型中无需RP,无需构建RPT,无需组播源注册过程,也无需通过MSDP(Multicast Source Discovery Protocol,组播源发现协议)来发现其它PIM域内的组播源。
与ASM模型相比,SSM模型仅需要IGMPv3和PIM-SM部分子集的支持。
PIM-SSM使用与PIM-SM完全相同的邻居发现机制,具体请参见“邻居发现”一节。
PIM-SSM使用与PIM-SM完全相同的DR选举机制,具体请参见 “DR选举”一节。
构建为PIM-SM服务的RPT,还是构建为PIM-SSM服务的SPT,关键在于接收者准备加入的组播组是否属于SSM组地址范围(IANA保留的SSM组地址范围为232.0.0.0/8)。
图9 PIM-SSM中构建SPT示意图
如图9所示,Host B和Host C为组播信息的接收者(Receiver),由其借助IGMPv3的报告报文向DR报告自己对来自组播源S、发往组播组G的信息感兴趣。收到该报告报文的DR先判断该报文中的组地址是否在SSM组地址范围内:
l 如果在SSM组地址范围内,则构建PIM-SSM,并向组播源S逐跳发送通道(Channel)的订阅报文(Subscribe Message)。沿途所有路由器上都创建(S,G)表项,从而在网络内构建了一棵以组播源S为根、以接收者为叶子的SPT,该SPT就是PIM-SSM中的传输通道;
l 如果不在SSM组地址范围内,则仍旧按照PIM-SM的流程进行后续处理,此时DR需要向RP发送(*,G)加入报文,同时需要进行组播源的注册。
& 说明:
在PIM-SSM中,借助“通道”的概念表示组播组,借助“订阅报文”的概念表示加入报文。
在多实例应用中,组播路由器需要针对不同的VPN实例分别维护PIM邻居表、组播路由表、BSR信息和RP-Set信息,并保持多个VPN实例间上述信息的相互独立。
当组播路由器收到组播数据报文时,需要区分出该数据报文所属的VPN实例,并根据该VPN实例对应的组播路由表将其转发,或创建与该VPN实例的PIM相关的组播路由表项。