HCNP Routing&Switching之組播技術-組播路由協議PIM
- 2022 年 4 月 1 日
- 筆記
- Assert斷言機制, HCNP Routing&Switching, PIM-DM工作流程, 剪枝加入過程(Prune/Join), 嫁接(Graft)機制, 狀態刷新機制, 組播技術, 組播報文擴散過程(Flooding), 組播路由協議PIM, 鄰居發現-DR選舉
前文我們了解了組播技術中組播分發樹相關話題,回顧請參考//www.cnblogs.com/qiuhom-1874/p/16019334.html;今天我們來聊一聊組播路由協議PIM相關話題;組播路由協議和我們前邊學習的單播路由協議本質上沒有什麼不同,不同的是組播路由協議主要生成描述組播數據轉發路徑,而單播路由協議是用來生成描述單播數據轉發路徑;
組播路由協議PIM
PIM(Protocol Independent Multicast,翻譯成中文就是協議無關組播);所謂協議無關是指給組播提供路由信息的可以是靜態路由、RIP、OSPF、IS-IS、BGP等任何一種單播路由協議;這裡的無關是指組播路由與是何種單播路由協議無關;只要通過單播路由能夠產生對應組播路由表項即可;之所以PIM高度依賴單播來生成組播路由表項,是因為組播路由是利用單播路由表的路由信息進行組播報文RPF檢查,從而來創建組播路由表項,轉發組播報文;
組播路由協議概述
組播路由協議PIM主要運行在組播路由器之間,負責建立和維護組播路由,建立從組播源到多個接收端的無環轉發路徑,即分發樹;並正確、高效地轉發組播數據包;
PIM的模式
提示:PIM有兩種模式, 密集模式和稀疏模式;這兩種模式分別對應組播的兩種類型的分發樹,密集模式對應源樹,稀疏模式對應共享樹;密集模式主要用戶規模不大的組播網絡環境中,而稀疏模式主要用戶大規模組播網絡環境中;對於不同模式的PIM,其工作流程各不相同,但最終的目的都是生成傳播組播數據的無環路徑;
PIM-DM工作流程
PIM-DM(pim Dense Mode ,協議無關組播-密集模式),該模式使用「推(push)」方式來傳送數據,適用於小型網絡,組播組成員相對比較密集;
PIM-DM的工作流程主要經過鄰居發現、擴散、剪枝、狀態刷新、嫁接、Assert斷言機制;
1、鄰居發現
提示:PIM路由器之間會周期性的發送hello包,用於發現鄰居、建立並維護鄰居關係,這個和單播中的ospf協議很類似,只有建立起鄰居以後,才會有後續的信息交換生成路由表項;當共享網段路由器運行的IGMP版本是V1時,此時pim會選舉DR來充當igmp里的查詢器;因為IGMPv1本身不具有查詢器選舉的功能;v2,v3IGMP自身有查詢器選舉功能,不依賴pim;pim鄰居發現過程,雙方都把hello包發往224.0.0.13這個組播地址,這個組播地址就是用於pim hello地址;即運行pim的路由器,都會監聽224.0.0.13這個地址;
鄰居發現-DR選舉
選舉DR,充當IGMPv1的查詢器,其選舉規則如下
1、對比優先級,優先級高者成為DR;
2、如果優先級一樣,則對比ip地址,ip地址大者成為DR
注意:igmp v2 查詢器選舉規則是ip地址越小越優先和v1依賴pim選舉dr充當查詢器的規則相反;
2、組播報文擴散過程(Flooding)
提示:所謂擴散是將組播報文擴散到每一個運行PIM-DM的網段,沿途每一台路由器都建立(s,g)表項;不管對應路由器下是否有接收者,對應組播數據都會先擴散過去;當然這種擴散會帶來資源的消耗(帶寬和路由器內存等),因為沿途路由器都會建立(s,g)表項;這裡需要注意只有通過RPF檢查後的接口才會創建路由表項;
3、剪枝加入過程(Prune/Join)
提示:為了減少資源的消耗,對沒有組播數據轉發到分枝進行剪枝(Prune)操作,只保留包含接收者的分支;剪枝操作就是對應沒有接收者的分枝向上游接口發送Prune消息,用來告訴上游路由器對應接口不需要發送組播數據;即對應上游路由器相關接口就不需建立(s,g)表項;如果共享網段上有路由器連接接收者,則該路由器需向上游發送join消息覆蓋其他路由器發送到prune消息;如上圖RTD發送prune消息以後,對應RTC對應接口就不會建立(s,g)表項,但是RTE和RTD是共享網段,RTD發送Prune消息,對應RTE也會收到,但是RTE下有接收者,所以RTE會發送join消息來覆蓋RTD發送到prune消息;所以對應RTC來說,它對應接口還是會建立表項;剪枝是有剪枝超時計時器,這個時間是210秒;也就是說210秒過後如果沒有人發送prune消息,對應接口又會恢復成轉發數據的狀態;
SPT的形成
提示:經過上述的擴散-剪枝過程以後,形成組播源到組播接收者之間的SPT;擴散-剪枝過程是周期進行,由定時器控制,這個定時器是180s;也就是說每180s就會擴散一次;所以上述的剪枝超時210秒正常情況下都不會超時,即對應沒有接收者的路由對應接口不會變為轉髮狀態;
4、狀態刷新機制
提示:狀態刷新主要用來降低組播報文擴散到頻率,節省網絡帶寬;狀態刷新是離組播源最近的路由器發送state refresh消息,該消息會沿SPT的路徑向每個路由器擴散,收到該消息的路由器,對應路由器上接口的擴散、剪枝定時器都會刷新,從而降低擴散-剪枝所帶來的網絡資源消耗;狀態刷新的發送周期是60秒;
5、嫁接(Graft)機制
提示:當被剪枝分支的節點上出現了組播組成員時,為了減少該節點恢復成轉髮狀態所需的時間,使用嫁接(graft)機制主動恢復其對應組播數據的轉發;當路由器需要上游發送組播報文時,向上游發送Graft消息,上游路由器收到Graft消息後恢復Graft ACK消息進行確認,對應路由器的接口就會轉變為轉髮狀態;如上圖所示,RTF上如果有新的接收者出現,首先接收者通過IGMP發送成員報告,當RTF收到成員報告以後,它會立即向其上游RTC發送Graft消息,RTC收到graft消息以後,向RTF恢復graft ACK確認,此時,RTC和RTF上對應接口就會建立表項,對應接口也會恢復成轉髮狀態,進行數據轉發;
6、Assert斷言機制
提示:斷言機制主要針對在一個網段內如果存在多台組播路由器,則相同的組播報文會被重複發送到該網段,通過斷言機制可以選定網段上唯一的組播數據轉發者;如上圖所示,RTA和RTB到達組播源是等價路由,那麼對於RTC來說,如果沒有斷言機制,它可能從RTA和RTC都收到組播數據,這樣一來RTC就會收到兩份一模一樣的數據;為了解決RTC收到重複的組播報文,此時RTA和RTB會發送Assert消息,對應A和B收到對方的Assert消息以後,根據規則,其中一方路由器會停止轉發數據;
Assert選舉網段上唯一的組播數據轉發者規則
1、比較到組播源的優先級,優先級高者勝出成為組播數據轉發者;
2、如果優先級一樣,則比較到組播源的度量值,度量值小者成為組播數據轉發者;
3、如果優先級、度量值都一樣,則比較本地接口ip地址,ip地址大者成為組播數據轉發者;
實驗:如下拓撲配置pim 密集模式
配置PC1
配置PC2
配置組播源
配置R1


