定义
PIM(Protocol Independent Multicast)称为协议无关组播。这里的协议无关指的是与单播路由协议无关,即PIM不需要维护专门的单播路由信息。作为组播路由解决方案,它直接利用单播路由表的路由信息,对组播报文执行RPF(Reverse Path Forwarding,逆向路径转发)检查,检查通过后创建组播路由表项,从而转发组播报文。
目前设备实际支持的PIM协议包括:PIM-DM(PIM-Dense Mode)、PIM-SM(PIM-Sparse Mode)。
目的
1992年,为了承载网络视频会议、音频会议,以MOSPF和DVMRP为组播路由协议的虚拟IP组播骨干网——Mbone建立成功。这为组播技术应用和推广起到了积极作用,在随后的十几年,组播路由协议得到了很大发展。
但是随着多个组播路由协议的开发与应用,人们渐渐感觉到,如果像单播路由一样通过多种路由协议算法来动态生成组播路由,会带来不同路由协议间在互相引入路由时操作繁琐的问题。而且网络设备对于单播和组播路由信息都需要维护。这也就催生了一种与单播路由协议无关的组播路由协议——PIM。PIM协议只专注于组成员和组播源状态相关的信息,而选取路径的信息直接从单播路由表获取。因此它不需要维护庞大的路由信息,从而降低了PIM协议的复杂性。这使得PIM协议成为应用最广泛的域内组播协议。
PIM基本概念
通过图1来介绍PIM的一些基本概念。
组播分发树
PIM网络以组播组为单位在路由器上建立一点到多点的组播转发路径。由于组播转发路径呈现树型结构,也称为组播分发树MDT(Multicast Distribution Tree)。
组播分发树主要包括以下两种:
-
以组播源为根,组播组成员为叶子的组播分发树称为SPT(Shortest Path Tree)。SPT同时适用于PIM-DM网络和PIM-SM网络。
如图1中的RouterE→RouterD→RouterA(RouterB),就是一棵以Source为根,以HostA、HostB为叶子的SPT。
-
以RP(Rendezvous Point)为根,组播组成员为叶子的组播分发树称为RPT(RP Tree)。RPT适用于PIM-SM网络。
有关RP以及RPT的详细介绍请参见PIM-SM(ASM模型)。
PIM路由器
在接口上使能了PIM协议的路由器即为PIM路由器。在建立组播分发树的过程中,PIM路由器又分为以下几种:
- 叶子路由器:与用户主机相连的PIM路由器,但连接的用户主机不一定为组成员,如图1中的RouterA、RouterB、RouterC。
- 第一跳路由器:组播转发路径上,与组播源相连且负责转发该组播源发出的组播数据的PIM路由器。如图1中的RouterE。
- 最后一跳路由器:组播转发路径上,与组播组成员相连且负责向该组成员转发组播数据的PIM路由器。如图1中的RouterA、RouterB。
- 中间路由器:组播转发路径上,第一跳路由器与最后一跳路由器之间的PIM路由器。如图1中的RouterD。
PIM路由表项
PIM路由表项即通过PIM协议建立的组播路由表项。PIM网络中存在两种路由表项:(S,G)路由表项或(*,G)路由表项。S表示组播源,G表示组播组,*表示任意。
- (S,G)路由表项主要用于在PIM网络中建立SPT。对于PIM-DM网络和PIM-SM网络适用。
- (*,G)路由表项主要用于在PIM网络中建立RPT。对于PIM-SM网络适用。
PIM路由器上可能同时存在两种路由表项。当收到源地址为S,组地址为G的组播报文,且RPF检查通过的情况下,按照如下的规则转发:
- 如果存在(S,G)路由表项,则由(S,G)路由表项指导报文转发。
- 如果不存在(S,G)路由表项,只存在(*,G)路由表项,则先依照(*,G)路由表项创建(S,G)路由表项,再由(S,G)路由表项指导报文转发。
PIM路由表项中主要用于指导转发的信息如下:
扩散(Flooding)
当PIM-DM网络中出现活跃的组播源之后,组播源发送的组播报文将在全网内扩散。当PIM路由器接收到组播报文,根据单播路由表进行RPF检查通过后,就会在该路由器上创建(S,G)表项,下游接口列表中包括除上游接口之外与所有PIM邻居相连的接口,后续到达的组播报文将从各个下游接口转发出去。
最后组播报文扩散到达叶子路由器,会出现以下两种情况:
有时组播报文扩散到一个连着多台PIM路由器的共享网段时,会出现这种情况:这些PIM路由器上进行的RPF检查都能通过,从而有多份相同报文转发到这个网段。此时,需要执行断言动作。
如图1所示,在PIM-DM网络中,RouterA、RouterB和RouterC之间通过发送Hello报文建立了PIM邻居关系。HostA通过RouterA与HostA之间运行的IGMP协议加入了组播组G,HostB没有加入任何组播组。
- 组播源地址。
- 组播组地址。
- 上游接口:本地路由器上接收到组播数据的接口,如图1中的Int3。
- 下游接口:将组播数据转发出去的接口,如图1中的Int1、Int2。
-
PIM-DM
基本原理
PIM-DM使用“推(Push)模式”转发组播报文,一般应用于组播组成员规模相对较小、相对密集的网络。在实现过程中,它会假设网络中的组成员分布非常稠密,每个网段都可能存在组成员。当有活跃的组播源出现时,PIM-DM会将组播源发来的组播报文扩散到整个网络的PIM路由器上,再裁剪掉不存在组成员的分支。PIM-DM通过周期性的进行“扩散(Flooding)—剪枝(Prune)”,来构建并维护一棵连接组播源和组成员的单向无环SPT(Source Specific Shortest Path Tree)。如果在下一次“扩散-剪枝”进行前,被裁剪掉的分支由于其叶子路由器上有新的组成员加入而希望提前恢复转发状态,也可通过嫁接(Graft)机制主动恢复其对组播报文的转发。
PIM-DM的关键工作机制包括邻居发现、扩散、剪枝、嫁接、断言和状态刷新。其中,扩散、剪枝、嫁接是构建SPT的主要方法。
邻居发现(Neighbor Discovery)
PIM路由器上每个使能了PIM协议的接口都会对外发送Hello报文。封装Hello报文的组播报文的目的地址是224.0.0.13(表示同一网段中所有PIM路由器)、源地址为接口的IP地址、TTL数值为1。
Hello报文的作用:发现PIM邻居、协调各项PIM协议报文参数、维持邻居关系。
-
发现PIM邻居
同一网段中的PIM路由器都必须接收目的地址为224.0.0.13的组播报文。这样直接相连的PIM路由器之间通过交互Hello报文以后,就可以彼此知道自己的邻居信息,建立邻居关系。
只有邻居关系建立成功后,PIM路由器才能接收其他PIM协议报文,从而创建组播路由表项。
-
协调各项PIM协议报文参数
Hello报文中携带多项PIM协议报文参数,主要用于PIM邻居之间PIM协议报文的控制。具体如下:
-
DR_Priority:表示各路由器接口竞选DR的优先级,优先级越高越容易获胜。
-
Holdtime:表示保持邻居为可达状态的超时时间。如果在超时时间内没有收到PIM邻居发送的Hello报文,路由器则认为邻居不可达。
-
LAN_Delay:表示共享网段内传输Prune报文的延迟时间。
-
Neighbor-Tracking:表示邻居跟踪功能。
-
Override-Interval:表示Hello报文中携带的否决剪枝的时间间隔。
参数DR_Priority只在PIM-SM网络的DR竞选中用到。有关DR竞选的内容请参见“PIM-SM(ASM模型) DR竞选”。
-
-
维持邻居关系
PIM路由器之间周期性地发送Hello报文。如果Holdtime超时还没有收到该PIM邻居发出的新的Hello报文,PIM路由器就认为该邻居不可达,将其从邻居列表中清除。
PIM邻居的变化将导致网络中组播拓扑的变化。如果组播分发树上的某上游邻居或下游邻居不可达,将导致组播路由重新收敛,组播分发树迁移。
- 若与该叶子路由器相连用户网段上存在组成员,则将与该网段相连的接口加入(S,G)表项的下游接口列表中,后续的组播报文会向组成员转发。
- 若与该叶子路由器相连用户网段上不存在组成员,且不需要向其下游PIM邻居转发组播报文,则执行剪枝动作。