IGMP(Internet Group Management Protocol)互聯(lián)網(wǎng)組管理協(xié)議負(fù)責(zé)組播組成員注冊(cè)管理的協(xié)議,用來(lái)在接收者主機(jī)和與其直接相鄰的組播路由器之間建立和維護(hù)組播組成員關(guān)系;
主機(jī)通過(guò)IGMP直接通知本地組播路由器想要接收特定組的組播流量或不再接收特定組的組播流量;
組播路由器根據(jù)已知的組播組成員存在與否決定是否轉(zhuǎn)發(fā)組播流量;
IGMP有三個(gè)版本:IGMPv1、IGMPv2和IGMPv3,基本區(qū)別如下:
IGMPv1定義了基本的組成員查詢和報(bào)告機(jī)制;
IGMPv2添加了查詢器選舉和組成員離開(kāi)機(jī)制;
IGMPv3可以指定接收或不接收指定組播源的流量;
一、IGMPv1
IGMPv1只有普遍組查詢和成員報(bào)告兩種報(bào)文;
主機(jī)通過(guò)成員報(bào)告報(bào)文,通知本地組播路由器希望加入哪個(gè)組播組;
路由器通過(guò)普遍組查詢報(bào)文,周期性查詢網(wǎng)段上是否仍有已知組成員存在;

