IGMP協議
一、簡介
IGMP協議運行於主機和與主機直連的組播路由器之間。
IGMP工作機制
- 接收者主機向所在的共享網絡報告組成員關系。
- 查詢器周期性地向該共享網段發送組成員查詢信息。
- 接收者主機接收到查詢消息后進行相應以報告組成員關系。
- 網段中的組播路由器一句接收到的相應來刷新組成員的存在信息。
支持組播的路由器不需要也不可能保存所有主機的成員關系,它只是通過IGMP協議了解每個接口連接的網段上是否存在某個組播組的接收者,即組成員。(所以對應於某個組播組,會存在一個Last Reporter的巨鹿表項),而各主機只需要保存自己加入了哪些組播組。
二、協議發展
- 目前,IGMP協議共有3個版本:
- IGMPv1(RFC1112)定義了基本的組成員查詢和報告過程。
- IGMPv2(RFC2236)在IGMPv1的基礎上添加了組成員快速離開的機制。
- IGMPv3增加的主要功能是成員可以指定接收或指定不接收某些組播源的報文。
- 三個版本在演進過程中對協議報文的處理是向前兼容的,因此盡管各版本的協議報文格式不同,但是運行IGMP高版本的路由器可以識別低版本的成員報告。
- 所有IGMP版本都支持ASM(Any-Source-Multicast)模型。IGMPv3可以直接應用於SSM(Source-Specific Multicast)模型,而IGMPv1和IGMPv2則需要SSM-Mapping技術的支持。
三、IGMPv1
1、報文格式
Version:IGMP版本標識,版本1為1,IGMPv2報文中沒有該字段。
Type:類型字段,表示IGMP報文類型。IGMPv1支持兩種類型的報文:
- 成員關系查詢(0×11):路由器周期性的發送成員關系查詢報文去查詢是否有組播成員。默認查詢周期為60秒。
- 成員關系報告(0×12):成員關系報告用於表示主機想加入某個組播組。成員關系報告可以主動發送也可以被動發送:
- 被動發送是指主機收到成員關系查詢消息后如果對某個組播組感興趣想加入組播組時發送成員關系報告。
- 主動發送是指如果主機想加入某個組播組時,可以不用等待成員關系查詢報文,而主動地發送成員關系報告。
Checksum:IGMP消息的校驗和。該字段在進行校驗計算時設置為0。
- 當傳送報文的時候,必須計算該校驗字並插入到該字段中去。
- 當接收包的是hi,該校驗字必須在處理該包之前進行校驗。
組地址:不同類型的IGMP報文中組地址不同。
- 在成員關系報告報文中,組地址為某個特定的組播地址。
- 在成員關系查詢報文中,組地址為0。
2、IGMPv1的抑制機制
IGMP成員關系查詢報文是目的地址224.0.0.1,就是說網段內的所有設備都會接收到該查詢報文。
但並不是所有接收到該報文的主機都會響應查詢請求的。
實際上主機收到IGMP成員關系查詢時,會對它已經加入的每個組播組啟動一個倒計數報告計時器,計時器的值默認為0到最大響應值,IGMPv1中的最大響應值固定使用10秒。計時器到時的主機則主動發送成員關系報告,組地址為該組播地址,目的地址為224.0.0.1,於是網段內其他主機都會收到該成員關系報告報文,接收到成員關系報告報文的主機抑制成員關系報告的發送,並刪除計時器。
當路由器周期性的發送成員關系查詢報文時,每一個主機都會再次啟動計時器進行查詢/響應/抑制。(路由器的查詢間隔為60秒)
3、IGMPv1組成員離開
由於IGMPv1版本沒有定義專門離開組播組的消息,因此主機離開組時是默默離開不發送任何報文。
當離開的成員超過60秒沒有向路由器發送成員關系報告報文時,路由器會認為組內已經沒有此成員,便不會再向該網段發送組播報文。
四、IGMPv2
1、報文格式:版本2和版本1的報文略有不同,取消了版本字段而相應增加了最大響應時間字段。
- Type:報文類型,IGMPv2報文中有三種報文類型。
- Type=0×11:成員關系查詢報文,分為兩種子類型:
- 常規查詢:用於確定哪些組播組是有效的,常規查詢組地址全為0
- 特定查詢:用於查詢特定的組播組是否還有組成員。組地址為特定的組播地址。
- Type=0×16:IGMPv2組成員關系報告
- 為了和IGMPv1兼容,還有另外的消息類別:0×12(IGMPv1成員報告)
- Type=0×17:離開組消息,主機發送的離開報告
- 只有last reporter才會發送,不是last reporter則依然會默默離開
- Type=0×11:成員關系查詢報文,分為兩種子類型:
- Max Resp Time:最大響應時間字段,僅用於組成員關系查詢。表示主機響應查詢返回報告的時間范圍。IGMPv1中沒有該字段。
- 普遍組查詢最大響應時間為10秒
- 特定組查詢最大響應時間為1秒
- Checksum:IGMP消息的校驗和,是IGMP消息長度的16位檢測。
- 傳送報文時,必須計算校驗和並填入該字段中
- 接收報文時,必須在處理報文之前的檢驗校驗和,以判斷IGMP消息在傳輸過程中是否發生了錯誤。
- 組地址字段:發送常規查詢時,組地址字段設置為0
- 特定組查詢時,設置為要插損的組地址
- 當主機成員發回組關系報告或是離開組消息時,本字段設置為目標組地址。
2、IGMPv2查詢器選舉
對於一個網段上有多個組播路由器的共享網段,此網段下運行IGMP的路由器都能從主機那里收到成員關系報告消息,但是只需要一個路由器發送成員資格查詢消息,所以這就需要一個路由器選舉機制來確定一個路由器作為查詢器。
只有查詢器才會發送成員關系查詢報文。在IGMPv1版本中,查詢器的選擇由組播路由協議決定;
IGMPv2版本對此做了改進,規定同一網段上有多個組播路由器時,具有最小IP地址的組播路由器被選舉出來充當查詢器。
路由器啟動,主動發出到目的地(224.0.0.1)的IGMPv2常規查詢信息。
收到常規查詢信息的路由器,會把此信息的源IP地址和接收口的IP地址作比較,擁有最低IP地址的路由器被選舉為IGMP查詢路由器。
查詢器也會有失效的時候,當查詢器失效時,另一路由器成為查詢器。所以非查詢路由器會啟動一個查詢計時器,周期檢查IGMP查詢路由器的狀態,缺省情況下120秒(其實就是等兩個查詢周期)。該值可以通過命令 timer other-querier-present interval 修改。
3、IGMPv2組成員離開
離開報告報文目的地址:加入的組播組地址;
在IGMPv1版本中,主機悄然離開組播組,不會向任何組播路由器發出任何通知。造成組播路由器只能依靠響應超時來獲知組播成員的離開。
而在v2版本中,當一個主機決定離開一個組播組時,它會向網絡中所有組播路由器以組播方式(224.0.0.2)發送離開組的消息(目的地址為加入的組播組地址),為了明確該組播組中是否還包含其它成員主機,該組播路由器會向網絡中發送特定組查詢消息。在查詢的最大響應時間內(默認為1秒)沒有收到該組的報告,則再次發送特定組查詢。2次特定組查詢后仍沒有收到成員報告,則認為組播成員全部離開。(注意只是該組的組播成員,但網絡中可能還有其它的組播組)(發送針對組成員離開的特定組查詢,最大響應時間才為1s,其它情況為10s)
五、IGMPv3
1、報文格式
- IGMPv3主要是為了配合SSM(Source-Specific Multicast)模型發展起來的,提供了在報文中攜帶組播源信息的能力,即能加入到指定源的組播組。
- 相較於IGMPv2,IGMPv3新增的報文:
- 特定源組查詢報文
- 報告報文包括主機要加入的組和組播源的過濾模式
- INCLUDE
- EXCLUDE(如果沒有指定源,則主機加入組時默認為此模式,並且exclude列表為null)
- 取消成員關系報告抑制機制
- 因為有可能加入了相同的組,但是不同的源,這就要分開來查詢了
- IGMPv3的報文格式可參考報文格式大全,它包含了查詢報文和報告報文兩種不同格式的報文
IGMPv3查詢報文
相較IGMPv2,其變化如下:
- 查詢報文中除了普遍組查詢和特定組查詢,新增了特定源組查詢報文(Group-and-Source-Specific Query)。該報文由查詢器向共享網段內特定組播組成員發送,用於查詢該組成員是否願意接收特定源發送的數據。特定源組查詢通過在報文中攜帶一個或多個組播源地址來達到這一目的。
- 當IGMPv3主機離開某一個組時,路由器就會發送該特定源組查詢報文
- 需要注意的是,IGMPv3支持特定組查詢是為了兼容IGMPv2
IGMPv3報告報文
相較IGMPv2,其變化如下:
- 報告報文不僅通知路由器主機要加入某組播組,並且可以指定只接收哪些組播源發往該組的數據。
- IGMPv3增加了針對組播源的過濾模式(INCLUDE/EXCLUDE),
- (G,INCLUDE,(S1、S2...)),表示只接收來自指定組播源S1、S2……發往組G的數據;
- (G,EXCLUDE,(S1、S2...)),表示接收除了組播源S1、S2……之外的組播源發給組G的數據,即S1、S2……在接收范圍之外。
- IGMPv3報告報文的目的地址為224.0.0.22,表示發往所有使能了IGMPv3的路由器
2、工作機制
- 如果主機和路由器之間運行的是IGMPv1或IGMPv2,主機加入組播組G時無法對組播源進行選擇,無論其是否需要,都會同時接收到來自組播源S1和S2的數據。
- 如果采用IGMPv3,主機可以選擇僅接收S1組播數據。
- 方法一:Host發送IGMPv3報告(G,IS_IN,(S1)),僅接收源S1向組播組G發送的數據。
- 方法二:Host發送IGMPv3報告(G,IS_EX,(S2)),不接收指定源S2向組播組G發送的數據,從而僅有來自S1的組播數據才能傳遞到Host。