目录
组播源到RP建树过程(Register注册报文、Join加入报文)
PIM SM采用“拉”(Pull)的方式来转发组播报文并生成组播表,建立SPT(最短路径树)、RPT(共享树)转发组播报文。它假定每条链路都没有需求。
邻居建立
全网开启组播、配置PIM
通过Hello报文建立PIM邻居,并选举DR
选举RP
通过RP建立SPT以及RPT树
RPT树建立
在RP与组成员端建立RPT树(*,G)树
SPT树建立
在组播源与RP之间建立(S,G)树
通过组播源流量在RP与组成员端之间也建立(S,G)表项
SPT切换
为了减少RP的负担和避免次优路径,进行SPT切换
当组播源或组成员所在的网段,同时连接着多个PIM路由器时,会通过选举一个DR来负责源段或组成员端组播报文的收发
DR的选举规则(通过Hello报文来选举)
DR优先级高的为DR(前提网段中的所有PIM路由器都支持DR优先级)
优先级相同或有PIM路由器不支持DR优先级的情况,IP地址大的优先
当DR故障时,会重新选举新的DR
DR的主要作用
DR分为两种类型,不同类型的DR作用不同
源DR:连接组播源的,负责向RP发送Register注册报文
组成员端DR:连接组成员的,负责向RP发送Join加入报文
如果采用组播源去拉流量的话,对于使用IGMPv1、v2的组成员来说是无法找到组播源的
所以在PIM SM模式中,定义了RP(汇聚点,其实就是一台被设备为RP的网络设备),通过RP作为中介实现成员与组播源建树(即成员无法直接与组播源建SPT树)
RP是PIM SM中一台“核心”的路由器,它起到的是“汇聚”的作用,汇聚组播接收者的加入/剪枝请求和组播源的组播数据与注册请求。
具体如何汇聚如下
组播接收者所在网段的DR路由器向RP发(*,G)Join报文,建立RPT共享树
RP在收到组播路由器发送的Register注册报文后,向组播源转发(S,G)Join报文,建立SPT树
收到组播数据的最后一跳路由器(DR)向组播源建立SPT树(可选过程)
RP的注意事项
在PIM SM中,每一个PIM组播组都需要且只需要一个RP地址来建树,因此要求全网的路由器都要事先知道某个组的RP地址。(每个PIM域可以有多个RP)
按照RP部署维护的复杂性和方式,可以分为静态RP和动态RP部署
静态RP部署
手工添加RP和组的对应关系(全网PIM路由器都要配置)
注意
- 如果配置的静态RP地址是本机状态为UP的某个接口地址,本机就作为静态RP,作为静态RP的接口不必使能PIM协议。
- 如果没有指定ACL,配置的静态RP为所有组播组224.0.0.0/4服务
- 重复执行静态RP的配置命令,会创建多个RP
- 当存在多个静态RP为某个组服务的情况,则选择IP地址最大的RP为该组服务
- 当配置静态RP时携带了Preferred命令,静态RP的优先级高于动态RP。当配置静态RP时没有携带Preferred命令,则动态RP优先级高于静态RP
动态RP部署(Bootstrap自举报文)
目前动态RP协议使用的是PIMv2的BSR(自举协议)
BSR协议概念
- 在BSR协议中,定义了两种角色的设备:C-RP(Candidate-RP)、C-BSR(Candidate-BSR)两种
- 手动配置多台路由器为C-RP与C-BSR,从C-RP中竞选出RP,从C-BSR中竞选出BSR
- 这两种角色都可以定义多台,以提供冗余备份能力
从C-BSR选举BSR——通过BSR报文选举
C-BSR启动时会启动BSR超时计时器130s,并逐跳泛洪自身的Boostrap(BSR)报文
- 1、在130s内未收到其它Boostrap报文,则自己选举为BSR
- 2、在130s内收到其它Boostrap报文,则提取报文中的部分信息进行选举
- BSR报文中的优先级值越大,越优先
- BSR报文中的BSR的IP地址越大,越优先
BSR全网通告自己的IP地址
BSR会将自己是BSR的消息通过Boostrap报文全网泛洪
C-RP发送自己的RP映射信息给BSR
每个C-RP定义自己的一个接口IP地址和多个组播地址范围的对应关系
每一对IP地址和组播地址范围的对应关系都叫做RP映射
C-RP通过接收泛洪的BSR通告报文,获取BSR的地址。
之后每个C-RP会以单播的方式周期性60s把RP映射发往BSR
BSR全网通告C-RR的RP映射信息
BSR将收集到的RP映射通过周期性每隔60s发送的BSR报文通告出去
此时Boostrap报文会额外包含组范围、C-RP的优先级、C-RP的地址信息
如果路由器130s未收到BSR报文,则会清除本地已有的BSR信息和RP映射关系
全网路由器从C-RP中选举RP
接收端收到BSR泛洪的关于RR映射消息,从收到的RP映射关系中选择最优的C-RP作为RP
- 由于收到的RP映射关系中,组范围可能会重叠,会优选最最小的组范围所对应的RP
例如:C-RP1的组播范围为224.0.0.0/4,C-RP2的组播范围为224.1.2.0/24,当为组224.1.2.3选择RP时,会选择C-RP2为RP
- 优选C-RP优先级值小的(默认为0,值越小越优先)
- 执行Hash算法,结果大的优选
- C-RP地址大的获胜
RP是PIM SM的核心,容易出现瓶颈,发生单点故障
RP未必处于源和接收者路由器之间的最优路径上,经过的RPT树路径未必是最优路径
由接收端DR逐跳向RP建立RPT,发送(*,G)Join报文
- 当连接组成员的DR路由器收到IGMP成员报告报文,创建(*,G)表项,并查找对应此组播组的RP地址(收到IGMP报告报文的接口为下游接口)
- 根据RP地址进行RPF检查,找到去往RP的RPF接口,并发送(*,G)Join报文(此RPF接口为上游接口)
- 上游路由器收到(*,G)Join报文后,创建(*,G)的表项(收到此报文的接口为下游接口),并查找对应此接口的RP地址,并向RPF接口发送(*,G)Join报文,逐跳构建RPT树直到找到RP为止
只要接收者存在,连接组成员的设备会每60s向上游发送(*,G)Join刷新组播路由表(*,G)条目
为什么组成员到RP生成的是(*,G)表项?
对于组成员来说,当组成员使用IGMPv1和v2时,不知道组播源IP,只知道组播地址,因此刚开始成员端与RP建立(*,G)表项。
- 当连接组播源的DR路由器收到组播流量后,根据组地址查到RP的地址。然后将组播报文通过单播的注册报文(携带源信息和组信息)发送给RP
- 如果RP存在(*,G)表项,并存在下游接口,则解封装注册报文,根据RPT树转发组播流量。并根据组播源地址检查RPF接口,发送(S,G)Join报文,逐渐构建SPT树。源端DR构建SPT树后,会沿着SPT树转发组播流量到RP,RP收到后发送注册停止报文
- 如果RP不存在(*,G)表项或者没有下游接口,则直接注册停止报文给源端DR。源端DR停止将组播报文封装在注册报文中,RP也不会发送(S,G)Join报文
注册报文和注册停止报文在组播源活跃期间会一直发送
源端DR会在组播源活跃期间每个55s发送一次空的注册报文给RP
- RP如果已经存在关于组播源的(S,G)表项,则会发送注册停止报文(表示自己已经有此组播源表项)
- RP如果不存在关于组播的(*,G)表项,则会发送注册停止报文(表示此组播源下无成员,不需要)
- RP如果存在关于组播的(*,G)表项,但是没有关于组播源的(S,G)表项,则不会发送注册停止报文(表示自己需要组播源注册建立SPT树)
源端DR在发送空的注册报文后,如果5s内收不到注册停止报文,就会发送带组播流量的单播注册报文到RP
- RP收到后建立关于组播源的(S,G)表项,重复上述建立SPT树的过程
为什么也要与成员端DR建立SPT树
因为转发流量一定需要(S,G)表项
对于一些接收者来说,通过RP的组播转发路径并不是最优的路径,此时就需要Switchover机制(即SPT切换),SPT切换由与组成员直连的路由器触发的
接收者到组播源也会建立SPT树,之前RP与源建立的树就不用了,这个过程就称为SPT切换
什么时候进行SPT切换
当用户端DR收到组播报文的速率超过阈值时,会进行SPT切换,由组成员端DR发起
华为设备上阈值默认为0,即只要有流量就会进行SPT切换
SPT切换的工作过程
组成员DR检查自己(S,G)表项的上游接口是否为组源接口
如果是则继续向上游检查,如果不是则向真正的上游接口发送(S,G)表项发送Join报文
当真正的上游接口收到组播源流量后,会向之前的上游接口发送剪枝报文
上述介绍的PIM为ASM模型的建树过程,SSM模型需要借助PIM-SM的部分技术和IGMPv3/MLDv2来实现
SSM模型的特点
SSM模型无需维护RP、无需构建RPT、无需注册组播源、可以直接在组播源与成员之建立SPT(需要选举DR,建立邻居,然后直接建立SPT树)
当成员端使用IGMPv3/MLDv2加入组播组时,为SSM模型
SPT建树
接收端DR直接发送关于(S,G)表项的Join报文,逐跳向源发送
PIM路由器通过Join报文创建(S,G)表项
SPT建立后,源段就会将组播报文沿着SPT分发给组成员
PIM实现方式比较