1、version:IGMP版本,值為1;
2、Type:報(bào)文類(lèi)型只有兩種取值:
(1)0x1表示普遍組查詢報(bào)文;
(2)0x2表示成員報(bào)告報(bào)文;
3、Checksum:IGMP報(bào)文的校驗(yàn)和;
4、Group Address:組播組地址;
(1)在普遍組查詢報(bào)文中,該字段為0;
(2)在成員報(bào)告報(bào)文中,該字段為成員加入的組播組地址;
普遍組查詢報(bào)文General-Query
普通組查詢報(bào)文是組播路由器周期性(60s)向網(wǎng)段上所有主機(jī)及路由器(224.0.0.1)以組播形式發(fā)送的查詢報(bào)文,查詢報(bào)報(bào)文中組地址字段為0.0.0.0,代表查詢的是任意組,本地網(wǎng)段上的所有路由器和主機(jī)都能識(shí)別和接收,任何組播組的成員都回應(yīng)成員報(bào)告報(bào)文;
收到該報(bào)文的主機(jī)回應(yīng)成員報(bào)告報(bào)文,告知路由器自己所屬的組播組;
如果網(wǎng)段上同時(shí)有多臺(tái)組播路由器R1和R2(都啟用了PIM和IGMPv1),因?yàn)镮GMPv1沒(méi)有定義查詢器,查詢功能由PIM的DR負(fù)責(zé),每60s發(fā)送普遍組查詢報(bào)文;R1和R2在建立PIM鄰居時(shí),先比較DR優(yōu)先級(jí),若優(yōu)先級(jí)一樣,則IP地址大的路由器為PIM DR;
成員報(bào)告報(bào)文Report
組地址字段是D類(lèi)非224.0.0.X地址,發(fā)送成員報(bào)告報(bào)文的兩種情況:
(1)主機(jī)在加入組時(shí)會(huì)立即發(fā)送成員報(bào)告,告知路由器自己想要接收的組播數(shù)據(jù);
(2)收到普遍組查詢報(bào)文后,被動(dòng)響應(yīng)請(qǐng)求;
成員報(bào)告抑制機(jī)制
網(wǎng)段上存在同一組播組的多個(gè)接收主機(jī),主機(jī)接收到普遍組查詢報(bào)文后,啟動(dòng)定時(shí)器,定時(shí)器取值0-10s范圍內(nèi)的一個(gè)隨機(jī)值;
定時(shí)器最先超時(shí)的主機(jī)發(fā)送針對(duì)該組的成員報(bào)告報(bào)文;
其他主機(jī)收到后,成員報(bào)告報(bào)文會(huì)被抑制,可以減少網(wǎng)段上的流量。
當(dāng)主機(jī)主動(dòng)離開(kāi)組播組的時(shí)候,如用戶關(guān)掉正在觀看的發(fā)給組229.1.2.3的視頻或者當(dāng)主機(jī)突然離線時(shí),主機(jī)不會(huì)產(chǎn)生任何離開(kāi)組通知,組播路由器依然會(huì)轉(zhuǎn)發(fā)組播數(shù)據(jù)到該網(wǎng)段;
IGMPv1只有加組的成員報(bào)告報(bào)文和查詢報(bào)文,沒(méi)有定義組成員的離開(kāi)機(jī)制,只能依靠周期性發(fā)送普遍組查詢報(bào)文,如果3個(gè)查詢周期中沒(méi)有收到成員報(bào)告報(bào)文,則認(rèn)為成員不存在;
組成員關(guān)系超時(shí)時(shí)間默認(rèn)130s,IGMP查詢器在130s內(nèi)沒(méi)有收到任何指定組的成員報(bào)告報(bào)文,組播路由器刪除接口上指定組的對(duì)應(yīng)關(guān)系,組播數(shù)據(jù)不再轉(zhuǎn)發(fā)到該接口;
組成員關(guān)系超時(shí)時(shí)間計(jì)算方法,IGMP普遍組查詢報(bào)文間隔x健壯系數(shù)+最大查詢響應(yīng)時(shí)間;
igmp robust-count命令用來(lái)在接口上設(shè)置IGMP查詢器的健壯系數(shù),默認(rèn)值為2;
igmp timer query接口命令或timer query全局命令用來(lái)在查詢器路由器上設(shè)置普遍組查詢報(bào)文發(fā)送間隔,默認(rèn)值為60s,接口命令比全局命令優(yōu)先;
IGMPv1沒(méi)有查詢器選舉和組成員離開(kāi)機(jī)制,在IGMPv2中實(shí)現(xiàn);
二、IGMPv2
IGMPv2在IGMPv1基礎(chǔ)上添加了查詢器選舉和組成員離開(kāi)機(jī)制,除此以外其他機(jī)制和IGMPv1基本相似,IGMPv2變化如下:
1、查詢器選舉? ? 不依賴組播路由協(xié)議選舉查詢路由器;
2、離開(kāi)消息? ? ? ? 主機(jī)告知路由器離開(kāi)組播組
3、特定組查詢? ? ?只查詢指定組,而非查詢網(wǎng)段上所有組
4、最大響應(yīng)時(shí)間字段? ??
IGMPv2除了查詢報(bào)文(增加特定組查詢)、成員報(bào)告報(bào)文,還增加了成員離開(kāi)報(bào)文;

