multicast-3组播的防环原则-RPF
组播的防环原则
1 单播路由与组播路由的主要区别
单播路由关必数据包要去哪里 destination
组播路由关心数据包从哪里来 source
(第一个动作是先校验,查看源,然后再查看目的地址,再进行转发)
2 单播路由依靠路由协议对目的地址进行检测来防止环路(ospf eigrp bgp……)
组播路由无法对目的地址进行检测,因为组成员可能在任何一个节点,因此组播路由需要依靠对源地址的检测来防止发生环路
对源地址的检测方法称之为RPF reverse path forwarding 逆向路径检测
RPF针对的是所有的组播路由协议,所以RPF是组播数据转发的依赖
换句话说,只要是组播数据转发,肯定是离不开RPF的,
RPF默认是开启的,每5S进行一次校验
什么是RPF?
当一个路由器转发一个组播数据时,检测,去往源的出口和收到这个包的接口一否一致,如果一致则转发,如果不一致,则丢弃
提取这个包的SIP,然后对比本地的单播路由表中的出接口
其实就是做了一个反向的查询
这一点有些不好理解
看张图来理解一下
最右侧的那台设备也会执行这样的操作,
也可以理解为所谓的源,是和IGP协议有关的,当出现两条或多条线路时,参考IGP的最优路径来计算自己的源,然后再进行对比,进行RPF校验,从而避免重复报文
看到这里不禁会想到一个问题,multicast 里有没有负载呢?
在组播中想要实现负载,就是要避免RPF校验的过程才OK,如果经过了RPF,肯定不会有负载的,这个后面再细说
什么是RPF接口?什么又是RPF邻居?
接口,接近于源的接口,就是RPF接口,对于一台路由器来说,最接近源的接口,就是RPF接口,这个看单播路由表的条目出口就很明白了
RPF邻居,去往这个源的路由器下一跳,
再看张图
如图所示,RE上,谁是RPF接口? F0/0啊~因为它最接近源
那谁是我的RPF邻居呢?
RC啊~,因为去往224.1.1.1的下一跳就是RC
要想成为RPF接口所必须的条件
1 离组播源最近的,并且运行了组播路由协议的接口
2 针对每一个组播源而言,RPF接口有且只有一个
3 针对每一个组播源而言,RPF邻居有且只有一个
4 组播路由器只能转发来自RPF接口,并且由RPF邻居发过来的组播数据
P 4句话也充分证明了,组播中想要实施负载均衡是难如上天
小实例
默认情况下,会使用单播路由表来进行RPF校验
前期拓扑准备
1 所有设备运行OSPF,构建完成单播路由表,(因为默认情况下,RPF校验是通过单播路由表来完成的)
一台一台的来进行PRF校验测试,看看哪个是RPF的接口,哪个又是RPF的neighbor
PS:想要完成RPF校验,
必须在设备上开启组播功能才OK
R1(config)#ip multicast-routing
R1(config)#inter f0/1
R1(config-if)#ip pim dense-mode
但是也有可能右侧会成为组播源,怎么办呢?需要在所有的接口上开启pim dense-mode
R1#show ip rpf 192.168.1.10
RPF information for ? (192.168.1.10)
RPF interface: FastEthernet0/1 //我的RPF接口是哪个?
RPF neighbor: ? (192.168.1.10) - directly connected //谁是我的RPF邻居?
RPF route/mask: 192.168.1.0/24 //通过路由表中的该条目获得的
RPF type: unicast (connected) //通过什么方式进行的校验?单播,组播,还是MBGP?这里是单播,unicast ,并且为直连
RPF recursion count: 0
Doing distance-preferred lookups across tables
R1#
R2查看,想都不用想,肯定是f0/0接口为RPF接口
就这样,依次类推,直到R7
在一台路由器上,针对于一个组播源而言,RPF接口有且只有一个
看似平常平静的湖面下方,暗流涌动,
问题出在R4上,
这里显示的接口为F0/1,但是在单播路由表中查看时,却是负载的情况
所有的参数值都是一样的,怎么来选择呢?
这个时候,RPF有规定
当有多个接口都能成为该组播源的RPF接口时,选择IP地址最大的接口做为针对该组播源的RPF 接口
那么对比一下就知道了,34.0.0.3大还是43.0.0.3大呢?肯定是 43大了,
所以选择43网段的接口 成为了我的RPF接口,,也就是F0/1
再到R7上看一下,
我上方有两个neighbor,并且各参数值都一样,最主要的是我只有一个出口,该如何选择呢?选择两个邻居肯定是不行的,因为有规定,有且只能有一个
当有多个邻居都能成为该组播源的RPF邻居时,选择IP地址最大的邻居成为针对该组播源的RPF邻居
100.1.1.6>100.1.1.5,所以选择R6做为我的RPF neighbor
RPF校验的三种方法
1 单播路由表校验 unicast routing table
2 组播静态校验 Multicast route static
3 MBGP multicast address family
这三种无论哪一种,都不是用于构建路由表的,而只是为了完成RPF校验,
而要想完成组播数据的正常转发,就必须要完成RPF校验
三种方法同时使用时选择顺序
每一种方法被称之为模块,
1 相同的模块内通过最长匹配的方式找到最优路由,并且检测该路由指定的接口是否运行了组播路由协议
1) 如果没有运行组播路由协议,则不参与后续比较
2) 如果运行了组播路由协议,则进入下一步比较
2 比较各模块选择路由的AD值,选择最小的AD值路由做为检测RPF的路由,如果AD值班相等,则按照以下顺序进行选择
Multicast static à MBGP à unicast routing table
可见单播路由的顺序是排在最后的
3 选择出最佳路由后,进行RPF接口的选择
1) 如果该路由只有一个接口、下一跳,那么该接口做为RPF接口,下一跳做为RPF邻居
2) 如果该路由器只有一个接口,但是存在多个下一跳,(如上面我们提到的R7情况),该接口做为RPF接口,多个下一跳中地址大的那个做为RPF邻居
3) 如果该路由器有多个接品,并且有多个下一跳,那么地址最大的接口做为RPF接口,地址最大的下一跳做为RPF邻居
实际的来比较一下
这是原有的默认情况,
针对于192.168.1.10这个源,RPF接口为f0/1
Neighbor 为43.0.0.3
根据ospf 单播路由表中的192.168.1.0/24这个条目来的
可以很清楚的看到unicast的字眼
现在我们将写上一条mroute,组播静态,来看看有没有什么变化
R4(config)#ip mroute 192.168.1.0 255.255.255.0 34.0.0.3 110
Ip mroute 代表组播路由
192.168.1.0/24 这里我们和ospf的前缀写一样的,
后面加上一个不一样的next-hop,
并且写义它的AD值为110,和OSPF的一样,
看看最终RPF该如何选择?
变了,
首先是原来的类型由unicast 变成了现在的static,也没有了ospf
另外它的neighbor也变了,由原来的43.0.0.3变成了现在的34.0.0.3
还能通吗?
通是没问题的话,因为现在也没有走组播流量
但是如果我现在强制的将这个下一跳改成R5会发生什么?
发现是可以修改的,
这也和单播静态路由有着同样的特性,可以瞎配,这样也会带来一个问题
就是配置错误。
MBGP
在配置MBGP之间,要先将R3-R4之间的OSPF拿掉
换成BGP
但是我们让下面的那条线跑单播,纯的单播
然后下上面的那条线跑组播,(注意,这时和传递组播流量还没有关系,只是为了完成RPF校验用的)
跑单播,然后将OSPF和BGP进行双向重分布,实现互通,
最主要的是将两个单播的接口关闭组播的功能
R3(config-router)#inter f1/0
R3(config-if)#no ip pim dense-mode
R4(config-router)#inter f0/1
R4(config-if)#no ip pim dense-mode
关闭之后,由于我们还没有建立起MBGP,所以这里是无法进行RPF校验的,因为接口下就根本没有开启组播功能
单播的配置就不用说了,
直接说一下组播的配置吧,其实学习过mpls vpn的话,这里也没啥可说的
R3(config-if)#router bgp 100 R3(config-router)#nei 34.0.0.4 remote 200 R3(config-router)#address-family ipv4 multicast R3(config-router-af)#nei 34.0.0.4 ac R4(config-if)#router bgp 200 R4(config-router)#nei 34.0.0.3 remote 100 R4(config-router)#address-family ipv4 multicast R4(config-router-af)#nei 34.0.0.3 ac
需要进入单独的ipv4 multicast 地址簇中去激活neighbor
当然想要完成校验,还必须在组播的BGP中拿到对端的条目,
还需要进行重分布
R3(config)#router bgp 100 R3(config-router)#address-family ipv4 multicast R3(config-router-af)#redistribute ospf 1
R4(config)#router bgp 200 R4(config-router)#address-family ipv4 multicast R4(config-router-af)#redistribute ospf 1
由于之前已经将BGP 重分布到OSPF 了,这里就不用再重分布了,
经过重分布后,可以在summary中看到具体的变化
有了具体的源,那么是否就可以完成RPF校验了呢?
来看一下
有了,没问题,并且是来自于mbgp的,
这里的AD值还是遵循协议本自的AD值
IBGP=200
EBGP=20
我们使用的是EBGP关系,优于OSPF,所以肯定要优先于OSPF的RPF检测
组播的负载均衡
因为RPF的存在,所以默认是不可能实现组播的负载均衡的
如果想实现组播的负载均衡,那么必须将多接口变为单接口,例如使用GRE tunnel 将多个物理口封装在一起
--------------------------------------
CCIE成长之路 --- 梅利