sys sys R1 int g0/0/0 ip add 11.0.0.254 24 int g0/0/1 ip add 13.0.0.1 24 ospf 123 router-id 1.1.1.1 area 0 net 11.0.0.254 0.0.0.0 net 13.0.0.1 0.0.0.0 q q multicast routing-enable int g0/0/0 pim dm igmp en int g0/0/1 pim dm
View Code
提示:因為R1是靠近接收者的路由器,所以對應接口下需要開啟igmp;跑ospf是讓三個路由器的網絡互通;當然你也可以使用靜態、RIP等都可以,只要網絡互通即可;
配置R2


sys sys R2 int g0/0/0 ip add 22.0.0.254 24 int g0/0/1 ip add 23.0.0.2 24 ospf 123 router-id 2.2.2.2 area 0 net 22.0.0.254 0.0.0.0 net 23.0.0.2 0.0.0.0 q q multicast routing-enable int g0/0/0 pim dm igmp en int g0/0/1 pim dm
View Code
配置R3


sys sys R3 int g0/0/0 ip add 13.0.0.3 24 int g0/0/1 ip add 23.0.0.3 24 int g0/0/2 ip add 31.0.0.3 24 ospf 123 router-id 3.3.3.3 area 0 net 13.0.0.3 0.0.0.0 net 23.0.0.3 0.0.0.0 net 31.0.0.3 0.0.0.0 q q multicast routing-enable int g0/0/0 pim dm int g0/0/1 pim dm int g0/0/2 pim dm
View Code
驗證R1ospf鄰居和路由情況
提示:可以看到R1和R3建立起鄰居,其狀態為full;
提示:可以看到R1已經學習到R2和R3上的路由;
驗證R2ospf鄰居和路由情況
提示:可以看到R2已經和R3建立起ospf鄰居,且狀態為full;對應R2已經學習到R1和R3上宣告的路由;
驗證R3ospf鄰居和路由情況
提示:可以看到R3和R1和R2分別建立起ospf鄰居,且狀態為full;對應R3也學習到R1和R2上的路由;至此組播的基礎環境已經搭建好;
驗證:R1、R2、R3組播鄰居
提示:可以看到R1、R2分別和R3互相建立起鄰居;
啟動組播源,在R2上抓包
提示:可以看到我們啟動組播源以後,對應在R2發送了prune消息;這是因為R2上沒有接收者,所以在把組播數據擴散到全網路由器以後,沒有接收者的路由器發送prune消息,進行剪枝;
驗證:查看pim路由
提示:可以看到三個路由器通過擴散剪枝這個過程後,對應pim的路由就生成了;這三個路由器上生成的pim表項都有一個特點是自由上游口,沒有下游口,這是因為R1和R2都沒有出現接收者;
將pc2加入組播組,抓包查看對應數據包
提示:可以看到pc2加入組播組,對應靠近接收者的接口會收到接收者發送的igmp 成員報告,R2收到igmp的成員報告後,立刻向上游R3發送嫁接(graft)消息,R3收到R2的嫁接消息以後,對應恢復graft-ack進行確認;此時R2和R3的pim路由就會有下游接口;
驗證:查看R2和R3的pim路由,看看對應是否有下游接口?
提示:可以看到R2和R3的pim路由中都產生了下游接口;
把pc1加入組播組,看看R3上的路由有什麼變化?
提示:可以看到pc1加入組播組以後,對應R3路由中就多了一個下游接口;
驗證:查看R1的pim路由,看看有什麼變化?
提示:可以看到R1的路由表中對應路由也有了下游接口;同時我們也注意到也多了一條共享樹(*,g)的表項;這是因為R1下有了接收者以後,對應就會生成共享樹;
pc1離開組播組,看看R1的路由有什麼變化?
提示:可以看到PC1離開組播組以後,對應R1的路由中對應下游接口也沒有了,隨之(*,g)的路由表項也沒有了;
查看R2路由表的詳細信息
提示:pim都是基於接口的,所以查看詳細信息我們需要查看某一個接口下的詳細信息;其中我們可以看到詳細信息中列出了pim版本信息,模式,DR 的地址,這裡我們使用的是默認igmp v2的版本,所以他這裡不會充當igmp的查詢器,由igmpv2的規則自動選舉產生;除此之外還有hello包間隔時間是30秒,死亡時間是105秒,斷言assert死亡時間是180秒;剪枝加入的間隔時間是60秒,超時時間是210秒,狀態刷新時間是60秒,嫁接延遲時間是3秒;
實驗:如下拓撲圖配置pim 抓包查看assert消息
R1的配置


