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