什麼是IGMP(網際網路群組管理協定)?定義、運作方式
網路百科全書中網際網路群組管理協定(IGMP)的定義。
什麼是 IGMP(網際網路群組管理協定)?
IGMP 代表網際網路群組管理協定,是一種 TCP/IP 網路層協定,用於通知路由器網路上組播組的可用性。
運作方式
在組播環境中,網際網路組管理協定(IGMP)用於在網路上的路由器之間交換有關組播組成員狀態的資訊。換句話說,一旦路由器意識到本地連線網路上存在屬於特定組播組成員的主機,它就會將此資訊通告給網際網路上的其他路由器,以便將組播消息轉發到相應的路由器。
IGMP 基本架構
要加入多點傳送組,主機必須向附近的路由器報告其成員資格請求。這些路由器會定期輪詢其本機連線網路中的主機,以檢查其成員資格狀態。當主機首次加入組播組時,它會傳送稱為主機成員資格報告的IGMP消息,該消息定向到組播地址244.0.0.1,其中包含標識其要加入的組組的組播地址。然後,連線到該主機本地網路的路由器會通告整個網路中的其他路由器,表明該特定網路具有屬於該多點傳送群組的主機。
路由器透過傳送主機成員資格查詢訊息來定期輪詢主機,以確定其中任何主機是否仍是該組的成員。如果網路上不再有主機屬於該組,則路由器將停止將資訊通告給網路上的其他路由器,以便不再將定向到該組的組播消息轉發到該組。
IGMP 訊息
IGMP消息封裝在IP資料包中。為了指示IGMP資料包,IP報頭包含協定編號2。對於IGMP版本2(由RFC 2236定義),IP資料欄位包含圖6-2所示的8個八位元組IGMP消息。
IGMP訊息中的欄位包含下列資訊:
Type: 此欄位指定IGMP資料包的型別:
-
0x'11': 指定成員資格查詢封包。這是由多點傳送路由器傳送。成員資格查詢訊息有兩種子類型:
-
一般查詢:這用於瞭解哪些組在連接的網路上具有成員。
-
組特定查詢:這用於瞭解特定組在連線的網路上是否有任何成員。
-
0x'12': 指定 IGMPv1 成員資格報告封包。這是由多點傳送主機傳送,以發出參與特定多點傳送主機群組的訊號。
-
0x'16': 指定 IGMPv2 成員資格報告封包。
-
0x'17': 指定離開群組封包。這是由多點傳送主機傳送的。
Max resp time:此欄位用於成員資格查詢消息。它指定主機在傳送相應報告之前可以等待的最長時間。更改此設定允許路由器調整離開延遲。這引用了最後一台主機離開組與路由協定被通知沒有更多成員的時間之間的時間。
Checksum: 此欄位包含 16 位元總和檢查碼。
Class D Address:此欄位包含有效的組播群組位址。它用於報告資料包。
IGMPv3 訊息
IGMPv2消息格式已在RFC 3376(已過時的RFC 2236)中定義的IGMP第3版中進行了擴展。版本3允許接收方訂閱或排除組播組內的一組特定源。為了適應這一點, 已變更 0x'11' 型別成員資格查詢封包,並新增新的 IGMP 封包類型 0x'22'。不過,所有 IGMPv3 實作仍必須支援封包類型 0x'12'、0x'16' 及 0x'17'。
此訊息中的欄位如下:
Type: 這保持不變,且在成員資格查詢訊息的情況下,其值為 0x'11'。
Max resp code:此欄位已從 IGMPv2 慣例變更,並區分最大回應代碼和最大回應時間。時間可以從代碼中確定如下:
如果最大回應碼小於 128,則最大回應碼的值也是最大回應時間。
如果回應碼上限大於 128,則回應碼上限代表浮點值,如下所示:
-
Byte 0 = 1
-
Bytes 1-3 = exp
-
Bytes 4-7 = mant
最大回應時間 = (mant OR 0x'10) << (exp + 3)
Note: IGMPv2和IGMPv3的最大回應時間均以十分之一秒為組織進行量測。
這可以更好地描述為創建一個 5 位字符串,從 1 開始,然後是 4 位 mant,然後將該字符串 exp+3 向左移動。結果值是最大回應時間。例如,假設最大回應碼的值為十進位數 178。其位字串表示法10110010。由此,最大回應碼的欄位為:
-
Byte 0 = 1
-
exp = 011
-
mant = 0010
後續計算為(請注意,exp 計算使用十進制 3 的二進位表示):
-
(mant or 0x10) = (0010 or 10000) = 10010
-
10010 << exp + 11 = 10010 << 110 = 10010000000
-
Binary 10010000000 = Decimal 1152
因此,當最大回應碼為十進位178時,最大回應時間為十分之1152秒。
Checksum:此欄位包含 16 位元總和檢查碼,且與其版本 2 對應的欄位保持不變。
Group Address:此欄位包含 D 類位址,且與其版本 2 對應的位址保持不變。
Resv:此欄位是保留的,在傳輸時設定為零,在接收時忽略。
S Flag:當設定為1時,此欄位表示任何接收組播路由器都應抑制在聽到查詢時通常執行的正常計時器更新。
QRV: 此欄位是查詢器的穩健性變數。QRV是在IGMPv3中新增的,用於調整預期資料包丟失的計時器值。QRV的值越高,環境對域內丟失的資料包的容忍度就越高。但是,增加QRV也會增加檢測問題所需的延遲。路由器採用最近收到的查詢中此欄位中的值作為自己的穩健性變數。如果此值超過7的限制,則重置為0。
QQIC:此欄位是查詢者的查詢間隔代碼。此值以秒為單位指定,指定此查詢的發起者所使用的查詢間隔。將此代碼轉換為實際間隔時間的計算與用於最大響應代碼的計算相同。
Number of Sources (N):此欄位指出訊息中包含的來源位址數目。此欄位的最大值由網路中允許的MTU決定。
Source Addresses:這組欄位是N個IP單播地址的向量,其中值N對應於「編號」或「來源(N)」欄位。
此外,IGMPv3 新增了一種新的 0x'22',即 IGMPv3 成員資格報告。下圖說明此訊息的格式。
在上圖中,「型別」、「總和檢查碼」和「群組記錄數」欄位等同於其 IGMPv3 訊息查詢對應項目。不過,在成員資格報告訊息中,每個群組記錄都會分開,如下圖所示。
群組記錄內的欄位說明如下:
記錄類型:此欄位指出群組記錄類型是現行狀態、過濾器模式變更或來源清單變更記錄。值如下:
現行狀態記錄是由系統傳送,以回應介面上收到的查詢,並報告該介面的現行接收。
有兩個群組記錄值表示目前狀態記錄:
-
MODE_IS_INCLUDE:這表示介面對於指定的組播地址具有INCLUDE的過濾模式。
-
MODE_IS_EXCLUDE:這表示介面對於指定的組播地址具有EXCLUDE的過濾模式。
每當特定組播地址的介面
狀態發生變化時,系統都會傳送過濾器模式變更記錄。有兩個群組
記錄值表示篩選模式變更記錄:
-
CHANGE_TO_INCLUDE_MODE:這表示介面已更改為指定組播地址的INCLUDE過濾器模式。
-
CHANGE_TO_EXCLUDE_MODE:這表示介面已更改為指定組播地址的EXCLUDE過濾模式。
每當介面
想要變更來源位址清單而不變更其狀態時,系統就會傳送來源清單變更記錄。有
兩個群組記錄值表示來源清單變更記錄:
-
ALLOW_NEW_SOURCES:這表示介面已變更,因此它想要接收來自其他來源的訊息。如果篩選器是 INCLUDE 篩選器,則會新增指定的多點傳送位址。如果是EXCLUDE過濾器,則會移除指定的多點傳送位址。
-
BLOCK_OLD_SOURCES:這表示介面已變更,不再想要接收來自其他來源的訊息。如果篩選器是 INCLUDE 篩選器,則會移除指定的多點傳送位址。如果是EXCLUDE過濾器,則會新增指定的組播位址。
每當介面想要變更來源位址清單而不變更其狀態時,系統就會傳送來源清單變更記錄。有兩個群組記錄值表示來源清單變更記錄:
-
ALLOW_NEW_SOURCES:這表示介面已變更,因此它想要接收來自其他來源的訊息。如果篩選器是 INCLUDE 篩選器,則會新增指定的多點傳送位址。如果是EXCLUDE過濾器,則會移除指定的多點傳送位址。
-
BLOCK_OLD_SOURCES:這表示介面已變更,不再想要接收來自其他來源的訊息。如果篩選器是 INCLUDE 篩選器,則會移除指定的多點傳送位址。如果是EXCLUDE過濾器,則會新增指定的組播位址。
IGMP 操作
主機和組播路由器都參與IGMP功能。
主機作業
若要接收多點傳送資料包,主機必須加入主機群組。當主機處於多宿主狀態時,它可以在其一或多個連接的介面上加入群組。如果主機在多個介面上加入同一組,則主機接收的組播消息可能不同。例如,244.0.0.1 是此子網路上所有主機的群組。此群組中透過一個子網路接收的訊息一律與另一個子網路上的訊息不同。
單一主機上的多個處理程序可以接聽來自相同群組的訊息。發生這種情況時,主機會加入群組一次。主機會在內部追蹤群組中感興趣的每個處理程序。
要加入組,主機通過連接的介面傳送IGMP成員資格報告資料包。報告會傳送至所需的組播群組。主機不需要加入所有主機群組 (224.0.0.1)。此群組的成員資格是自動的。
IGMPv3 特定主機作業
在IGMPv3中,主機指定要從中接收訊息的組播位址清單,或不想從中接收訊息的組播位址清單。然後,主機稍後可以變更這些清單,以新增或移除組播位址。這可以使用 filter-mode-change 和 source-list-change 記錄來達成。
Note: 如果不存在介面狀態,則使用篩檢程式模式更改記錄創建。
使用表 6-1 示範這些記錄的使用。在此範例中,目前狀態指出目前包含或排除的組播位址(A和B)的子集。所需狀態表示想要包含或排除的子集。達到所需狀態所需的記錄會顯示可傳送以達成此變更的記錄。請注意,群組類型記錄縮寫如下:
-
CHANGE_TO_INCLUDE_MODE:To_in
-
CHANGE_TO_EXCLUDE_MODE:To_ex
-
ALLOW_NEW_SOURCES:Allow
-
BLOCK_OLD_SOURCES:Block
使用群組記錄類型的 IGMPv3 清單變更
這些步驟總結如下:
-
目前沒有來源位址清單。清單 A 的子集是透過發出指定 A 子集的CHANGE_TO_INCLUDE_MODE來新增。
-
目前包括子集 A。不過,只需要子集 B。為此,首先,發出ALLOW_NEW_SOURCES訊息以新增所有子集 B,但 A 中已包含的位址除外。後面接著一條BLOCK_OLD_SOURCES訊息,以排除所有子集 A,但也屬於 B 的位址除外。
-
現在只包含子集 B。不過,我們想要將篩選器變更為 EXCLUDE,並僅指定子集 A。這是透過指定子集 A 的一個CHANGE_TO_EXCLUDE_MODE來完成的。
-
在步驟 3 之後,只會排除子集 A。現在,我們只想排除子集 B。首先發出ALLOW_NEW_SOURCES訊息,從排除清單中移除所有子集 A,但子集 B 中的位址除外。然後將子集 B 中的所有位址新增至排除清單,但子集 A 中也選擇了。
-
現在只排除子集 B。我們想要將篩選器變更為 INCLUDE,並將 A 新增至清單。使用指定子集 A 的
CHANGE_TO_INCLUDE_MODE。
組播路由器操作
當主機嘗試加入群組時,子網路上的組播路由器會接收成員資格報告封包,並在其本機群組資料庫中建立專案。此資料庫會追蹤路由器直接連線網路的群組成員資格。
資料庫中的每個項目的格式都是 [group, attached network]。這表示連接的網路至少有一個屬於該組的 IP 主機。多點傳送路由器會接聽所有多點傳送位址以偵測這些報告。
本機群組資料庫中的資訊用於轉送多點播送資料包。當路由器收到資料包時,會將其轉發出包含屬於該組的主機的每個介面。
為了驗證組成員資格,組播路由器會定期將IGMP查詢消息傳送到所有主機的組播地址。每個仍想成為群組成員的主機都會傳送回覆。RFC 3376 指定預設情況下應每 125 秒進行一次驗證。為了避免子網路上的流量突發,查詢訊息的回覆會使用隨機延遲來傳送。由於路由器不會追蹤每個群組中的主機數目,因此任何聽到另一個裝置宣告成員資格的主機都會取消任何擱置的成員資格回覆。如果在指定的間隔內沒有主機宣告成員資格,則多點傳送路由器會假設該網路上沒有主機是群組的成員。
IGMP 監聽交換器
實施IGMP時的一個潛在問題是網段使用組播資料包泛洪,即使該網段上可能沒有任何節點對接收資料包感興趣。儘管接收這些資料包所涉及的處理量不會帶來很大的成本,但這些資料包的泛洪確實有可能浪費頻寬。
此問題記錄在RFC 4541中,該規則提供了建議和建議規則,以允許網路交換機「窺探」IGMP流量。透過這樣做,交換器可以分析 IGMP 標頭中包含的數據,並確定是否需要將流量轉發到交換器所連接的每個網段。通過這樣做,交換機可以減少湧入不感興趣網絡的不必要IGMP流量,從而為這些網絡上的主機所關注的流量保留網段的帶寬。