验证理论:
PIM协议报文直接采用IP封装,目的地址224.0.0.13,IP协议号103
PIM上下游接口:
入接口:必须为RPF校验通过接口,连接RPF邻居。
(S,G)参考组播源确定
(*,G)参考RP确定
下游接口生成方式:接收到(*,G)加组报告;接收(S,G)加组报告;接收IGMP加组报告
下游接口移除方式:接收到PIM Prune信息;接收到IGMP Leave信息;接收SPT切换产生的(S,G)修剪
PIM-SM数据包类型:
PIM-SM工作机制:
1.将组成员的位置事先告知某台组播路由器(Rendezvous Point,RP),形成RPT(RPT是一颗以RP为根,以存在组成员关系的PIM路由器为叶子的组播分发树。当网络中出现组成员(形成IGMP表项)时,组成员端DR向RP发送Join报文,在通向RP的路径上逐跳创建(*,G)表项,生成一颗以RP为根的RPT).
2.组播源在发送组播数据时,组播网络将组播数据发送至RP(组播源到RP,维护(S,G)表项,即源树),然后由RP再将组播数据转发给组成员。
3.对于部分次优的组播转发路径,PIM(ASM)能自动优化为最优路径(SRT,以组播源为根,组播组成员为叶子的组播分发树)
汇聚点RP(Rendezvous Point)为网络中一台重要的PIM路由器,用于处理源端DR注册信息及组成员加入请求,网络中的所有PIM路由器都必须知道RP的地址,类似于一个供求信息的汇聚中心
目前可以通过以下方式配置RP:
静态RP:在网络中的所有PIM路由器上配置相同的RP地址,静态指定RP的位置
动态RP:通过选举机制在多个C-RP(Candidate-RP,候选RP)之间选举出RP
实验拓扑
初始配置
全网ISIS垫底打通,所有路由器开启组播路由功能,互联接口设置为pim sm
所有路由器包括AR3都静态指定AR3为RP,在AR3的环回口上使能PIM SM 来处理组播流量,AR5上连接PC2的接口使能IGMPv2
[AR1-pim]static-rp 150.1.3.3
[AR2-pim]static-rp 150.1.3.3
[AR3-LoopBack0]pim sm
[AR3-pim]static-rp 150.1.3.3
[AR4-pim]static-rp 150.1.3.3
[AR5-pim]static-rp 150.1.3.3
[AR5-GigabitEthernet0/0/0]igmp en
配置注意事项:
1.RP配置所有路由器需要一致
2.RP必须路由可达
3.RP接口必须使能PIM-SM
实验步骤
1.场景1:接受者先上线,组播源后上线
第一步:RPT构建过程
PC1加组,并抓包,可以看到AR5作为最后一跳路由器通过IGMP得到了(*,G)表项,朝着RP根据RPF计算的出接口发送Join信息给到了AR4,此时AR5上(*,G)表项下游接口就是连接终端的接口,上游接口就是去往RP的RPF接口
AR4学习到了(*,G)表项之后也朝着RP根据RPF计算的出接口发送Join信息给到了AR3,此时AR4上(*,G)表项下游接口就是连接AR5的接口,上游接口就是去往RP的RPF接口
AR3收到Join信息之后学习到了(*,G)表项,其中下游接口就是连接AR4的接口,上游接口为空。Join信息到达RP后结束,不会再继续向源的方向转发
第二步:源到RP建立SPT
1.注册
首先组播源发送组播流量给到了AR1(不响应AR1的hello包,直接发送udp流量)
在此之前AR1,2上都没有组播路由表,AR3也没有上游接口。组播流量到达AR1之后不能像DM一样泛洪,又没有组播路由表,所以AR1将组播包封装成单播包从AR1发到AR3(底层ISIS是全通的),其中单播源地址是AR1连接组播源的接口IP地址10.1.1.2,目的地址是指定的RP的地址150.1.3.3
此时收到单播包的AR3解封装之后可以得到S,加上之前通过RPT得到的G和下游接口,此时AR3只缺上游接口。但是因为AR3知道组播源了,且组播源是可达的,于是AR3朝着组播源根据RPF计算出来的出接口(根据RPF可以计算出上游接口)发送(S,G)的Join信息给AR2
同时AR3解封装时得到了G,作为RP再依据之前的(*,G)表项将组播数据转发给组成员,这样通过组播数据,RPT上的路由器也可以获得(S,G)表项(注意:1.单播包没有走过RPT,2.RP收到第一个单播包之后解封装就直接传递给了RPT)
AR2收到Join信息之后即可获得下游接口,(S,G)信息,于是也朝着组播源根据RPF计算出来的出接口发送(S,G)的Join信息给到AR1
AR1收到(S,G),此时从第一跳路由器到最后一跳路由器,所有的路由器都有了(S,G)表项此时没有必要再封装在单播报文中转发组播数据,于是再发送的除了最开始用于注册的组播报文(不一定是1个,有的时候是多个)之外的其他报文都仍然以组播的形式发送。RP收到基于(S,G)条目转发的组播报文之后RP响应发送注册停止信息,用于停止第一跳单播传输组播。第一跳路由器接收到注册停止后,即停止以单播方式发送组播到RP(但是接收者先加入的情况下,抓不到停止包。将接收者离组之后重新播放,虽然看不到用户UDP组播报文了,但是可以看到RP单播回复AR1的注册停止报文)
注意:1.RP上的S,G表项没有下游接口,是通过查(S,G)和(*,G)表项进行转发的
2.AR2上的下游接口0/0/2不是连接RP的接口,是因为被SM可以自动优化最优路径,这个后面再说明
2.场景2:组播源先上线,接受者后上线
第一步:组播源到RP的SPT建立
组播源发送组播流量,第一跳封装组播为单播转发到RP(注册到RP),RP丢弃组播流量,发送注册停止信息到第一跳路由器(RP会保留(S,G)条目老化时间3min).因为根本就没有接收者
第一跳路由器接收到注册停止信息后停止发送组播注册(仅维持1Min,1min超时,第一跳路由重新发送注册到RP,以维持(S,G)条目)
如果业务流不断,因为register/register stop每隔1分钟刷新一次,RP保持(S,G)表项要3分钟才刷新,所以(S,G)表项就一直都在
若后续新加入接收者(3min内),RP基于(S,G)条目通告PIM join信息到第一跳路由器,因为(RP的(S,G)表项没有老化,又有了下游接口直接沿途发送join即可),在此过程中源到RP的SPT建立,RPT建立过程同接收者先上线
3.PIM DR
在源端网络或者成员端网络中,有可能有多台组播路由器转发组播流量,从而造成重复组播报文的问题。
PIM DR(Designated Router)是源端网络或者成员端网络的唯一组播转发者,由于不存在别的组播转发路由器就避免了重复组播报文的问题。
PIM-SM中各路由器通过比较Hello消息上携带的优先级和IP地址,为多路访问网络选举指定路由器DR:
接口DR优先级越高越优先,默认为1
接口DR优先级相同,接口IP地址越大越优先
当DR出现故障后,邻居路由器之间会重新选举DR
[AR5-GigabitEthernet0/0/0]pim hello-option dr-priority 7
[AR5]dis pim int g 0/0/0 verbose
VPN-Instance: public net
Interface: GigabitEthernet0/0/0, 10.1.5.2
PIM version: 2
PIM mode: Sparse
PIM state: up
PIM DR: 10.1.5.2 (local)
PIM DR Priority (configured): 7
4.RPT次优路径问题
在PIM-SM网络中,一个组播组只对应一个RP。
源到RP的SPT是否可能存在次优问题?
不可能,因为有组播源地址了,注册是依据单播路由进行转发的,单播路由一定是最优路径
成员到RP的RPT为什么会有次优路径问题?
因为RPT路径上的路由器注册时仅有(*,G)表项,建立RPT时是朝着RP去建立的,如果RP不在组播成员到组播源的最优路径上,RPT就会出现次优路径
解决方法:
默认情况下成员端DR只要能够了解到组播源不管流量大小直接发送(S,G)的join,也可以手动设置流量达到多少才发送或者不发送
[AR5-pim]spt-switch-threshold ?
INTEGER<1-4194304> Value of data speed in kbps
infinity Never switch
先看一下不切的场景:
在成员端DR-AR5上配置有了(S,G)表项后不切换最优路径
[AR5-pim]spt-switch-threshold infinity
此时AR4的上游接口仍然是连接AR3的0/0/0,也就是说当前是次优路径
此时在AR5上抓包,只能抓到AR5周期向AR4发送向RP150.1.3.3的(*,G)的Join信息
然后再看一下切的场景
删除掉AR5上的配置
[AR5-pim]undo spt-switch-threshold infinity
组播源向RP发送register的单播包被RP收到之后,RP会解封装数据包,按照组播路由表的(*,G)表项发给接收者,此时业务流从RP到了终端,中间所有的路由器上都有了(S,G)的表项
于是成员端DR(AR5)主动反向朝着S的方向发送(S,G)的join(当然之前(*,G)的join也还是会周期的发送)
上游AR4收到之后仍然朝着S的方向从RPF计算的出接口0/0/2发送(S,G)的join(只有(S,G)的join),AR2收到之后增加一个下游接口
至此,AR3到AR4之间的RPT是不需要的。AR4会主动向RP也就是AR3发送(S,G)的修剪(原有的(*,G)的join也还是会周期发送),AR3收到之后会删除0/0/0的下游接口,AR4本身上游接口为0/0/0的(S,G)表项也会被删除。
因为AR3会每隔1Min收到AR1的注册信息,而自身的(S,G)表项要3min才能删除,所以AR3上的(S,G)表项会一直存在。但是因为AR3已经没有了下游接口,所以向AR2发送(S.G)的修剪信息,AR2收到之后会把下游接口0/0/1的(S,G)减除
下图中第一个join(包号289)是用于建立SPT的
思考:路径优化完成之后实际转发没有到达RP,那是否是说明网络中可以没有RP呢?
回答:如果组播流24h不间断是可以的,但是如果组播流量间断了,要重新建立组播路由表,还是需要RP
5.维护组播路由分发树
当组播分发树(SPT或RPT)稳定后,成员端会周期性发送Join/Prune报文,用于维护组播分发树
成员端周期(60S)朝着S发送join,收到的路由器也再朝着S发送(S,G)的join,直到抵达第一跳路由器,一次join结束
如果RP不再最优路径上,连接RP的路由器还会周期(60s)向RP发送Prune消息抑制接口转发
加入:
AR5->AR4
AR2->AR1
AR1连接组播源的接口:
剪枝:
AR4->RP(AR3)
如果组播在一段时间后(默认210s)没有流量则SPT树会消失,成员端DR恢复到RP的RPT树
6.总结组播修剪触发条件
- 所有组成员离组
- 所有出接口均为NULL
- 共享树到源树切换(RPT自动优化次优路径时AR4上从RPT切换到SPT,主动向RP发送修剪消息)
7.SSM
SSM模型针对特定源和组的绑定数据流提供服务,接收者主机在加入组播组时,可以指定只接收哪些源的数据或者指定拒绝接收来自哪些源的数据。加入组播组以后,主机只会收到指定源发送到该组的数据
SSM模型对组地址不再要求全网唯一,只需要每个组播源保持唯一。这里的“唯一”指的是同一个源上不同的组播应用必须使用不同的SSM地址来区分。不同的源之间可以使用相同的组地址,因为SSM模型中针对每一个(源,组)信息都会生成表项。这样一方面节省了组播组地址,另一方面也不会造成网络拥塞
为指定组播源,一般SSM都是配合可以指定源的IGMPV3使用,最后一跳路由器从接收者哪里可以获取到(S,G)表项和下游接口,通过RPF校验获取上游接口,直接朝着源发送(S,G)的join建立源树
PIM-SM(SSM)无需维护RP,无需构建RPT,无需注册组播源,可以直接在组播源与组成员之间建立SPT,可以消除网络中的所有的(*,G)表项,减少路由器负担
配置:
首先删除前面的RP配置,以及AR3的环回口上的PIM使能
然后在最后一跳路由器上配置IGMPv3,
[AR5-GigabitEthernet0/0/0]igmp version 3
注意:指定源组播的组播组地址范围是232.0.0.0-232.255.255.255
此时通过抓包,可以发现没有了SM里面复杂的注册过程,直接AR5周期性(60s)向AR4向AR2向AR1沿途发送了(S,G)的join报文,组播路由表建立。因为AR3不在任何一个路由器的RPF接口上,所以AR3的pim路由表为空,此时网络中也没有(*,G)表项
如果接收者不支持IGMPV3,也可以在最后一跳路由器上通过手动配置组播源地址和组播组地址实现SSM
在AR5上配置:
acl number 2000
rule 5 permit source 232.1.1.1 0
interface GigabitEthernet0/0/0
ip address 10.1.5.2 255.255.255.0
isis enable 1
pim sm
igmp enable
igmp version 3 //成员IGMPv2,最后一跳路由器仍然IGMPv3即可(v3兼容v2)
igmp ssm-mapping enable
#
igmp
ssm-mapping 232.1.1.1 255.255.255.255 10.1.1.1
#
pim
ssm-policy 2000