(1)Type字段
IGMPv2將IGMPv1的version和type字段合并成Type字段,不再定義version字段,Type報(bào)文類(lèi)型字段有以下四種取值:
0x11表示查詢報(bào)文,包括普遍組查詢報(bào)文和特定組查詢報(bào);
0x12表示IGMPv1成員報(bào)告報(bào)文;
0x16表示IGMPv2成員報(bào)告報(bào)文;
0x17表示成員離開(kāi)報(bào)文;
(2)Max Response Time字段
在普遍組查詢報(bào)文中,該字段默認(rèn)值為10s;
在特定組查詢報(bào)文中,該字段默認(rèn)值為1s;
(3)Checksum字段? ? IGMP報(bào)文的校驗(yàn)和;
(4)Group Address字段
普遍組查詢報(bào)文中,該字段設(shè)為全0;
特定組查詢報(bào)文中,該字段為要查詢的組播組地址;
在成員報(bào)告和離開(kāi)報(bào)文中,該字段為想要加入或離開(kāi)的組播組地址;
查詢報(bào)文
普遍組查詢和特定組查詢的組地址字段、最大響應(yīng)時(shí)間字段和報(bào)文頭目的地址不同;
1、普遍組查詢報(bào)文
普遍組查詢報(bào)文是查詢器周期性向共享網(wǎng)段所有主機(jī)及路由器以組播方式發(fā)送的查詢報(bào)文,用于查詢哪些組播組存在成員;
組地址字段為0.0.0.0,報(bào)文頭目的地址為224.0.0.1;
查詢器每60s發(fā)送查詢報(bào)文,初次成為查詢器時(shí),前2次報(bào)文間隔15s,其他間隔60s;
2、特定組查詢報(bào)文
特定組查詢報(bào)文是查詢器向網(wǎng)段上特定組播組成員發(fā)送的報(bào)文,用于查詢?cè)摻M播組是否存在成員;
組地址字段和報(bào)文頭目的地址字段都是想要查詢的組播組IP地址;
僅當(dāng)查詢器收到離組報(bào)文后,才發(fā)送特定組查詢報(bào)文;
報(bào)告報(bào)文
成員報(bào)告報(bào)文是主機(jī)向組播路由器發(fā)送的報(bào)告報(bào)文,用于加入某個(gè)組播組或者應(yīng)答查詢的響應(yīng)報(bào)文;
組地址字段和報(bào)文目的地址字段都是主機(jī)想要加入的組播組地址;
離開(kāi)報(bào)文
離開(kāi)報(bào)文是主機(jī)主動(dòng)離開(kāi)組播組時(shí)向組播路由器(224.0.0.2)發(fā)送的報(bào)文,用于宣告自己離開(kāi)了某個(gè)組播組;
組地址字段要離開(kāi)的組播組地址,報(bào)文目的地址為224.0.0.2;
查詢器選舉
接口IP地址最小的IGMPv2路由器將被選舉為查詢器;
如果非查詢器在其他IGMP查詢者的存活時(shí)間內(nèi),收不到查詢者發(fā)送的查詢報(bào)文,就認(rèn)為當(dāng)前查詢器R1已失效,從而重新發(fā)起查詢者選舉,并認(rèn)定自己是查詢者;
igmp timer other-querier-present接口命令或timer other-querier-present全局命令用來(lái)設(shè)置其他IGMP查詢器的存活時(shí)間,缺省情況下,其他ICMP查詢者的存活時(shí)間=健壯系數(shù)xIGMP普遍查詢報(bào)文發(fā)送間隔+(1/2)x最大查詢響應(yīng)時(shí)間,即125s;
igmp max-response-time命令在IGMPv2中用來(lái)調(diào)整最大響應(yīng)時(shí)間,最大值25s;
離開(kāi)機(jī)制
相比于IGMPv1,IGMPv2增加了一種離開(kāi)組報(bào)告,允許主機(jī)告訴路由器它要離開(kāi)組播組,這樣當(dāng)最后一個(gè)成員離開(kāi)組時(shí),離網(wǎng)延遲減少,路由器可以立即停止轉(zhuǎn)發(fā)組播報(bào)文到該網(wǎng)段;
但是由于路由器一般不記錄當(dāng)前網(wǎng)段有多少相應(yīng)組的組員,所以每收到一份離組報(bào)告,都會(huì)觸發(fā)查詢器發(fā)送特定組查詢報(bào)文,確認(rèn)是否還有其他成員;
如果該網(wǎng)段上還存在該組成員,主機(jī)收到特定組查詢報(bào)文后,會(huì)在報(bào)文指定的最大響應(yīng)時(shí)間內(nèi)發(fā)送成員報(bào)告報(bào)文,組播路由器收到后,將繼續(xù)維護(hù)該組成員關(guān)系;
如果該網(wǎng)段上不存在該組成員,查詢器將不會(huì)在Timer-Membership超時(shí)前,收到改組的成員報(bào)告報(bào)文,在Timer-Membership超時(shí)后,查詢器將刪除接口和該組的對(duì)應(yīng)關(guān)系;
Timer-Membership時(shí)長(zhǎng)=特定組查詢報(bào)文發(fā)送間隔x報(bào)文發(fā)送次數(shù);
使用igmp lastmember-queryinterval接口命令或lastmember-query interval全局命令配置發(fā)送IGMP特定組查詢報(bào)文的時(shí)間間隔,取值1-5,缺省1s;
使用igmp robust-count接口命令或robust-count全局命令配置查詢器在收到離組報(bào)文后,特定組查詢報(bào)文發(fā)送次數(shù);
IGMPv2中,組播組最后一個(gè)主機(jī)正常離開(kāi)時(shí),組播路由器在2s后,停止轉(zhuǎn)發(fā)組播流量;
但最后一個(gè)主機(jī)異常離線,則組播路由器在沒(méi)有收到離組報(bào)文的情況下,仍需要使用130s來(lái)判定有沒(méi)有必要再轉(zhuǎn)發(fā)流量到當(dāng)前網(wǎng)段;
三、IGMPv3
IGMPv3添加了對(duì)源過(guò)濾功能的支持,主機(jī)可以通告路由器僅接收來(lái)自特定源的組播流量;
IGMPv1及v2報(bào)告報(bào)文中僅通告加入的組播組,IGMPv3為實(shí)現(xiàn)組播源過(guò)濾功能,對(duì)成員報(bào)告報(bào)文做了修改,IGMPv3添加了一種能夠表達(dá)組和源的組記錄,通過(guò)三元組(組地址、過(guò)濾模式、源地址列表)來(lái)表達(dá)僅接收來(lái)自特定源的組播流量;
IGMPv1、v2的接口的數(shù)據(jù)結(jié)構(gòu)也相當(dāng)簡(jiǎn)單,IGMPv3開(kāi)始,接口開(kāi)始使用(組、過(guò)濾模式和組播源)這種表達(dá),每個(gè)接口維護(hù)組播組、組播源和過(guò)濾模式;
IGMPv3僅有兩種報(bào)文類(lèi)型:
(1)類(lèi)型為0x11的查詢報(bào)文;
(2)類(lèi)型為0x22的成員報(bào)告報(bào)文:
但出于兼容,支持并識(shí)別其他三種以前版本的報(bào)文:
(1)類(lèi)型為0x12的IGMPv1成員報(bào)告報(bào)文;
(2)類(lèi)型為0x16的IGMPv2成員報(bào)告報(bào)文;
(3)類(lèi)型為0x17的IGMPv2離開(kāi)組報(bào)文;
查詢報(bào)文

