基本概念:
概述:
PIM SM适用于ASM(Any-Source Multicast)和SSM(Source-Specific Multicast)两种模型。使用“拉(Pull)模式”转发组播报文,一般应用于组播组成员规模相对较大、相对稀疏的网络。基于这一种稀疏的网络模型,它的实现方法是:
- 在网络中维护一台重要的PIM路由器:汇聚点RP(Rendezvous Point)。组播网络上的接收者和组播源彼此并不知道对方是否存在及所在位置,所以引入RP作为网络的核心,网络中所有PIM路由器都知道RP的位置。
- 当网络中出现组成员(用户主机通过IGMP加入某组播组G)时,最后一跳路由器向RP发送Join报文,逐跳创建(*,G)表项,生成一棵以RP为根的RPT。
- 当网络中出现活跃的组播源(信源向某组播组G发送第一个组播数据)时,第一跳路由器将组播数据封装在Register报文中单播发往RP,在RP上创建(S,G)表项,注册源信息。
PIM-SM模型中,包括三个阶段:
- 接收者所在路由器(DR) 向RP发(*,G) Join 建共享树。
- 头一跳路由器向RP发送组播注册报文,注册组播源。
- 收到数据的最后一跳路由器(DR)向组播源建SPT树。(此过程可选,默认开启〉。
SPT和RPT树对比:
PIM SM中用到以下2种类型树:SPT 和RPT树。
- SPT (Shortest Path Tree)是以组播源为树根,连接组播源和组播接收者的分发树,彼此之间距离短,转发延迟低。
- RPT (Root-Path Tree)是以RP为树根,连接所有组员的分发树。由于RP位置可能不是最优,所以组播源流出的组播数据经RP转发给接收者时,会因次优路径问题而致转发延迟较大,相比于SPT的每个组播源和组就需要-一个 (S,G)条目,而RPT仅需一条(* ,G) 条目就可转发所有来自不同源的组播流量,内存开销消耗相对减少。(* ,G)中*代表任意源。
准备阶段:邻居发现与DR竞选:
在组播源或组成员所在的网段,通常同时连接着多台PIM路由器。这些PIM路由器之间通过交互Hello报文成为PIM邻居,Hello报文中携带DR优先级和该网段接口地址。PIM路由器将自身条件与对方报文中携带的信息进行比较,选举出唯一的DR来负责源端或组成员端组播报文的收发。竞选规则如下:
- DR优先级较高者获胜(网段中所有PIM路由器都支持DR优先级)。
- 如果DR优先级相同或该网段存在至少一台PIM路由器不支持在Hello报文中携带DR优先级,则IP地址较大者获胜。
- 如果当前DR出现故障,将导致PIM邻居关系超时(缺省为105秒),其他PIM邻居之间会触发新一轮的DR竞选。
在ASM模型中,DR主要作用如下:
- 在连接组播源的共享网段,由DR负责向RP发送Register注册报文。与组播源相连的DR称为源端DR。
- 在连接组成员的共享网段,由DR负责向RP发送Join加入报文。与组成员相连的DR称为组成员端DR。
如上图,服务器向R1,R2,R3发送组播报文,其中选出的DR来负责转发流量。但是它不会像DM模型一样直接转发扩散,而是先自己保存,等到别人请求的时候再进行发送。DR会发送单播报文到RP上进行注册组播流量新。以后其他设备获取流量的时候就发送join信息到RP上即可(同一网段DR进行join注册),并且在SM模式下是没有嫁接报文的。
阶段一:组播接收者所连路由器向RP建共享树
概述:
PIM-SM RPT是一棵以RP为根,以存在组成员关系的PIM路由器为叶子的组播分发树。如拓扑所示,当我们在RP注册完了信息以后,网络中的所有组播路由设备,都会知晓具体哪个PIM路由器成为了RP。当PC需要对应组播流量的时候,发送对应组播组的IGMP报告报文到最后一跳路由器,因为这里探讨的是ASM模型,也就是发送IGMPv2,IGMPv1的报告报文,R3作为DR,收到报告报文后会产生相应的(* ,G)条目,并且有下游接口,又因为DR知道RP的IP地址,查看单播路由表,确定相应的上游接口,然后DR发送Join报文给上游邻居R4,R4产生( * ,G)条目,再查找路由表向RP发送Join报文。
具体场景:
-
上图中,当R6收到IGMP加入组229.1.2.3的请求后,R6生成( * , 229.1.2.3)条目,(* ,G) 条目下游接口是收到IGMP成员报告的接口,上游RPF接口是转发(*,229.1.2.3) Join 的接口。R6开始向树根RP建RPT共享树。
-
R5收到( * ,229.1.2.3) Join 后,创建相应(* ,229.1.2.3) 表项,并添加下游接口G0/0。 R6是最后一跳DR, 其每隔60s向上游发送( * ,229.1.2.3) Join报文,收到Join报文的接口重置接口计时器,超时时间为210s;若收不到Join报文,接口超时后,会从下游接口列表中移除。只要下游接口列表非空,R5 会继续经RPF接口向上游转发(* ,229.1.2.3) Join报文。
下游接口的超时时间是根据收到的Join/Prune 报文中的Holdtime 时间来决定的,默认Holdtime时间是210s,收到Join报文计时器重置,而收到Prune 报文接口剪除,除非再次收到Join报文接口才出现在下游接口列表中。 -
R4从下游接口S1/0/1 收到(* .229.1.2.3) Join, 创建条目( * .229.1.2.3), 添加下游接口S1/0/1,经RPF接口继续向,上游转发(*.229.1.2.3) Join 报文。
-
R3是RP,收到( * ,229.1.2.3) Join报文后,创建( * .229.12.3) 条目,添加下游接口S1/0/0。上游接口是接收组播数据的注册隧道接口( RegisterTunnel)。注册隧道( RegisterTunnel)是接收来自组播源的数据的逻辑接口。
-
Join转发的路径及在每台路由器上生成的组播转发表最终构成RPT树,只要接收者存在,R6会每60s向上游发送( * ,229.1.2.3) Join, 刷新组播路由表( * ,229.1.2.3)条目,RPT树会一直存在。
上图是R6产生的( * ,G) Join报文,报文的目标地址是PIM组播地址224.0.0.13。其中,PIM 选项字段中,上游邻居是根据路由表确定的RPF邻居地址,Join 字段中IP地址为10.1.3.3,是RP地址,置SWR位:
• S:代表Sparse Mode,在SM中,所有(S,G) Join/Prune 及(* ,G) Join/Prune报文均置位。
• W:通配符(Wildcard), 代表* ,此位仅在(* ,G) Join/Prune 中置位。
• R:RPT, 代表此份Join/Prune报文是向RP发送的报文,R位置位的报文可以是(S,G) Join/Prune, 也可以是(* ,G) Join/Prune。
注意:
如果在IP地址字段含W位,则代表该地址为RP的IP地址,此报文为(* ,G) Join/Prune 报文;而如果没有置W位,则代表该报文是(S,G) Join/Prune 报文。在PIM SM中,置SWR位的报文是(* ,G) Join/Prune; 置SR或仅置S位的报文是(S,G) Join/Prune报文。 其中,仅置S位的Join/Prune报文是发生SPT切换时向组播源发送的报文;而仅置SR位的Join/Prune报文是向RP发送的报文。
如果最后一跳有多台路由器连接到接收者所在网络,则仅DR路由器负责向RP发送(* ,G) Join。SM路由器向上游转发(* ,G) Join报文的条件:
• 收到下游 PIM邻居发来的(* ,G) Join 或收到直连接收者IGMP Join报文。
SM路由器向上游转发(* ,G) Prune 报文发生在如下条件:
• 游接口列表为 NULL。接口为空的原因可能是组播接收者离开或从下游邻居收到(* ,G) Prune 报文或下游接口未收到(* ,G) Join而超时。
只要组播接收者存在,最后一跳DR路由器会周期产生(*,G) Join 刷新RPT树。
阶段二:头一跳路由器向RP注册
概述:
在PIM-SM网络中,任何一个新出现的组播源都必须首先在RP处“注册”,继而才能将组播报文传输到组成员,因为RP就像是整个网络中的一个信息发布器,所有组播源的信息都只能够从它这里获取。由于在DR和RP间初始没有组播分发树,所以它的实现方式是在头一跳路由器DR和RP间建一个逻辑隧道,路由器在收到组播数据后,直接进入隧道。这个隧道其实是PIM的Register Tunnel,使用PIM注册报文作为外层封装,以单播方式由DR发给RP,RP收到注册报文后,将解封装的组播数据沿共享树(*,G) 条目转发下去。
最初的组播数据可以通过注册隧道发给RP,在RP了解组播源及组的地址后,开始向组播源建SPT树。SPT树建好后,源的组播数据通过SPT树流到RP,RP开始向DR发送注册停止报文。
根据组播接收者是在组播源活跃之前加入网络还是在组播源活跃之后加入网络,下面分两种情况描述上述注册过程:
场景1:源开始活跃时,接收者到RP的共享树已经存在
注册过程:
-
当组播源10.1.1.100 在以太网段活跃时,数据到达头一跳路由器 R1 (DR), 触发创建(10.1.1.100, 229.1.2.3) 组播条目。收到组播数据的G0/0/0接口为上游接口,下游接口是转发组播数据的接口,因为当前没有收到任何Join报文,所以没有下游接口,唯一的接口是注册隧道接口。
-
组播数据报文从上游接口流入,然后转发进注册隧道,隧道使用PIM协议封装组播报文,隧道的源IP地址是DR接口的IP地址10.1.1.1,目标IP地址是RP的IP地址10.1.3.3,PIM Register作为隧道协议直接封装路由器收到的原始的组播数据并发给RP。下图是DR发给RP的注册报文,其中包含组播数据(ICMP报文是组播数据)。
观察注册报文,其中有两个Flag位。
• B (Border) 位:未置位。如果DR和组播源直接相连,B位不置位;而如果DR路由器连接其他协议组播域的边界路由器,组播数据从其他域流入PIM组播域,则B位置位。
• N (Null-Register)位:未置位。如果注册报文中包含组播数据,则不置位;如果不包含组播数据,则置位,代表空注册报文,又称为Probe报文,后续探测报文时进行说明。 -
当RP收到注册报文并解封装后,并不对内部组播数据执行RPF检查,根据组播源和组的IP地址,观察当前RP是否有(* ,229.1.2.3)组播表项。R3当前存在(* ,229.1.2.3)组播表项,且下游接口非空。RP开始向下游转发组播数据,同时,在经过的每一跳路由器上,创建和(* , 229.1.2.3)并列存在的(101.1.100, 29.1.2.3)表项,二者有相同的上游及下游接口。
华为的Sparse Mode 实现中,当组播数据沿共享树向下游转发时,会触发每一跳设备创建和(* ,G) 一致的(S,G)表项,有一致的上下游接口对应关系,但该SPT树(S,G)表项不置SPT位,仅置ACT位(ACT 代表有数据经过该表项)。RPT树上每个设备虽有(S,G) 表项,但当数据从RP向最后一跳路由器流时,数据因(S,G) 表项无效而仍使用RPT树的(* ,G)表项执行RPF检查(组播数据的入口与(*,229.1.2.3)上游接口判断是否一致)。华为这么设计实现的优点是可以在发生SPT剪枝或建树时,减少不必要的建表项延迟。以R4为例,R4 处在RPT树上。虽有(S,G) 表项,但不影响数据包转发。
-
RP在知道源后开始SPT切换,向组播源发送( 10.1.1.100, 229.1.2.3) Join 报文,Join报文逐跳转发到组播源。Join 报文经过R2,在R2上创建( 10.1.1.100, 229.1.2.3)表项后,继续经S1/0/0转发给上游路由器R1。R1从R2收到(10.1.1.100, 229.1.2.3) Join报文,在(10.1.100, 229.1.2.3)表项下添加下游接口S1/0/0,此时R1下游接口包括S1/0/0和Register Tunnel接口。当R1转发组播数据时,同时向S1/0/0 接口和逻辑隧道接口转发数据。
-
RP会收到两份同样的数据报文,一份从S1/0/0接口组播流入,一份是通过单播的注册报文,此时RP开始单播回送注册一停止报文给DR,通知DR不要继续发送封装的组播数据报文,DR收到后会抑制发送注册报文。如下图所示。
注意点:
• 注册一停止报文是对DR上(10.1.1.100, 229.1.2.3) 源和组的抑制,其他源和组若没有收到注册一-停止报文,则不抑制。
• 抑制并不是永远抑制,在60s后,DR会重新开始注册报文的发送。如果没有收到停止报文,则注册报文一直发送。
场景2:源活跃,但尚无接收者加入组( 共享树尚未建立)
当RP收到注册报文时,由于RP没有下游接收者,所以没有(*,G) 表项,RP没有必要继续接收注册报文,RP 必须向DR发送注册一终止报文,通知DR停止发送注册报文。收到注册报文的RP仍会创建( 1.1.1.100, 229.1.2.3)表项,但其下游接口为NULL, 会立即回送注册一终止报文通知DR。DR收到注册一终 止报文后,抑制组播数据继续发送。
注册过程:
- 源发送组播数据。
- R1收到组播数据后,开始产生单播注册报文,封装组播数据,并发给RP。
- RP收到后,由于RP上没有对应的组播组成员(没有(* ,G)表项),所以RP回送注册停止报文给DR,即R1,通知DR不要通告注册报文。
注意点:
• 头一跳组播路由器不会因为收到Register-stop 而终止Register报文的发送,抑制计时器超时(60s) 后重复上述的过程。
• 如果在组播数据抑制期间,RP收到下游发生过来的(*,G) Join, RP会立即产生(S,G)Join向Source转发,建好SPT树后,组播数据溯树而下流给接收者。
注册抑制计时器和空注册报文:
头一跳路由器DR收到注册一停止报文后,注册报文抑制并触发注册抑制计时器(Registr-Supression- Timer)开始计时,抑制计时器时长60s,在此期间抑制发送注册报文,超时后头- -跳 DR重新开始发送注册报文。为降低RP系统开销,DR在每次抑制计时器到期之前5s,向RP发送Probe报文,又叫空注册报文。空注册报文是Null-Register置位的注册报文,报文中仅包含组播源和组播组的信息,不含组播数据,其作用是充当Probe,用以向RP通告组播源仍处于活跃状态。同时,也提醒RP需要发送注册一停止报文,否则抑制计时器超时后RP会收到包含数据的注册报文。
如果RP不希望收到包含组播数据的注册报文,收到空注册报文或注册报文(含数据)后应立即回应注册一终止报文。如果RP希望收到注册报文中的组播数据,则收到空注;册报文或注册报文(含数据)后,并不回应注册一终止报文。默认情况下,Probe时间间隔是在抑制计时器到期之前的5s。
阶段三:SPT切换
概述:
在PIM-SM网络中,一个组播组只对应一个RP,只构建一棵RPT。在未进行SPT切换的情况下,所有发往该组的组播报文都必须先封装在注册报文中发往RP,RP解封装后,再沿RPT分发。RP是所有组播报文必经的中转站,当组播报文速率逐渐增大时,对RP形成巨大的负担。为了解决此问题,PIM-SM允许RP或组成员端DR通过触发SPT切换来减轻RP的负担,并且能够减少次优路径。
切换条件:当信息吞吐率超过预定的值时,PIM-SM就会从共享树切换到组播源路径树,华为设备默认是0,表示连接接收者的路由器在探测到组播源之后(即接收到第一个数据报文),便立即加入最短路径树(源树),即从RPT向SPT切换,使用最优的路径。
组成员端DR周期性检测组播报文的转发速率,一旦发现(S,G)报文的转发速率超过阈值,则触发SPT切换:
- 组成员端DR逐跳向源端DR逐跳发送Join报文并创建(S,G)表项,建立源端DR到组成员DR的SPT。
- SPT建立后,组成员端DR会沿着RPT逐跳向RP发送剪枝报文,删除(S,G)表项中相应的下游接口。剪枝结束后,RP不再沿RPT转发组播报文到组成员端。
- 如果SPT不经过RP,RP会继续向源端DR逐跳发送剪枝报文,删除(S,G)表项中相应的下游接口。剪枝结束后,源端DR不再沿“源端DR-RP”的SPT转发组播报文到RP。
以上图所示:现在已经生成了一棵RPT,到达组播源的路径为R3->R2->R1,但是最优路径是R3->R1,所以当R3接收到第一流量的时候,立刻产生(S*G)条目,知道了源,查看单播路由表,发现了更优的路由,直接通过路由的出接口作为SPT的上游接口,向上发送join报文,直接通过最优路径加入组播,当然原来的路径就不管用了,所以按照源路径向上发送剪枝报文,使R2的下游接口抑制,又因为SPT树的路径没有经过RP,所以R2继续向上发送剪枝报文,将RPT树完全去掉。这里我们也可以看到,如果需要流量的时候自己是可以向RP去请求加入对应组的,所以自己不需要保存对应的条目了,所以不需要刷新报文和响应的剪枝定时器的存在了,一次剪枝,除了下次join消息想要加入,否则一直不会有流量下放。
具体场景:
- 上图中,R6作为最后一跳DR,对收到的组播数据报文速率进行周期性检测,若检测到R6上当前组播数据报文速率超过pim spt- threshold设定的阈值,R6立即开始SPT切换。默认情况下为spt-switch-threshold 0 kbits即SPT切换阀值为0,所以DR收到第一份组播数据报文后即超出阀值。R6开始向组播源建SPT树,组播表中已存在(10.1.1.100,229.1.2.3) 表项,则刷新表项,并继续向组播源转发(S,G) Join 报文。以下是R6上开始建 SPT 树的组播表:
- R5收到源自R6的(10.1.1.100, 229.1.2.3) Join后,R5上已存在(10.1.1.100,229.1.2.3)表项,根据单播路由表执行RPF检查确定到组播源“最近”路径,计算后知RPF接口是s1/0/0,继续向R7转发(10.1.1.100, 229.1.2.3) Join 报文。
从图中可看出,R5到组播源S和到RP的上游接口不一致, 但从组播转发表中可看出(S,G) 表项并没有立即把RPF上游接口调整为S1/0/0, 仍保持原上游接口S1/0/1,且置SWT位(代表SPT切换中),R5 继续向R7转发(S,G) Join。只要没有从(S,G) 树上收到组播数据,(S,G) 条目即使出现在组播转发表中,组播数据报文并不使用它做转发。(S,G) 条目仅当SPT置位后才有效。
规则a: 当SPT树和RPT树在当前路由器上同时存在时,若SPT树(S,G) 条目置有SPT标志,则组播数据报文使用SPT条目转发,若无SPT标志位,则组播数据报文使用RPT (*,G) 条目转发。
-
R7收到(10.1.1.100, 229.1.2.3) Join后,先创建组播条目,添加下游接口并转发给R1。当(10.1.1.100, 229.1.2.3) Join到达头一跳路由器R1后,R1上已存在(10.1.1.100,229.1.2.3)表项,在下游接口列表添加S1/0/1接口。目前,下游接口列表中有S1/0/0、S1/0/1及注册接口。
-
在场景中,R1上(10.1.1.100, 229.1.2.3)表项目前有两个物理下游接口S1/0/1和S1/0/0。R1 收到组播数据报文后分别从这两个接口转发出去,一份经R2、R3、 R4、R5、R6转发给接收者,一份经R7、R5、 R6转发给接收者。
-
在图中,R5既处于RPT树上,又处于SPT树上,(* ,229.1.2.3)和(101.1.100, 229.1.2.3)表项共存,当组播数据没有经S1/0/0接口进来时,R5上(10.1.100,229.1.2.3)表项置SWT、ACT 位,上游接口指向R4。当组播数据从新建的SPT树流下来时,数据包IP头匹配到R5上的(S,G) 表项,R5 去掉SWT位,把上游接口修改为指向R7,并置SPT位,向下转发组播数据。
此时,组播数据依然从共享树上R4流给R5,当R5收到组播数据报文时,R5上对组播数据根据( 10.1.1.100, 229.1.2.3)表项执行RPF检查。
• 如果源IP地址是10.1.1.100, 目标组播组IP地址是229.1.2.3 的报文从S1/0/1接口流进来,由于精确匹配的(10.1.1.100, 229.1.2.3)条目(已置SPT位)存在,上游接口和入口不一致,RPF 检查失败,报文被丢弃。
• 如果源IP地址是10.1.1.100, 目标组播组IP地址是229.1.2.3 的报文从S1/0/0接口流进来,由于精确匹配的(10.1.1.100, 229.1.2.3) 条目存在,入接口等于RPF接口,RPF 检查通过报文根据(10.1.1.100, 229.1.2.3) 表项向下游接口转发。
• 如果源IP地址是20.1.1.X,目标组播组IP地址是229.1.2.3的报文从S1/0/1接口流进来,由于没有对应的(20.1.1.X, 229.1.2.3) 精确组播条目,仅按对应的( * , 229.1.2.3)转发。只要报文入接口匹配( * ,G) 组播条目的RPF接口,报文被继续转发给“下游接口”。
规则b: 路由器对匹配(* ,G)条目的组播数据报文只验证数据入口是否与(* ,G)条目的RPF接口一致,不一致则报文丢弃。
- R5收到两份组播数据报文,S1/0/1接口收到的R4转发的组播数据报文会被丢掉,但持续的不必要的组播报文流到R5并丢掉,会增加系统开销。所以,R5 在( 10.1.1.100,229.1.2.3)表项SPT置位后,立即向RP方向发送置R (代表RPT)位的(10.1.1.100,229.1.2.3) Prune 报文。收到(10.1.1.100, 229.1.2.3) Prune 报文的R4路由器,将已存在的组播(10.1.1.100, 229.1.2.3) 条目置RPT位(代表该(S,G)条目指向RP)。同时从(10.1.1.100, 229.1.2.3)下游接口列表中,剪除收到(10.1.1.100, 229.1.2.3) Prune 报文的接口。组播报文不再沿RPT树流给R5。
• 如果R4上(10.1.1.100, 229.1.2.3) 表项下游接口列表不为空的话,则R4不会继续向RP转发(10.1.1.100, 229.1.2.3) RPT 置位的Prune报文。
• 如果R4上(10.1.1.100, 229.1.2.3)表项下游接口列表变为空,R4 会继续向RP发送置RPT位的(10.1.1.100, 229.1.2.3) Prune,并在上游设备上生成置RPT位的( 10.1.1.100,229.1.2.3) 组播表项,并剪除收到Prune报文的接口。
RP发现:
在PIM-SM组播网络里,担当共享树树根的节点称为RP (Rendezvous Point) 。它的位置建议放在网络的核心,在组播数据转发过程中,它起到的是“汇聚”的作用,汇聚组播接收者的加入/剪枝请求和组播源的组播数据。当某个网段的DR路由器通过IGMP协议了解该网段上有组播接收者时,就会向RP发送一个( * ,G) 的加入报文,用( * ,G)Join表示,表明本地需要接收来自任何组播源的、发往组播组G的组播数据。
在PIM SM中,每一个 PIM组播组都需要一个 RP地址,这个地址用来当作组播组相应的组播分发树的树根,用来连接SPT树和RPT树。在网络上的任何一台PIM SM路由器都需要知道组播组所需要的RP地址。
网络上每台PIM路由器内均有一张表RP-Info,记录组播组地址和RP地址的对应关系,任何组播路由器都会根据表选择出组播组所对应的唯一的RP。当组播源活跃时,向已知的RP发起注册。当接收者出现时,向RP发送建树请求。组播数据经RP在SPT和
RPT间转发,PIMSM离不开RP,如果不知道RP的位置,PIMSM路由器将不能正常工作。RP因其作用而具备如下特点:
RP是PIM SM的核心、瓶颈,且易有单点故障:
- 路由器间通告RP会使网络增加负荷,配置维护的复杂性相应增加;
- RP是接收者所加入的RPT树的树根,是源所建起的SPT树的叶子路由器;
- RP未必处于源和接收者路由器之间的最优路径上,所以经RPT树路径未必是最优路径。
- 使组播域中每台路由器都知道RP的信息,按RP部署维护的复杂性和方式,可分为静态RP和动态RP部署。
• 静态RP:在PIM域中的所有PIM路由器上逐一进行配置,静态指定RP。static-rp rp-address 指定静态RP的IP地址。坏处是所有路由器都需要配置,配置量比较大,并且没有备份功能,当RP出问题以后就无法正常转发流量了,所以当静态和动态RP同时存在的时候,优选动态RP。
• 动态RP:在PIM域内选择几台PIM路由器,配置成为C-RP(Candidate-RP),最后从C-RP中竞选产生RP。 使用动态RP,必须同时配置C-BSR(Candidate-BootStrap Router)。由C-BSR竞选产生BSR。
具体内容在RP选举笔记中分析。
资料整理来源:《HCIE路由交换学习指南》、HCIE培训资料