multicast-3组播的防环原则-RPF - 梅利333

时间:2024-04-16 11:19:58

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成长之路  --- 梅利