sys sys R1 int g0/0/0 ip add 11.0.0.1 24 int g0/0/1 ip add 12.0.0.1 24 multicast routing-enable int g0/0/0 pim dm int g0/0/1 pim dm
View Code
R2的配置


sys sys R2 int g0/0/0 ip add 11.0.0.2 24 int g0/0/1 ip add 22.0.0.2 24 multicast routing-enable int g0/0/0 pim dm int g0/0/1 pim dm
View Code
運行組播源,在lsw2上任意接口抓包
提示:可以看到當我們啟動組播源以後,對應在lsw2上就能抓到assert包,其中R1R2都會發送的assert包,當assert包都發送以後,會根據各自包中攜帶的信息進行對比,根據規則在此環境中R2應該要勝出,因為在在優先級和開銷都一樣的情況下,本地接口ip地址大者勝出;
提示:可以看到在assert包沒發送之前,R1和R2都在轉發組播數據;
提示:可以看到assert包發送以後,後續都是R2在轉發數據;
驗證:查看R2的g0/0/1口的mac地址是否是12bd?
提示:可以看到我們抓到組播數據報中對應源mac地址正是R2的g0/0/1的mac地址,說明我們在交換機上抓到包都是由R2轉發,R1因為assert沒有勝出,所以R1並不轉發數據;