IP多播
IP多播的基本概念
與單播相比,在一對多的通信中,多播可以大大減少網絡資源。在互聯網上進行多播就叫做IP多播,IP多播所傳送的分組需要使用多播IP地址。能夠運行多播協議的路由器叫做多播路由器,當然多播路由器也可以轉發普通的IP數據報。
在互聯網中的每一台主機都必須有一個全球唯一的IP地址,如果某台主機現在想接受某個特定多播組的分組,那么怎樣才能使這個多播數據報傳送到這台主機呢?
其實多播組的標識符就是 IP 地址中的 D 類地址。D 類 IP 地址的前四位是 1110,因此D 類地址范圍是 224.0.0.0 到 239.255.255.255。我們就用每一個 D 類地址標志一個多播組。這樣,D 類地址共可標志 228 個多播組,也就是說,在同一時間可以允許有超過 2.6 億的多播組在互聯網上運行。多播數據報也是“盡最大努力交付”,不保證一定能夠交付多播組內的所有成員。因此,多播數據報和一般的IP數據報的區別就是它使用D類IP地址作為目的地址,並且首部中的協議字段值是2,表明使用網際組管理協議IGMP。
顯然,多播地址只能用於目的地址,而不能用於源地址。此外,對多播數據報不產生ICMP 差錯報文。因此,若在 PING 命令后面鍵入多播地址,將永遠不會收到響應。
IP多播可以分為兩種:在局域網上進行硬件多播和在互聯網范圍進行多播
在局域網上進行硬件多播
互聯網號碼指派管理局 IANA 擁有的以太網地址塊的高 24 位為 00-00-5E, 因此 TCP/IP協議使用的以太網多播地址塊的范圍是從00-00-5E-00-00-00到00-00-5E-FF-FF-FF。在第3章講過,以太網硬件地址字段中的第 1 字節的最低位為 1 時即為多播地址,這種多播地址數占 IANA 分配到的地址數的一半。因此 IANA 擁有的以太網多播地址的范圍是從01-00-5E-00-00-00到01-00-5E-FF-FF-FF。不難看出,在每一個地址中,只有23位可用作多播。這只能和D類IP 地址中的23位有一一對應的關系。D類 IP 地址可供分配的有 28 位,可見在這 28 位中的前 5 位不能用來構成以太網硬件地址(圖 4-54)。例如,IP 多播地址224.128.64.32(即 E0-80-40-20)和另一個 IP 多播地址 224.0.64.32(即 E0-00-40-20)轉換成以太網的硬件多播地址都是 01-00-5E-00-40-20。由於多播 IP 地址與以太網硬件地址的映射關系不是唯一的,因此收到多播數據報的主機,還要在 IP 層三利 片用軟件進濾,把不是本主機要接收的數據報丟棄。

下面就討論IP多播所需要的協議
網際組管理協議IGMP和多播路由選擇協議
IP多播需要兩種協議
如圖4-55是互聯網傳送多播數據的例子。圖中標有IP地址的四台主機都參加了一個多播組,其地址是226.15.37.123。顯然多播數據報應當傳送到路由器R1、R2、R3,而不是R4,因為R4連接的局域網並沒有成員接入到多播組中。但這些路由器又怎么知道多播組的成員呢?這就要利用一個協議,叫做網際組管理協議IGMP(Internet Group Managerment Protocol)

