目錄
PIM SM路由協議基礎:
PIM SM基本原理:
- PIM-SM使用拉的模式轉發組播報文,類似於按需使用的方法,一般應用於組播組成員多,相對稀疏,規模較大的網絡,
PIM SM的工作機制:
RP的發現:
-
RP-匯聚點
-
在網絡中維護一台RP,所有的pim路由器都知道RP的位置,RP負責接受組播數據,並向組播接受者進行轉發,RP跟組播源構建一顆SPT樹,RP跟組播接受者構建一顆RPT樹。
RPT的構建:
- 當網絡中出現組成員,用戶通過IGMP加入某組播組,然后由最后一跳路由器(成員端DR)向RP發送(* G)表項的join報文,並逐跳在pim路由器上建立(* G)表項。
- 成員端DR發送的(* G)表項的join報文中,其中join字段中IP地址會置位,其中,分為SWR置位
- S置位:所有的join/prune報文均為置該位
- W置位:(* G)表項中的join/prune報文置該位
- R置為:向RP發送的所有join/prune報文均會置位
- 發往RP的(* G)join/prune報文會置SWR位
- 發往組播源的(S G)join/prune報文會S位
- 發往組播源的(S G)join/prune報文會置SR位
- 成員端DR會每隔60S向上游pim路由器發送join報文,收到join報文后,重置接口計時器(210s)接口計時器是根據join/prune報文中的heldtime時間來設定的,超時后就會將此接口從下游接口中移除
- 只要接受者存在,成員端DR會每隔60S向上游pim路由器發送join報文,用來刷新(* G)條目。維護RPT樹。
組播源注冊:
- 當網絡中出現活躍的組播源,源端DR會將此組播數據封裝在register報文中,以單播的形式發送給RP,
SPT的構建:
- RP收到此register報文后,就得知了組播源的地址,然后向組播源發送(S G)表項的join報文,然后在沿途的pim路由器上創建相應的(S G)表項,構建一顆SPT樹,之后的組播數據就根據(S G)進行轉發,
- RP這時可以通過兩個方向收到組播數據,一個是從SPT,另一個是根據單播注冊隧道,這時就會由RP向源端DR發送register stop 報文,注冊停止報文,DR收到之后,就會啟動一個注冊抑制計時器,60s,超時后,繼續發送注冊報文。
- 為了降低RP的系統開銷,在注冊抑制計時器超時前5s,會像RP發送probe(空注冊報文)報文中僅含組播源和組播組的信息,不含組播數據。
- 空注冊報文的作用:向RP通告組播源處於活躍,通知RP發送注冊停止報文刷新注冊抑制計時器時間
- SPT樹構建好之后,RP就可以收到組播的數據了,這時,會沿着RPT樹向下發送組播數據,這時,會觸發RPT樹上的每一台路由器都創建一個跟(* G)一樣的(S G)表項,該表項不置SPT位,只置ACT位,代表只有數據通過該表項,數據因(S G)表項無效,所以使用(* G)表項來進行RPF校驗。
- 當SPT樹和RPT樹在當前路由器上同時存在,若SPT樹的(S G)表項置SPT位,則組播數據使用該表項進行轉發。若無SPT置位,則使用(* G)表項轉發。只要沒有從(S G)表項中接收到組播數據,SPT永不置位。
BSR-自舉協議:
RP的發現:
-
靜態RP:
- 在每一台路由器上進行靜態部署
-
動態RP/C-RP
- 將多個pim路由器部署為C-RP,來動態選出RP,同時還需要配置C-BSR,選舉出BSR,來收集所有C-RP的通告信息。
-
C-BSR的競選:
- 開始,所有的C-BSR都認為自己的BSR,以組播地址224.0.0.13向全網發送bootstarp報文,TTL值為1,周期性的60s發送一次,用來刷新PIM路由器緩存的BSR的信息,重置130計時器。
- bootstarp攜帶C-BSR優先級(默認是0),地址,每一台Pim路由器收到后,通過比較選出BSR
- 先比較優先級再比較地址。都比大。
-
C-RP的競選:
- 所有的C-RP都會以單播的形式向BSR發送Advertisement報文,60s一次。超時時間為150s
- Advertisement報文攜帶C-RP的服務的組地址范圍,C-RP的地址,優先級。
- BSR收到之后,會將所有C-RP發送過來的報文進行一個匯總,匯總成AS-set,並封裝在boostarp報文中,進行全網發送。
- pim路由器收到之后,使用相同的規則進行計算和比較,選出一個RP.
- C-RP服務的組地址范圍,越精確越優,(掩碼長者優先)
- 比較C-RP的優先級,比小,(默認為0)
- 將組地址、C-RP的地址、BSR的hash掩碼長度(默認為30),進行hash運算,進行比較,比較值最大的。
- 比較C-RP的地址。比大
- 比較出RP后,將組播組和RP的對應關系保存下來,指導后續的建樹過程。
-
RFP校驗:
- BSR發送bootstarp報文,要進行RPF檢驗。
- 接受組播數據的入接口是到達組播源的出接口
- 接受的組播數據源地址是到達組播源的下一跳。
- 滿足兩個要求后,才可發送bootstarp報文。
- 因為bootstarp報文的ttl值為1,所以路由器轉發時,源地址逐跳封裝。
- BSR發送bootstarp報文,要進行RPF檢驗。
RPT/SPT樹的切換:
-
第一次SPT的切換:從單播注冊隧道到SPT樹的切換
-
第二次SPT的切換:從RPT到SPT的切換。
-
STP切換機制:成員端DR周期性的檢測組播報文的轉發速率,一旦發現(S G)報文的轉發速率超過閾值(閾值默認為0),則觸發SPT切換。
- 組成員端DR逐跳向源端DR逐跳發送(S G)join報文,並沿途創建(S G)表項,建立源端DR到成員端DR的SPT樹
- 成員端DR與緣端DR的SPT樹建立后,成員端DR會從兩個地方同時收到組播數據,這時進行RPF校驗,如果(S G)表項的RPF接口和RPF鄰居與(* G)表項的RPF接口和PRF鄰居不一致,則成員端DR會沿着RPT樹逐跳向RP發送(S , G)剪枝報文,其中RPT置位,代表這是發送給RP的,收到(S , G)剪枝報文的PIM路由器會刪除(S G)表項中相應的下游接口,之后再不必向下轉發數據。
- 如果SPT不經過RP,那么RP會繼續逐跳向源端DR發送(S , G)剪枝報文,刪除(S G)表項中相應的下游接口,之后再不必向下轉發數據。
缺省情況下,設備一般沒有配置閾值,所以當成員端DR知道了組播源的地址時,就會觸發SPT的切換。
注冊消息:
- 組播數據從上游接口流入,然后轉發進注冊隧道,隧道使用PIM協議封裝組播報文,其中隧道的源IP是源端DR的IP地址,目的IP是RP的IP地址。
- PIM register作為隧道協議直接封裝組播數據並發送給RP,注冊報文中,有兩個flag位,B位和N位。其中B位置位的話,代表組播源和源端DR不直連,N位置位的話,代表是空的注冊報文。
斷言機制:
- 當從其下游接口發送一份組播數據,又從其下游接口收到該數據時,啟動斷言機制:
- 剛開始設備都認為自己的winner,並發送assert報文,里面攜帶了到達組播源的協議優先級和開銷,通過對比來選出winner,先比較到達RP的協議優先級和開銷,比小優先,如若相等就比較數據的源地址和自己接口的ip地址,比大優先,
- 優勝者為winner,失敗者為loser,winner只能有一個,loser可以有多個。
- 成為loser的設備后,會自動剪除自己的下游接口,當下游接口列表為空時,發起剪枝,winner也會收到這個剪枝報文,同時開啟斷言計時器180s。在超時之前,接口一直處於剪枝狀態。
- winner會周期性的向下游接口發送狀態刷新報文,用來給loser刷新斷言計時器。
- winner從下游接口收到剪枝報文,啟動剪枝延時計時器,等待join報文的到來。否決剪枝行為。
- 關於斷言場景下網絡拓撲變化時,組播路徑的切換:
- winner的上游接口中斷:會從下游接口發送最差的assert報文來通知其他的loser。
- 最差的assert報文:協議優先級無限大,開銷無限大。
- winner的下游接口中斷:此時無法從下游接口發送assert cancel報文,那么loser路由器只有等待與winner鄰居失效后(默認105s),才會知道winner掛掉。