IGMP(Internet Group Management Protocol)互联网组管理协议负责组播组成员注册管理的协议,用来在接收者主机和与其直接相邻的组播路由器之间建立和维护组播组成员关系;
主机通过IGMP直接通知本地组播路由器想要接收特定组的组播流量或不再接收特定组的组播流量;
组播路由器根据已知的组播组成员存在与否决定是否转发组播流量;
IGMP有三个版本:IGMPv1、IGMPv2和IGMPv3,基本区别如下:
IGMPv1定义了基本的组成员查询和报告机制;
IGMPv2添加了查询器选举和组成员离开机制;
IGMPv3可以指定接收或不接收指定组播源的流量;
一、IGMPv1
IGMPv1只有普遍组查询和成员报告两种报文;
主机通过成员报告报文,通知本地组播路由器希望加入哪个组播组;
路由器通过普遍组查询报文,周期性查询网段上是否仍有已知组成员存在;
1、version:IGMP版本,值为1;
2、Type:报文类型只有两种取值:
(1)0x1表示普遍组查询报文;
(2)0x2表示成员报告报文;
3、Checksum:IGMP报文的校验和;
4、Group Address:组播组地址;
(1)在普遍组查询报文中,该字段为0;
(2)在成员报告报文中,该字段为成员加入的组播组地址;
普遍组查询报文General-Query
普通组查询报文是组播路由器周期性(60s)向网段上所有主机及路由器(224.0.0.1)以组播形式发送的查询报文,查询报报文中组地址字段为0.0.0.0,代表查询的是任意组,本地网段上的所有路由器和主机都能识别和接收,任何组播组的成员都回应成员报告报文;
收到该报文的主机回应成员报告报文,告知路由器自己所属的组播组;
如果网段上同时有多台组播路由器R1和R2(都启用了PIM和IGMPv1),因为IGMPv1没有定义查询器,查询功能由PIM的DR负责,每60s发送普遍组查询报文;R1和R2在建立PIM邻居时,先比较DR优先级,若优先级一样,则IP地址大的路由器为PIM DR;
成员报告报文Report
组地址字段是D类非224.0.0.X地址,发送成员报告报文的两种情况:
(1)主机在加入组时会立即发送成员报告,告知路由器自己想要接收的组播数据;
(2)收到普遍组查询报文后,被动响应请求;
成员报告抑制机制
网段上存在同一组播组的多个接收主机,主机接收到普遍组查询报文后,启动定时器,定时器取值0-10s范围内的一个随机值;
定时器最先超时的主机发送针对该组的成员报告报文;
其他主机收到后,成员报告报文会被抑制,可以减少网段上的流量。
当主机主动离开组播组的时候,如用户关掉正在观看的发给组229.1.2.3的视频或者当主机突然离线时,主机不会产生任何离开组通知,组播路由器依然会转发组播数据到该网段;
IGMPv1只有加组的成员报告报文和查询报文,没有定义组成员的离开机制,只能依靠周期性发送普遍组查询报文,如果3个查询周期中没有收到成员报告报文,则认为成员不存在;
组成员关系超时时间默认130s,IGMP查询器在130s内没有收到任何指定组的成员报告报文,组播路由器删除接口上指定组的对应关系,组播数据不再转发到该接口;
组成员关系超时时间计算方法,IGMP普遍组查询报文间隔x健壮系数+最大查询响应时间;
igmp robust-count命令用来在接口上设置IGMP查询器的健壮系数,默认值为2;
igmp timer query接口命令或timer query全局命令用来在查询器路由器上设置普遍组查询报文发送间隔,默认值为60s,接口命令比全局命令优先;
IGMPv1没有查询器选举和组成员离开机制,在IGMPv2中实现;
二、IGMPv2
IGMPv2在IGMPv1基础上添加了查询器选举和组成员离开机制,除此以外其他机制和IGMPv1基本相似,IGMPv2变化如下:
1、查询器选举 不依赖组播路由协议选举查询路由器;
2、离开消息 主机告知路由器离开组播组
3、特定组查询 只查询指定组,而非查询网段上所有组
4、最大响应时间字段
IGMPv2除了查询报文(增加特定组查询)、成员报告报文,还增加了成员离开报文;
(1)Type字段
IGMPv2将IGMPv1的version和type字段合并成Type字段,不再定义version字段,Type报文类型字段有以下四种取值:
0x11表示查询报文,包括普遍组查询报文和特定组查询报;
0x12表示IGMPv1成员报告报文;
0x16表示IGMPv2成员报告报文;
0x17表示成员离开报文;
(2)Max Response Time字段
在普遍组查询报文中,该字段默认值为10s;
在特定组查询报文中,该字段默认值为1s;
(3)Checksum字段 IGMP报文的校验和;
(4)Group Address字段
普遍组查询报文中,该字段设为全0;
特定组查询报文中,该字段为要查询的组播组地址;
在成员报告和离开报文中,该字段为想要加入或离开的组播组地址;
查询报文
普遍组查询和特定组查询的组地址字段、最大响应时间字段和报文头目的地址不同;
1、普遍组查询报文
普遍组查询报文是查询器周期性向共享网段所有主机及路由器以组播方式发送的查询报文,用于查询哪些组播组存在成员;
组地址字段为0.0.0.0,报文头目的地址为224.0.0.1;
查询器每60s发送查询报文,初次成为查询器时,前2次报文间隔15s,其他间隔60s;
2、特定组查询报文
特定组查询报文是查询器向网段上特定组播组成员发送的报文,用于查询该组播组是否存在成员;
组地址字段和报文头目的地址字段都是想要查询的组播组IP地址;
仅当查询器收到离组报文后,才发送特定组查询报文;
报告报文
成员报告报文是主机向组播路由器发送的报告报文,用于加入某个组播组或者应答查询的响应报文;
组地址字段和报文目的地址字段都是主机想要加入的组播组地址;
离开报文
离开报文是主机主动离开组播组时向组播路由器(224.0.0.2)发送的报文,用于宣告自己离开了某个组播组;
组地址字段要离开的组播组地址,报文目的地址为224.0.0.2;
查询器选举
接口IP地址最小的IGMPv2路由器将被选举为查询器;
如果非查询器在其他IGMP查询者的存活时间内,收不到查询者发送的查询报文,就认为当前查询器R1已失效,从而重新发起查询者选举,并认定自己是查询者;
igmp timer other-querier-present接口命令或timer other-querier-present全局命令用来设置其他IGMP查询器的存活时间,缺省情况下,其他ICMP查询者的存活时间=健壮系数xIGMP普遍查询报文发送间隔+(1/2)x最大查询响应时间,即125s;
igmp max-response-time命令在IGMPv2中用来调整最大响应时间,最大值25s;
离开机制
相比于IGMPv1,IGMPv2增加了一种离开组报告,允许主机告诉路由器它要离开组播组,这样当最后一个成员离开组时,离网延迟减少,路由器可以立即停止转发组播报文到该网段;
但是由于路由器一般不记录当前网段有多少相应组的组员,所以每收到一份离组报告,都会触发查询器发送特定组查询报文,确认是否还有其他成员;
如果该网段上还存在该组成员,主机收到特定组查询报文后,会在报文指定的最大响应时间内发送成员报告报文,组播路由器收到后,将继续维护该组成员关系;
如果该网段上不存在该组成员,查询器将不会在Timer-Membership超时前,收到改组的成员报告报文,在Timer-Membership超时后,查询器将删除接口和该组的对应关系;
Timer-Membership时长=特定组查询报文发送间隔x报文发送次数;
使用igmp lastmember-queryinterval接口命令或lastmember-query interval全局命令配置发送IGMP特定组查询报文的时间间隔,取值1-5,缺省1s;
使用igmp robust-count接口命令或robust-count全局命令配置查询器在收到离组报文后,特定组查询报文发送次数;
IGMPv2中,组播组最后一个主机正常离开时,组播路由器在2s后,停止转发组播流量;
但最后一个主机异常离线,则组播路由器在没有收到离组报文的情况下,仍需要使用130s来判定有没有必要再转发流量到当前网段;
三、IGMPv3
IGMPv3添加了对源过滤功能的支持,主机可以通告路由器仅接收来自特定源的组播流量;
IGMPv1及v2报告报文中仅通告加入的组播组,IGMPv3为实现组播源过滤功能,对成员报告报文做了修改,IGMPv3添加了一种能够表达组和源的组记录,通过三元组(组地址、过滤模式、源地址列表)来表达仅接收来自特定源的组播流量;
IGMPv1、v2的接口的数据结构也相当简单,IGMPv3开始,接口开始使用(组、过滤模式和组播源)这种表达,每个接口维护组播组、组播源和过滤模式;
IGMPv3仅有两种报文类型:
(1)类型为0x11的查询报文;
(2)类型为0x22的成员报告报文:
但出于兼容,支持并识别其他三种以前版本的报文:
(1)类型为0x12的IGMPv1成员报告报文;
(2)类型为0x16的IGMPv2成员报告报文;
(3)类型为0x17的IGMPv2离开组报文;
查询报文
(1)Type
0x11代表查询报文;
(2)Max Resp Code 最大响应时间
成员主机在收到普遍组查询报文后,需要在最大响应时间内做出回应;
(3)Checksum
ICMP报文的校验和;
(4)Group Address
在普遍组查询报文中,该字段设为0;
在特定组查询报文和特定源组查询报文中,该字段为要查询的组播组地址;
(5)Resv 保留字段
(6)S(suppress router-side processing)
该比特置1时,收到此查询报文的其他路由器不启动定时器刷新过程,但是此查询报文并不一抑制查询器选举过程和路由器的主机侧处理过程,默认未置位;
(7)QRV(Querier’s Robustness Variable)
查询器普遍查询的健壮系数,若该字段非0,非查询器收到后调整为该值,缺省2;
(8)QQIC(Querier’s Robustness Variable)
查询器普遍查询的查询间隔,若该字段非0,非查询器收到后调整为该值,缺省60s;
(9)Number of Sources
组播源数量,对于普遍组查询报文和特定组查询报文,该字段为0;对于特定源组查询报文,该字段非0;
(10)Source Address 组播源地址,数量受Number of Sources字段限制;
IGMPv3查询报文分为三种
(1)普遍组查询报文 General Query
普遍组查询报文是查询器周期性向共享网段内所有主机及路由器(224.0.0.1)以组播方式发送饿查询报文,用于发现组播组成员并维护组播组与源列表的对应关系;
组地址字段和Number of Sources字段都为0,报文目的地址为224.0.0.1;
(2)特定组查询报文 Group-Specific Query
特定组查询报文是查询者向网段上特定组播组成员发送的报文,用于查询该组播组是否存在成员;
组播组字段和报文目的地址都是想要查询的组播组IP地址,Number 0f Sources字段为0;
(3)特定组及源查询报文 Group-and-Source-Specific Query
特定组查询报文是查询器向网段上特定组播组成员发送的报文,用于查询该组成员是否接收特定源发送的数据;
组播组字段和报文目的地址都是想要查询的组播组IP地址,Number of Sources字段非0,Source Address字段为该组播组的源列表;
成员报告报文
IGMPv1及v2报告报文中仅通告加入的组播组,IGMPv3为实现组播源过滤功能,对成员报告报文做了修改,IGMPv3添加了一种能够表达组和源的组记录,通过三元组(组地址、过滤模式、源地址列表)来表达仅接收来自特定源的组播流量;
IGMPv1/v2一份报告报文只能携带一个组播组,IGMPv3一份成员报告可携带多个组记录,可同时通告多个组及源的对应;
(1)Type 0x22代表IGMPv3的成员报告报文;
(2)Checksum IGMP报文的校验和;
(3)Number of Group Records 组记录数量;
(4)Group Record
每个组记录是一块字域,通过三元组(组地址、过滤模式、源地址列表)来表达仅接收来自特定源的组播流量;
组记录字域格式如下:
(1)Record Type 有两种记录类型,当前状态记录和状态变化记录;
当前状态记录包括MODE_IS_INCLUDE、MODE_IS_EXCLUDE;
状态变化记录包括过滤模式变化记录、源列表变化记录;
过滤模式变化记录又包括CHANGE_TO_INCLUDE_MODE、CHANGE_TO_EXCLUDE_MODE;
源列表变化记录又包括ALLOW_NEW_SOURCE、BLOCK_OLD_SOURCES;
(2)Aux Data Len 目前未使用该字段;
(3)Number of Sources 组播源数量
(4)Multicast Address 组播组地址
(5)Source Address 组播源地址
(6)Auxiliary Data 目前没有使用该字段;
六种记录类型如下:
(1)MODE_IS_INCLUDE
(2)MODE_IS_EXCLUDE
(3)CHANGE_TO_INCLUDE_MODE
表示过滤模式由EXCLUDE转换到INCLUDE,开始接收源地址列表包含的新组播源发往该组播组的数据;如果源地址列表为空,主机将离开组播组;
(4)CHANGE_TO_EXCLUDE_MODE
表示过滤模式由INCLUDE转换到EXCLUDE,不接收源地址列表包含的新组播源发往该组播组的数据;
(5)ALLOW_NEW_SOURCE
表示在现有基础上,需要再接收源地址列表包含的组播源发往该组播组的组播数据;
(6)BLOCK_OLD_SOURCES
表示在现有基础上,不再接收源地址列表包含的组播源发往该组播组的组播数据;
查询响应机制
IGMPv3中查询响应机制及查询者的选举机制与IGMPv1/v2相同;
加入机制
在IGMPv1/v2中,用户加入到某组播组G后,能够接收到所有组播源发往该组播组的数据;
如果采用IGMPv3,用户可以选择仅接收特定组播源发送到给组播组的数据;
组播路由器会在每个接口维护组播组、组播源和过滤模式;
如果多个接收者都发送加入报告,Report(G,IS_INCLUDE,(S1))和Report(G,IS_INCLUDE,(S2)),则路由器接口维护组对应关系:G,过滤模式INCLUDE,源列表(S1,S2);
如果路由器收到多份加入同一个组的组记录,只要有一个组记录的类型为EXCLUDE模式,路由器接口对应的G组的过滤模式就是EXCLUDE,不论收到多少INCLUDE模式组记录;
离开机制
在IGMPv2中添加的离开组报文在IGMPv3中不再使用,IGMPv3主机会发送带有特定含义组记录的成员报告来表达离开组播组或不希望再收到组播组中来自特定源的组播流;
离开组播组
如果不希望收到组播组G的任意流量,主机发送(G,TO_IN,NULL);
当查询器接收到离开某组播组的报告(G,TO_IN,NULL)时,发送指定组查询消息,判断网段中是否还存在该组成员;
如果当前网段上没有其他组成员,修改接口的组和成员对应关系,相应接口被从相应的组播路由表的下游接口移除;
如果当前网络仍有其他主机是该组的成员,则成员会响应等(G,IS_IN,S1)当前状态报告;
不再接收组播组中来自特定源的组播流
当查询器接收到改变组播组与源列表对应关系的报告(G,BLOCK_OLD_SOURCE,SOURCE),发送特定源组查询报文,查询特定组及源的的成员是否存在;
如果该源的组成员存在,将响应成员报告报文;
如果没有接收者响应,则在查询两次后,每次间隔1s,从源列表中移除该源;