(1)Type
0x11代表查詢報(bào)文;
(2)Max Resp Code? ? 最大響應(yīng)時(shí)間
成員主機(jī)在收到普遍組查詢報(bào)文后,需要在最大響應(yīng)時(shí)間內(nèi)做出回應(yīng);
(3)Checksum
ICMP報(bào)文的校驗(yàn)和;
(4)Group Address
在普遍組查詢報(bào)文中,該字段設(shè)為0;
在特定組查詢報(bào)文和特定源組查詢報(bào)文中,該字段為要查詢的組播組地址;
(5)Resv? ? 保留字段
(6)S(suppress router-side processing)
該比特置1時(shí),收到此查詢報(bào)文的其他路由器不啟動(dòng)定時(shí)器刷新過(guò)程,但是此查詢報(bào)文并不一抑制查詢器選舉過(guò)程和路由器的主機(jī)側(cè)處理過(guò)程,默認(rèn)未置位;
(7)QRV(Querier’s Robustness Variable)
查詢器普遍查詢的健壯系數(shù),若該字段非0,非查詢器收到后調(diào)整為該值,缺省2;
(8)QQIC(Querier’s Robustness Variable)
查詢器普遍查詢的查詢間隔,若該字段非0,非查詢器收到后調(diào)整為該值,缺省60s;
(9)Number of Sources
組播源數(shù)量,對(duì)于普遍組查詢報(bào)文和特定組查詢報(bào)文,該字段為0;對(duì)于特定源組查詢報(bào)文,該字段非0;
(10)Source Address? ? 組播源地址,數(shù)量受Number of Sources字段限制;
IGMPv3查詢報(bào)文分為三種
(1)普遍組查詢報(bào)文 General Query
普遍組查詢報(bào)文是查詢器周期性向共享網(wǎng)段內(nèi)所有主機(jī)及路由器(224.0.0.1)以組播方式發(fā)送餓查詢報(bào)文,用于發(fā)現(xiàn)組播組成員并維護(hù)組播組與源列表的對(duì)應(yīng)關(guān)系;
組地址字段和Number of Sources字段都為0,報(bào)文目的地址為224.0.0.1;
(2)特定組查詢報(bào)文 Group-Specific Query
特定組查詢報(bào)文是查詢者向網(wǎng)段上特定組播組成員發(fā)送的報(bào)文,用于查詢?cè)摻M播組是否存在成員;
組播組字段和報(bào)文目的地址都是想要查詢的組播組IP地址,Number 0f Sources字段為0;
(3)特定組及源查詢報(bào)文? ? Group-and-Source-Specific Query
特定組查詢報(bào)文是查詢器向網(wǎng)段上特定組播組成員發(fā)送的報(bào)文,用于查詢?cè)摻M成員是否接收特定源發(fā)送的數(shù)據(jù);
組播組字段和報(bào)文目的地址都是想要查詢的組播組IP地址,Number of Sources字段非0,Source Address字段為該組播組的源列表;
成員報(bào)告報(bào)文
IGMPv1及v2報(bào)告報(bào)文中僅通告加入的組播組,IGMPv3為實(shí)現(xiàn)組播源過(guò)濾功能,對(duì)成員報(bào)告報(bào)文做了修改,IGMPv3添加了一種能夠表達(dá)組和源的組記錄,通過(guò)三元組(組地址、過(guò)濾模式、源地址列表)來(lái)表達(dá)僅接收來(lái)自特定源的組播流量;
IGMPv1/v2一份報(bào)告報(bào)文只能攜帶一個(gè)組播組,IGMPv3一份成員報(bào)告可攜帶多個(gè)組記錄,可同時(shí)通告多個(gè)組及源的對(duì)應(yīng);