圖 4-55 強調了 IGMP 的本地使用范圍。請注意,IGMP 並非在互聯網范圍內對所有多播組成員進行管理的協議。IGMP 不知道 IP 多播組包含的成員數,也不知道這些成員都分布在哪些網絡上,等等。IGMP 協議是讓連接在本地局域網上的多播路由器知道本局域網上是否有主機(嚴格講,是主機上的某個進程)參加或退出了某個多播組。
顯然,僅有 IGMP 協議是不能完成多播任務的。連接在局域網上的多播路由器還必須和互聯網上的其他多播路由器協同工作,以便把多播數據報用最小代價傳送給所有的組成員。這就需要使用多播路由選擇協議。
網際組管理協議IGMP
與網際控制報文協議ICMP類似,IGMP使用IP數據報傳送報文(即在IGMP首部加上IP數據首部構成了IP數據報),但它也向IP提供服務。因此,我們不能把IGMP看成是一個單獨的協議,而是屬於整個網際協議IP的一個組成部分。從概念上來講,IGMP的工作可分為兩個階段:
-
第一個階段:當某台主機加入新的多播組的時候,該主機應向多播組的多播地址發送一個IGMP報文,聲明自己要成為該組的成員。本地的多播路由器收到IGMP報文后,還要利用多播路由選擇協議把這種組成員關系轉發給互聯網上的其它多播路由器。
-
第二個階段:組成員關系是動態的。本地多播路由器要周期性地探詢本地局域網上的主
機,以便知道這些主機是否還繼續是組的成員。只要有一台主機對某個組響應,那么多播路由器就認為這個組是活躍的。但一個組在經過幾次的探詢后仍然沒有一台主機響應,多播路由器就認為本網絡上的主機已經都離開了這個組,因此也就不再把這個組的成員關系轉發給其他的多播路由器。
IGMP協議設計的很仔細,避免了多播控制信息給網絡增加大量的開銷,IGMP采用的具體措施如下:
-
主機和多播路由器之間的所有通信都是使用IP多播。只要有可能,攜帶IGMP報文的數據報都用硬件多播來傳送。因此在支持硬件多播的網絡上,沒有參加IP多播的主機不會接收到IGMP報文。
-
多播路由器在探詢組成員關系時,只需要對所有的組發送一個請求信息的詢問報文,而不需要對每一個組發送一個詢問報文(雖然也允許對一個特定組發送詢問報文)。默認的詢問速率是每 125 秒發送一次(通信量並不太大)。
-
當同一個網絡上連接有幾個多播路由器時,它們能夠迅速和有效地選擇其中的一個來探詢主機的成員關系。因此,網絡上多個多播路由器並不會引起IGMP通信量的增大。
-
在 IGMP 的詢問報文中有一個數值 N,它指明一個最長響應時間(默認值為 10秒)。當收到詢問時,主機在 0 到 N 之間隨機選擇發送響應所需經過的時延。因此,若一台主機同時參加了幾個多播組,則主機對每一個多播組選擇不同的隨機數。對應於最小時延的響應最先發送。
-
同一個組內的每一台主機都要監聽響應,只要有本組的其他主機先發送了響應,自己就可以不再發送響應了。這樣就抑制了不必要的通信量。
多播路由器並不需要保留組成員關系的准確記錄,因為向局域網上的組成員轉發數據報是使用硬件多播。多播路由器只需要知道網絡上是否至少還有一台主機是本組成員即可。實際上,對詢問報文每一個組只需有一台主機發送響應。
如果一台主機上有多個進程都加入了某個多播組,那么這台主機對發給這個多播組的每個多播數據報只接收一個副本,然后給主機中的每一個進程發送一個本地復制的副本。最后我們還要強調指出,多播數據報的發送者和接收者都不知道(也無法找出)一個多播組的成員有多少,以及這些成員是哪些主機。互聯網中的路由器和主機都不知道哪個應用進程將要向哪個多播組發送多播數據報,因為任何應用進程都可以在任何時候向任何一個多播組發送多播數據報,而這個應用進程並不需要加入這個多播組。
多播路由選擇協議
雖然TCP/IP中IP多播協議已經成為了建議標准,但多播路由選擇協議尚未標准化。
在多播過程中,一個多播組的成員是動態變化的。多播路由選擇協議實際上是找出以源主機為根節點的多播轉發樹,在多播轉發樹上,每一個多播路由器向樹的葉節點方向轉發收到的多播數據報,但在多播轉發樹上的多播路由器上不會收到重復的多播數據報(即多播數據報不會在互聯網中兜圈子)。不難看出,對於不同的多播組對應於不同的多播轉發樹,同一個多播組,對不同的源點也會有不同的多播轉發樹。
已有了多種實用的多播路由選擇協議,它們在轉發多播數據報的時候使用了以下三種方法:
- 洪泛與剪除:這種方法適用於較小的多播組,而所有的組成員接入的局域網也是相鄰的。一開始,路由器轉發多播數據報使用的是洪泛的方法(也就是廣播)。為了避免兜圈子,采用了叫做反向廣播路徑RPB(Reverse Path Broadcasting)的策略。RPB的要點是:每一個路由器在收到一個多波數據報的時候,先檢查數據報是否從源點經最短路徑傳來,進行這種檢查很容易,只要從本路由器尋找到源點的最短路徑上(之所以叫做反向路徑,因為在計算最短路徑的時候把源點當做終點)的第一個路由器是否就是剛才把多播數據報送來的路由器。若是,就向所有其他地方轉發剛才收到的多播數據報(進入的方向除外),否則就丟棄而不轉發。如果本路由器有好幾個相鄰路由器都處在源點的最短路徑上(也就是說,存在多條同樣長度的最短路徑),那么只能選擇一條最短路徑,選擇的轉則是看這幾條最短路徑中誰的IP地址最小嗎,如圖4-57:

