PIM是什么

PIM(Protocol Independent Multicast,协议无关组播)协议的主要作用是构建组播分发树。

IP组播IGMP基础中提到,组播网络中的组播路由器需要根据组播分发树将组播数据转发到组播组成员,而组播路由协议中最常用的PIM协议的主要作用就是来构建这棵分发树。相比于其他组播路由协议,PIM更为具体的作用是生成AS域内的组播分发树

MDT(组播分发树)特点:无论网络中有多少组成员,每条链路上相同的组播数据最多只有一份。被传递的组播数据在距离组播源尽可能远的分叉路口才开始复制和分发。

PIM的协议无关指的是与单播路由协议无关,PIM不需要维护专门的单播路由信息,它直接利用单播路由表的路由信息,对组播信息执行[RPF检查](../ip组播基础 #组播转发)

PIM直接封装在IP报文中,协议号为103,PIM常用版本为PIMv2,组播地址为224.0.0.13

PIM协议有两种模式:

  • PIM-DM(PIM-Dense Mode,PIM密集模式),主要用于组成员较少且相对密集的组播网络中,构建MDT的思路是将组播流量在全网扩散,然后剪枝没有组成员的路径。PIM-DM只有ASM模型。

  • PIM-SM(PIM-Sparse Mode,PIM稀疏模式),其中还能分为PIM-SM(ASM)和PIM-SM(SSM),主要用于组成员较多且较稀疏的组播网络中,构建MDT的思路是先收集组成员信息,然后再形成MDT。

MDT分类

MDT分为SPT和RPT,其中SPT以组播源为根,组播组成员为叶子,而RTP以RP(Rendezvous Point)为根,组播组成员为叶子。

SPT又称为源树,在PIM-DM和PIM-SM中均有使用;RPT称为共享树,主要在PIM-SM中使用。

工作原理

前面提到PIM有两种模式,分别是PIM-DM和PIM-SM,下面将分别介绍两种模式的工作机制。

介绍之前,首先要知道PIM网络中的PIM路由表。PIM路由表是通过PIM协议建立的组播协议路由表,存在两种表项:

  • (S,G)主要用于建立SPT,对PIM-DM和PIM-SM适用

  • (* ,G)主要用于建立RPT,对PIM-SM适用

PIM路由器上可能同时存在两种表项,当收到源地址为S,组地址为G的组播报文,且RPF检查通过的情况下,先检查是否存在(S,G)表项,如果存在则直接由(S,G)路由表项指导转发,否则则先依照(* ,G)路由表项创建(S,G)表项,然后再根据(S,G)表项指导转发。

不同的组播路由器的组播路由表由不同的表项汇总合成。在最后一跳路由器上组播路由表项主要基于PIM路由表项、IGMP组表项和IGMP路由表项汇总形成;其余的则基于PIM路由表项生成。

注意
组播路由表项只能基于PIM(S,G)生成,PIM(* ,G)缺少入接口信息无法形成组播路由表项。

PIM-DM

PIM-DM通过“扩散-剪枝”的方式形成SPT,除了扩散剪枝,还会设计邻居发现、嫁接、断言和状态刷新机制。

邻居发现

组播转发路径只能在PIM邻居之间建立,邻居发现主要通过 PIM Hello 包完成。

当路由器接口激活PIM后,接口便周期性发送PIM Hello数据包,目的地址为224.0.0.13。邻居关系同样使用Hello报文维持,邻居超时时间默认为10s,超时时间内收不到邻居发来的Hello报文,则删除邻居关系。

Hello报文中携带多项PIM协议报文参数,主要用于PIM邻居之间PIM协议报文的控制:

  • DR_Priority:表示各路由器接口竞选DR的优先级,优先级越高越容易获胜。

  • Holdtime:表示保持邻居为可达状态的超时时间。如果在超时时间内没有收到PIM邻 居发送的Hello报文,路由器则认为邻居不可达。

  • LAN_Delay:表示共享网段内传输Prune报文的延迟时间。

  • Neighbor-Tracking:表示邻居跟踪功能。

  • Override-Interval:表示Hello报文中携带的否决剪枝的时间间隔。

首次形成组播分发树

首次形成组播分发树主要依赖扩散机制、剪枝机制、断言机制和DR选举机制

扩散机制

组播源发送的组播报文会在全网内扩散。当PIM路由器接收到组播报文,先进行RPF检查,通过后会在该路由器上创建(S,G)表项,之后会向所有PIM邻居发送。

(S,G)表项有老化时间(默认为210s),老化时间超过前未收到新的组播报文,则删除(S,G)表项。

扩散机制会周期性(默认180s)全网扩散组播数据,周期性扩散的主要目的是探测是否有新成员加组,但是由于全网扩散组播数据会浪费大量带宽,所以现在的组播网络一般使用 “状态刷新机制”加上“嫁接机制”来实现周期性全网扩散感知新成员加组的目的。

断言机制

当一个网段内有多个相连的PIM路由器向该网段转发组播报文时,需要通过断言机制来保证只有一个PIM路由器向该网段转发组播报文

通过断言机制的选举规则来决定组播路由器的转发行为:获胜一方的下游接口称为Assert Winner,将负责后续对该网段组播报文的转发,落败一方的下游接口称为Assert Loser,后续不会对该网段转发组播报文,PIM路由器也会将其从(S,G)表项下游接口列表中删除。

断言机制的触发条件是PIM路由器在接收到邻居路由器发送的相同组播报文后,向该网段发送断言报文,进行Assert选举。Assert报文内会携带到组播源的单播路由前缀,路由优先级与开销。选举规则如下:

  • 单播路由协议优先级较高者胜
  • 优先级相同,则到组播源的开销较小者获胜
  • 如果以上都相同,则下游接口IP地址最大者获胜

Assert选举失败的设备会抑制转发,并保持一段时间(默认180s),保持时间超时后,竞选失败的设备会恢复转发从而触发新一轮竞选。

剪枝机制

对于没有组成员连接的组播路由器,组播网络无需将组播流量继续发往该设备,可将此类路径剪枝。

路由器被裁剪的下游接口将启动一个剪枝定时器(默认为210s),定时器超时后接口恢复转发。组播报文重新在全网范围内扩散,新加入的组成员可以接收到组播报文。随后,下游不存在组成员的叶子路由器将向上发起剪枝操作。通过这种周期性的扩散-剪枝,PIM-DM周期性刷新SPT

当下游接口被剪枝后:

  • 如果下游叶子路由器有组成员加入,并且希望在下次“扩散-剪枝”前就恢复组播报文转发,则执行嫁接动作。
  • 如果下游叶子路由器一直没有组成员加入,希望该接口保持抑制转发状态,则执行状态刷新动作。

维护组播分发树

PIM邻居关系稳定后,组成员没有变化的情况下,维护组播分发树一般有两种方式:

  1. 持续发送组播报文,保证组播路由表项能一直存在
  2. 发送状态刷新报文,保证组播路由表项的下行接口状态不发生变化。

状态刷新机制

PIM-DM中,为了避免被剪枝的接口因为剪枝定时器超时而恢复转发,离组播最近的第一跳路由器会周期性地触发State Refresh报文在全网内扩散。

收到State Refresh报文的PIM路由器会刷新剪枝定时器的状态。被裁剪接口的下游叶子路由器如果一直没有组成员加入,该接口会一直处于抑制转发状态。

嫁接机制

叶子路由器通过IGMP了解到与其相连的用户网段上,组播组G有新的组成员加入。随后叶子路由器会基于本地的组播路由表向上发送Graft报文,请求上游路由器恢复相应出接口转发,将其添加(S,G)表项下游接口列表,将其添加在(S,G)表项下游接口列表中。

一般现网中通过嫁接机制来实现新成员加组。

PIM-SM(ASM)

中大型组播网络中由于网络较大,如果依然使用PIM-DM,其中的扩散-剪枝机制对网络有一定冲击,同时所有组播路由器都要维护组播路由表,尽管有些路由器不需要转发组播数据。

PIM-DM使用扩散-剪枝的机制原因是组播网络中大部分的路由器并不知道组成员的位置。

PIM-SM形成组播分发树的方法是:将组成员的位置事先告知某台组播路由器(RP),形成RPT。组播源在发送组播数据时,组播网络先将组播数据发送给RP,RP再将组播数据转发给组成员。对于部分次优的转发路径,PIM-SM能自动优化为SPT。

PIM-SM的报文和PIM-DM一样,目的地址都为224.0.0.13,IP协议号为103

RP

汇聚点RP用于处理源端DR注册信息及组成员加入请求,网络中的所有PIM路由器都必须知道RP的地址,类似于一个提供信息的汇聚中心。

可以通过在所有PIM路由器上配置相同的RP地址静态指定RP的位置;也可以通过选举机制在多个C-RP(候选RP)之间选举出RP。

着重介绍一下动态选举机制:

动态选举会设计两类角色:C-BSR和C-RP。C-BSR通过竞选选举出唯一的BSR。BSR的作用是收集C-RP的信息并形成RP-Set信息,BSR通过PIM报文将RP-Set信息扩散给所有的PIM路由器。PIM路由器收到RP-Set信息后,根据RP选举规则选举出合适的RP。

BSR竞选规则:优先级较高者(数值越大)获胜;优先级相同的比较IP地址。

RP竞选规则:

  • 与用户加入的组地址匹配的C-RP服务的组范围掩码最长者获胜。
  • 如果以上比较结果相同,则C-RP优先级较高者获胜(优先级数值越小优先级越高)。
  • 如果以上比较结果都相同,则执行Hash函数,计算结果较大者获胜。
  • 如果以上比较结果都相同,则C-RP的IP地址较大者获胜。

首次形成分发树

首次形成组播分发树主要依赖RPT构建机制、组播源注册机制和DR选举机制

DR机制

其实就跟PIM-DM的断言机制一样,为了避免重复的报文被组播源或组播叶子路由器接收。

在该例子中,先看左侧,源以及PIM路由器R1和R2共处一个BMA(广播多路访问)网络,那么产生自源的组播数据,R1、R2都能接收到,如果两者都向RP发起Register并转发组播数据,那么就会导致报文重复。因此我们在这个MA网络中进行DR选举,DR将负责向RP发起register以及负责将来自源的组播数据转发给RP,非DR当然就不承担转发功能。 ASM的DR选举通过Hello报文进行选举,报文中携带优先级和IP地址,优先级高的优选,其次再比较IP地址(大的优选)

再看右侧接受者与R3、R4共处一个MA网络,如果R3与R4都加入RPT共享树并且向这个MA网络转发组播数据,那么接受者将收到重复的组播数据,这实际上是没有意义的,因此在这里也选DR,由DR负责向RP发送Join消息并且形成RPT的分支,最终将接受者所在网络拉到共享树上,另外它也负责将树上的组播流量转发给接受者。

所以,总结一下:

  • 靠近源的DR(如上图R2)负责将source的组播数据发给RP(以及发送Register消息);
  • 靠近接受者的DR(如上图的R4)负责向RP发送Join消息从而形成共享树,也就是负责将接受者拉到共享树(同时负责将来自源的组播数据转发给接收者)。

IP最大的成为DR,但是这个因素不太稳定,毕竟想要改变DR还得改IP编址,因此增强的PIM协议建议在PIMv2的hello信息中加入DR优先级选项(默认值为1),优先级最高的路由器成为DR。当然并非所有的PIM路由器都支持这个DR优先级选项,不支持的路由器在发送PIM HELLO的时候不携带这个选项,当PIMv2路由器收到一个不包含DR优先级选项的hello时(或此消息中的优先级=0),那么接收方就知道,发送者不支持这个优先级选项,因此这个子网中的DR选举将使用IP地址进行比较。

DR优先级默认为1DR还可以充当IGMPv1的查询器

RPT构建

RPT是以RP为根,以存在组成员关系的PIM路由器为叶子的组播分发树。也就是构建RP到组播叶子路由器的分发树。

当网络中出现组成员(形成了IGMP表项)时,组成员端DR向RP发送Join报文,在通向RP的路径上逐跳创建(* ,G)表项,生成一棵RPT。

组播源注册机制

组播源与源端DR之间没有IGMP协议,无法通过IGMP生成PIM(* ,G)表项,进而无法发送Join消息形成组播分发树。

需要注意的是,组播数据是封装在了Register报文中的,而Register报文是针对RP的单播报文,因此源DR和RP不仅仅要处理组播报文,还要处理单播报文;同时,源端DR形成到RP的SPT后,会同时发送单播Register报文和组播报文,造成重复组播报文。为了解决这个问题,当SPT建立后,RP使用Register-Stop报文通知源端DR停止发送Register报文,后续报文使用组播报文形式发送,此后组播报文按照SPT+RPT的路径被发送到组成员。

SPT切换机制

在PIM-SM网络中,一个组播组只对应一个RP,因此组播数据最初都会发往RP,由RP进行转发,但会导致一些问题:过大的组播流量会增加RP的负担;组播转发路径可能是次优路径。

为了解决次优路径问题,成员端DR会基于组播数据包中的源IP,反向建立从成员端DR到源的SPT

设备沿着最短路径发送Join消息,该最短路径基于RPF选举规则决定。设备将Join消息从RPF选举得出的上行接口发出。

SPT切换的触发条件:缺省条件下,当RP或组成员端DR收到第一个组播数据包之后,就会向源发起SPT切换。因此大多数情况下,最开始建立的SPT+RPT,使得成员端DR接收到第一个组播报文,此后成员端DR建立了SPT到组播源之后,就使用SPT转发组播报文了。

维护分发树

当分发树(STP或RPT)稳定后,成员端DR会周期性发送Join/Prune报文,用于维护分发树,如果组播在一段时间后(默认210s)没有流量则SPT树会消失(前文提到的SPT切换),成员端DR恢复到RP的RPT树(SPT+RPT)。

PIM-SM(SSM)

SSM模型对组地址不再要求全网唯一,只需要每个组播源保持唯一。唯一指的是同一个源上不同的组播应用必须使用不同的SSM地址来区分。不同的源可以使用相同的组地址,因为SSM模型中针对每个(源,组)信息生成表项。

由于SSM提前定义了组播源源地址,因此可以直接在成员端DR上反向建立SPT。因此也不再需要维护RP、无需构建RPT,也无需注册组播源。

分发树形成与维护:

分发树形成后不会因为没有组播流量而消失。

参考文章

PIM-SM DR指定路由器以及 PIM-DM指定前转器的区别 【转自网络】 - HBaks - 博客园 (cnblogs.com)