(1)Type? ? 0x22代表IGMPv3的成員報(bào)告報(bào)文;
(2)Checksum? ? IGMP報(bào)文的校驗(yàn)和;
(3)Number of Group Records? ? 組記錄數(shù)量;
(4)Group Record
每個(gè)組記錄是一塊字域,通過(guò)三元組(組地址、過(guò)濾模式、源地址列表)來(lái)表達(dá)僅接收來(lái)自特定源的組播流量;
組記錄字域格式如下:

(1)Record Type? ? 有兩種記錄類(lèi)型,當(dāng)前狀態(tài)記錄和狀態(tài)變化記錄;
當(dāng)前狀態(tài)記錄包括MODE_IS_INCLUDE、MODE_IS_EXCLUDE;
狀態(tài)變化記錄包括過(guò)濾模式變化記錄、源列表變化記錄;
過(guò)濾模式變化記錄又包括CHANGE_TO_INCLUDE_MODE、CHANGE_TO_EXCLUDE_MODE;
源列表變化記錄又包括ALLOW_NEW_SOURCE、BLOCK_OLD_SOURCES;
(2)Aux Data Len? ? 目前未使用該字段;
(3)Number of Sources? ? 組播源數(shù)量
(4)Multicast Address? ? 組播組地址
(5)Source Address? ? 組播源地址
(6)Auxiliary Data? ? 目前沒(méi)有使用該字段;
六種記錄類(lèi)型如下:
(1)MODE_IS_INCLUDE
(2)MODE_IS_EXCLUDE
(3)CHANGE_TO_INCLUDE_MODE
表示過(guò)濾模式由EXCLUDE轉(zhuǎn)換到INCLUDE,開(kāi)始接收源地址列表包含的新組播源發(fā)往該組播組的數(shù)據(jù);如果源地址列表為空,主機(jī)將離開(kāi)組播組;
(4)CHANGE_TO_EXCLUDE_MODE
表示過(guò)濾模式由INCLUDE轉(zhuǎn)換到EXCLUDE,不接收源地址列表包含的新組播源發(fā)往該組播組的數(shù)據(jù);
(5)ALLOW_NEW_SOURCE
表示在現(xiàn)有基礎(chǔ)上,需要再接收源地址列表包含的組播源發(fā)往該組播組的組播數(shù)據(jù);
(6)BLOCK_OLD_SOURCES
表示在現(xiàn)有基礎(chǔ)上,不再接收源地址列表包含的組播源發(fā)往該組播組的組播數(shù)據(jù);
查詢響應(yīng)機(jī)制
IGMPv3中查詢響應(yīng)機(jī)制及查詢者的選舉機(jī)制與IGMPv1/v2相同;
加入機(jī)制
在IGMPv1/v2中,用戶加入到某組播組G后,能夠接收到所有組播源發(fā)往該組播組的數(shù)據(jù);
如果采用IGMPv3,用戶可以選擇僅接收特定組播源發(fā)送到給組播組的數(shù)據(jù);
組播路由器會(huì)在每個(gè)接口維護(hù)組播組、組播源和過(guò)濾模式;
如果多個(gè)接收者都發(fā)送加入報(bào)告,Report(G,IS_INCLUDE,(S1))和Report(G,IS_INCLUDE,(S2)),則路由器接口維護(hù)組對(duì)應(yīng)關(guān)系:G,過(guò)濾模式INCLUDE,源列表(S1,S2);
如果路由器收到多份加入同一個(gè)組的組記錄,只要有一個(gè)組記錄的類(lèi)型為EXCLUDE模式,路由器接口對(duì)應(yīng)的G組的過(guò)濾模式就是EXCLUDE,不論收到多少I(mǎi)NCLUDE模式組記錄;
離開(kāi)機(jī)制
在IGMPv2中添加的離開(kāi)組報(bào)文在IGMPv3中不再使用,IGMPv3主機(jī)會(huì)發(fā)送帶有特定含義組記錄的成員報(bào)告來(lái)表達(dá)離開(kāi)組播組或不希望再收到組播組中來(lái)自特定源的組播流;
離開(kāi)組播組
如果不希望收到組播組G的任意流量,主機(jī)發(fā)送(G,TO_IN,NULL);
當(dāng)查詢器接收到離開(kāi)某組播組的報(bào)告(G,TO_IN,NULL)時(shí),發(fā)送指定組查詢消息,判斷網(wǎng)段中是否還存在該組成員;
如果當(dāng)前網(wǎng)段上沒(méi)有其他組成員,修改接口的組和成員對(duì)應(yīng)關(guān)系,相應(yīng)接口被從相應(yīng)的組播路由表的下游接口移除;
如果當(dāng)前網(wǎng)絡(luò)仍有其他主機(jī)是該組的成員,則成員會(huì)響應(yīng)等(G,IS_IN,S1)當(dāng)前狀態(tài)報(bào)告;
不再接收組播組中來(lái)自特定源的組播流
當(dāng)查詢器接收到改變組播組與源列表對(duì)應(yīng)關(guān)系的報(bào)告(G,BLOCK_OLD_SOURCE,SOURCE),發(fā)送特定源組查詢報(bào)文,查詢特定組及源的的成員是否存在;
如果該源的組成員存在,將響應(yīng)成員報(bào)告報(bào)文;
如果沒(méi)有接收者響應(yīng),則在查詢兩次后,每次間隔1s,從源列表中移除該源;