1. 程式人生 > 實用技巧 >multicast-3組播的防環原則-RPF

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