為了簡單起見,在圖4-57中的網絡用路由器之間的鏈路來表示,我們假定各路由器之間的距離都是1。路由器R1在收到源點發來的多播數據報之后,向R2和R3進行轉發。R2發現R1就在自己到源點的最短路徑上,因此向R3和R4轉發收到的多播數據報,R3發現R2不在自己的源點的最短路徑上,因此丟棄R2發送過來的數據報。其他路由器也照樣轉發。R6到源點有兩條最短路徑:R7->R4->R2->R1->源點;R7->R5->R3->R1->源點。我們假定R4的IP地址比R5的IP小,所以我們只使用前一條最短路徑。因此R7只轉發R4發過來的IP數據報。而丟棄R5傳過來的數據報。最后就得到了用來轉發多播數據報的多播轉發樹(圖中粗線),以后就按照這個多播轉發樹來轉發多波數據報。這樣就避免了多播數據報兜圈子問題。
如果在多播轉發樹上的某個路由器發現它的下游樹枝(即葉節點方向)已沒有該多播組成員,就應該把它和下游的樹枝一起剪除,例如,在圖4-57中虛線橢圓表示剪除的部分,當某個樹枝有新增加的組成員的時候,可以再接入到多播轉發樹上。
- 隧道技術(tunneling):隧道技術適用於多播組的位置在地理上很分散的情況。例如在圖4-58中,網1和網2都支持多播,現在網1的一些主機向網2的一些主機進行多播。但路由器R1和R2之間的網絡並不支持多播,因而R1和R2路由器不能按多播地址進行轉發數據報。為此。R1路由器就對多播數據報進行再封裝,再加上普通數據報首部,使之成為一個向單一目的站發送的單播(unicast)數據報,然后通過隧道(tunnel)從R1發送到R2。

單播數據報到達路由器R2后,再由路由器R2剝去其首部,使之又恢復成原來的多播數據報,繼續向多個目的站進行轉發。使用隧道技術傳送數據報又叫做IP中的IP(IP in IP)。
- 基於核心的發現技術:這種方法對於多播組的大小在較大范圍內變化都合適。這種方法是對每一個多播組G指定一個核心路由器,給出它的IP單播地址。核心路由器按照前面講過的方法創建出對應於多播組G的轉發樹。如果有一個路由器R1向這個核心路由器發送數據報,那么它在途中經過的每一個路由器都要檢查其內容。當數據報到達參加了多播組G2的組地址時候,R2就向多播組G的成員轉發這個多波數據報。如果R1發送的數據報是一個請求加入多播組G的數據報,R2就把這個信息加到它的路由中,並用隧道技術向R1轉發每一個多播數據報副本。這樣,參加組G的路由器就從核心向外增多了。擴大了多播轉發樹的范圍。
