在組播實現中,組播路由和轉發分為三種表:
l 每個組播路由協議都有一個協議自身的路由表,如PIM路由表(PIM Routing-Table);
l 各組播路由協議的組播路由信息經過綜合形成一個總的組播路由表(Multicast Routing-Table);
l 組播轉發表(Multicast Forwarding-Table)直接用於控製組播數據包的轉發。
組播路由表由一組(S,G)表項組成,其中(S,G)表示由源S向組播組G發送組播數據的路由信息。如果路由器支持多種組播路由協議,則其組播路由表中將包括由多種協議生成的組播路由。路由器根據組播路由和轉發策略,從組播路由表中選出最優的組播路由,並下發到組播轉發表中。
組播路由協議依賴於現有的單播路由信息、MBGP路由或組播靜態路由來創建組播路由表項。組播路由協議在創建組播路由表項時,運用了RPF(Reverse Path Forwarding,逆向路徑轉發)檢查機製,以確保組播數據能夠沿正確的路徑傳輸,同時還能避免由於各種原因而造成的環路。
執行RPF檢查的依據是單播路由、MBGP路由或組播靜態路由:
l 單播路由表中彙集了到達各個目的網段的最短路徑;
l MBGP路由表直接提供組播路由信息;
l 組播靜態路由表中列出了用戶通過手工靜態配置指定的RPF路由信息。
在執行RPF檢查時,路由器同時查找單播路由表、MBGP路由表和組播靜態路由表,具體過程如下:
(1) 首先,分別從單播路由表、MBGP路由表和組播靜態路由表中各選出一條最優路由:
l 以“報文源”的IP地址為目的地址查找單播路由表,自動選取一條最優單播路由。對應表項中的出接口為RPF接口,下一跳為RPF鄰居。路由器認為來自RPF鄰居且由該RPF接口收到的組播報文所經曆的路徑是從源S到本地的最短路徑。
l 以“報文源”的IP地址為目的地址查找MBGP路由表,自動選取一條最優MBGP路由。對應表項中的出接口為RPF接口,下一跳為RPF鄰居。
l 以“報文源”的IP地址為指定源地址查找組播靜態路由表,自動選取一條最優組播靜態路由。對應表項明確指定了RPF接口和RPF鄰居。
(2) 然後,從這三條最優路由中選擇一條作為RPF路由:
l 如果配置了按照最長匹配選擇路由,則從這三條路由中選出最長匹配的那條路由;如果這三條路由的掩碼一樣,則選擇其中優先級最高的那條路由;如果它們的優先級也相同,則按照組播靜態路由、MBGP路由、單播路由的順序進行選擇。
l 如果沒有配置按照最長匹配選擇路由,則從這三條路由中選出優先級最高的那條路由;如果它們的優先級相同,則按照組播靜態路由、MBGP路由、單播路由的順序進行選擇。
& 說明:
根據組播報文傳輸的具體情況不同,“報文源”所代表的具體含義也不同:
l 如果當前報文沿從組播源到接收者或RP(Rendezvous Point,彙集點)的SPT(Shortest Path Tree,最短路徑樹)進行傳輸,則以組播源為“報文源”進行RPF檢查;
l 如果當前報文沿從RP到接收者的RPT(Rendezvous Point Tree,共享樹)進行傳輸,則以RP為“報文源”進行RPF檢查;
l 如果當前報文為BSR(BootStrap Router,自舉路由器)報文,沿從BSR到各路由器的路徑進行傳輸,則以BSR為“報文源”進行RPF檢查。
對每一個收到的組播數據報文都進行RPF檢查會給路由器帶來較大負擔,而利用組播轉發表可以解決這個問題。在建立組播路由和轉發表時,會把組播數據報文(S,G)的RPF接口記錄為(S,G)表項的入接口。當路由器收到組播數據報文(S,G)後,查找組播轉發表:
(1) 如果組播轉發表中不存在(S,G)表項,則對該報文執行RPF檢查,將其RPF接口作為入接口,結合相關路由信息創建相應的表項,並下發到組播轉發表中:
l 若該報文實際到達的接口正是其RPF接口,則RPF檢查通過,向所有的出接口轉發該報文;
l 若該報文實際到達的接口不是其RPF接口,則RPF檢查失敗,丟棄該報文。
(2) 如果組播轉發表中已存在(S,G)表項,且該報文實際到達的接口與入接口相匹配,則向所有的出接口轉發該報文。
(3) 如果組播轉發表中已存在(S,G)表項,但該報文實際到達的接口與入接口不匹配,則對此報文執行RPF檢查:
l 若其RPF接口與入接口一致,則說明(S,G)表項正確,丟棄這個來自錯誤路徑的報文;
l 若其RPF接口與入接口不符,則說明(S,G)表項已過時,於是把入接口更新為RPF接口。如果該報文實際到達的接口正是其RPF接口,則向所有的出接口轉發該報文,否則將其丟棄。
如圖1所示,假設網絡中單播路由暢通,未配置MBGP,Router C上也未配置組播靜態路由。組播報文(S,G)沿從組播源(Source)到接收者(Receiver)的SPT進行傳輸。假定Router C上的組播轉發表中已存在(S,G)表項,其記錄的入接口為POS5/1。
圖1 RPF檢查過程
l 如果該組播報文從接口POS5/1到達Router C,與(S,G)表項的入接口相匹配,則向所有的出接口轉發該報文。
l 如果該組播報文從接口POS5/0到達Router C,與(S,G)表項的入接口不匹配,則對其執行RPF檢查:通過查找單播路由表發現到達Source的出接口(即RPF接口)是POS5/1,與(S,G)表項的入接口一致。這說明(S,G)表項是正確的,該報文來自錯誤的路徑,RPF檢查失敗,於是丟棄該報文。
組播靜態路由是RPF檢查的重要依據之一。根據具體應用環境的不同,組播靜態路由有以下兩種主要用途:
通常,組播的網絡拓撲結構與單播相同,組播數據的傳輸路徑也與單播相同。可以通過配置組播靜態路由以改變RPF路由,從而為組播數據創建一條與單播不同的傳輸路徑。
圖2 改變RPF路由示意圖
如圖2所示,當網絡中沒有配置組播靜態路由時,Router C到組播源(Source)的RPF鄰居為Router A,從Source發出的組播信息沿Router A—Router C的路徑傳輸,與單播路徑一致;當在Router C上配置了組播靜態路由,指定從Router C到Source的RPF鄰居為Router B之後,從Source發出的組播信息將改變傳輸路徑,沿Router A—Router B—Router C的新路徑傳輸。
當網絡中的單播路由被阻斷時,由於沒有RPF路由而無法進行包括組播數據在內的數據轉發。可以通過配置組播靜態路由以生成RPF路由,從而創建組播路由表項以指導組播數據的轉發。
圖3 銜接RPF路由示意圖
如圖3所示,RIP域與OSPF域之間實行單播路由隔離。當網絡中沒有配置組播靜態路由時,OSPF域內的接收者(Receiver)不能收到RIP域內的組播源(Source)所發出的組播信息;當在Router C和Router D上均配置了組播靜態路由,分別指定從Router C到Source的RPF鄰居為Router B、從Router D到Source的RPF鄰居為Router C之後,Receiver便能收到Source發出的組播信息了。
& 說明:
l 組播靜態路由的作用隻在於影響RPF檢查,而不能用於指導組播數據轉發,故又稱為RPF靜態路由;
l 組播靜態路由僅在所配置的組播路由器上生效,不會以任何方式被廣播或者引入給其它路由器。
網絡中可能存在不支持組播協議的路由器。從組播源(Source)發出的組播數據沿組播路由器逐跳轉發,當下一跳路由器不支持組播協議時,組播轉發路徑將被阻斷。此時,通過在處於單播網段兩端的組播路由器之間建立GRE(Generic Routing Encapsulation,通用路由封裝)隧道,可以實現跨越單播網段的組播數據交換。
如圖4所示,在Router A和Router B之間建立起GRE隧道。Router A將組播數據包封裝在單播IP報文中,經由單播路由器轉發,傳送到隧道另一端的Router B。然後,Router B將單播IP報文頭剝掉,繼續進行組播傳輸。
如果在隧道的兩端配置了單播靜態路由,則任意單播數據包都可以通過該隧道傳輸。為了將該隧道專用於組播數據包的傳輸,可以在隧道兩端隻配置組播靜態路由,從而使單播數據包的傳輸不能再使用此隧道。
Multicast traceroute(組播路徑跟蹤)用來跟蹤組播數據從第一跳到最後一跳路由器所經過的路徑。
(1) 最後一跳路由器(Last-hop Router):如果某路由器有一個接口的IP地址與指定地址在同一個網段內,具備組播功能,且能夠向該網段轉發特定組播源發來的組播流,則稱該路由器為最後一跳路由器。
(2) 第一跳路由器(First-hop Router):與組播源直連的路由器。
(3) 查詢器(Querier):觸發組播路徑跟蹤的路由器。
Multicast traceroute報文是一種特殊的IGMP報文,與普通IGMP報文的區別在於其類型字段為0x1F/0x1E,且其目的IP地址為單播地址。Multicast traceroute報文分為以下三種類型:
l Query報文:類型字段為0x1F
l Request報文:類型字段為0x1F
l Response報文:類型字段為0x1E
(1) 查詢器向最後一跳路由器發送Query報文;
(2) 最後一跳路由器在收到的Query報文後加上本地響應數據塊轉換成Request報文,查找到上遊鄰居後向其單播發送該Request報文;
(3) 最後一跳路由器到組播源之間的每一跳都在Request報文之後附加一個響應數據塊,並向其上遊鄰居單播轉發;
(4) 第一跳路由器在收到Request報文後,將其報文類型改為Response報文,向查詢器單播發送完整的報文。