PIM-DM和PIM-SM是組播路由ASM(任意信源組播)中的兩種不同模式。相對PIM-SM的組播註冊機制,PIM-DM的擴散機制顯得更加粗獷。
一、PIM-DM無需向內核註冊pimreg虛接口。但是同PIM-SM一樣需要將三層接口加入MRT組播接口中。以在內核收到組播報文後觸發cache_miss消息。
二、協議初始化階段,會創建PIM協議套接字和igmp套接字,igmp套接字通過配置同樣可以接收來自內核的igmp組播控制報文(cache_miss、process_whole_packet(pim-dm無需解析))。
三、在接口上使能PIM-DM後,協議接口首先會進行DR選舉維護鄰居路由信息。
四、運行階段,當PIM-DM路由接口收到組播信息後,內核會查找MFC表項,如果MFC表項中存在該組播轉發表,則按轉發表中的轉發規則對組播報文進行轉發,如果MFC表項中不存在該組播轉發表,則內核觸發cache_miss消息通過igmp 套接字送到PIM-DM協議。協議得到這個cache_miss消息後 創建(S,G)表項並維護好出口、入口,下發到內核MFC中。之後,組播報文就會按照下發的MFC轉發規則進行轉發。
五、組播轉發表的維護。 PIM-DM創建(S,G)轉發表時,入口就是收到組播報文的接口,出口是除接口外的所有PIM-DM接口。這樣一來,一旦收到組播報文,PIM-DM路由器就會將組播報文從除接口外的所有PIM-DM接口轉發出去。 這個過程就是sprase mode(稀疏模式)的工作方式。
六、剪枝過程,當終端PIM-DM路由收到來自源端的組播報文後,也會創建對應的(S,G)轉發表。並檢查是否有該組播的接收者。如果剪枝定時器到期仍然沒有接收者的話,終端DM路由器將會向該組播入口發送pruned 剪枝報文通告上聯路由該路由接口無需接收該組播信息。 這樣上聯路由就會將pruned接口從(S,G)轉發表的出口列表中剔除,暫時加入到pruned接口列表中去。
七、接收者加入、離開。 當終端路由器接收到igmp report消息時,會將相應的接口加入到自己的(S,G)表項出接口中,並向組播入口發送alert報文,通告上聯路由將自己加入到組播接收者中去。 當終端路由收到igmp leave消息時,則會將相應離開接口從(S,G)表項中剔除,重複六中的剪枝過程。
總而言之:PIM-DM的工作方式,以下面一個情景對話可以概括。
PC 1---------- Router A ------------Router B ------- src
|
PC 2------------Router C
src: 我開始發送組播報文了, 你們看着辦吧。
Router B: Router A, Router C, 不管你們要不要這個組播, 我先發給你們了。不要再和我說下(sparse, 擴散機制)
Router A: 有人要這個組播嗎(igmp query)? 草,半天沒人回(剪枝定時器到期)。 算了, 我先把這個組播記錄下來(創建(S,G)轉發表),我會定時詢問有沒有人要的。但是 Router B你暫時不用再發給我了(pruned 剪枝)。
Router B:好的,我先不給你轉發這個組播信息了(將和Router A級聯的路由口從(S,G)的出口中剔除並加入到剪枝接口列表中)。
Router C: 有人要這個組播嗎? (igmp query)
PC 2: 大哥,我要我要。 (igmp report)
Router C: 我先記錄下(創建(S,G)轉發表), 後面再收到這個組播報文,我就給你發一份哈(組播轉發)。 不要的時候告訴我一下。
PC 1: 我靠,我也要。 (igmp report)
Router A: Router B我這邊有人要這個組播,給我也發一份吧(alert)。
Router B:OK, 後面來的組播我會給你也發一份。(將和Router A級聯的路由口重新加入到(S,G)的出口中)。
PC 1:好像沒什麼用啊。。。 老大,我不要了,別給我發了。
Router A:尼瑪, 你玩我? 受不了了。 Router B我這邊沒人要這個組播了,不用再給我發了(pruned 剪枝)。
Router B: OK。(將和Router A級聯的路由口從(S,G)的出口中剔除並加入到剪枝接口列表中)