IGMP是Internet Group Management Protocol的简称,又被称为互联网组管理协议,是TCP/IP协议族中负责IPv4组播成员管理的协议。IGMP用来在接收者主机和与其直接相邻的组播路由器之间建立和维护组播组成员关系。IGMP通过在接收者主机和组播路由器之间交互IGMP报文实现组成员管理功能,IGMP报文封装在IP报文中。
IP组播通信的特点是报文从一个源发出,被转发到一组特定的接收者。但在组播通信模型中,发送者不关注接收者的位置信息,只是将数据发送到约定的目的组播地址。要使组播报文最终能够到达接收者,需要某种机制使连接接收者网段的组播路由器能够了解到该网段存在哪些组播接收者,同时保证接收者可以加入相应的组播组中。IGMP就是用来在接收者主机和与其所在网段直接相邻的组播路由器之间建立、维护组播组成员关系的协议。
IGMPv1包括两种类型的报文:
字段 | 说明 |
---|---|
Version | IGMP版本,值为1。 |
Type | 报文类型。该字段有以下两种取值:0x11:表示普遍组查询报文。0x12:表示成员报告报文。 |
Unused | 在IGMPv1中,该字段在发送时被设为0,并在接收时被忽略。 |
Checksum | IGMP报文的校验和。校验和是IGMP报文长度(即IP报文的整个有效负载)的16位检测,表示IGMP信息补码之和的补码。Checksum字段在进行校验计算时设为0。当发送报文时,必须计算校验和并插入到Checksum字段中去。当接收报文时,校验和必须在处理该报文之前进行检验。 |
Group Address | 组播组地址。在普遍组查询报文中,该字段设为0;在成员报告报文中,该字段为成员加入的组播组地址。 |
IGMPv1协议主要基于查询和响应机制完成组播组管理。当一个网段内有多个组播路由器时,由于它们都可以接收到主机发送的成员报告报文,因此只需要选取其中一台组播路由器发送查询报文就足够了,该组播路由器称为IGMP查询器(Querier)。在IGMPv1中,由组播路由协议PIM选举出唯一的组播信息转发者(Assert Winner或DR)作为IGMPv1的查询器,负责该网段的组成员关系查询。
IGMPv1的工作机制可以分为:普遍组查询和响应机制、新成员加入机制和组成员离开机制三个方面。
通过普遍组查询和响应,IGMP查询器可以了解到该网段内哪些组播组存在成员。
如上图所示,普遍组查询和响应过程如下:
IGMP查询器发送目的地址为224.0.0.1(表示同一网段内所有主机和路由器)的普遍组查询报文;收到该查询报文的组成员启动定时器。
普遍组查询报文是周期性发送的,发送周期可以通过命令配置,缺省情况下每隔60秒发送一次。HostA和HostB是组播组G1的成员,则在本地启动定时器Timer-G1。缺省情况下,定时器的范围为0~10秒之间的随机值。
如上图,为v1的查询报文,类型为0x11,目的IP地址为224.0.0.1。源IP地址为自己接口的IP地址。在组播地址中,填充为0.0.0.0。
第一个定时器超时的组成员发送针对该组的报告报文。
假设HostA上的Timer-G1首先超时,HostA向该网段发送目的地址为G1的报告报文。也想加入组G1的HostB收到此报告报文,则停止定时器Timer-G1,不再发送针对G1的报告报文。这样报告报文被抑制,可以减少网段上的流量。
如上图,为主机向路由器发送的报告报文,类型值为0x12,源IP地址为自己主机的IP地址,目的IP地址为组播地址。
如上图所示,主机HostC加入组播组G2的过程如下:
IGMPv1没有专门定义离开组的报文。主机离开组播组后,便不会再对普遍组查询报文做出回应。
假设HostA想要退出组播组G1
HostA收到IGMP查询器发送的普遍组查询报文时,不再发送针对G1的报告报文。由于网段内还存在G1组成员HostB,HostB会向IGMP查询器发送针对G1的报告报文,因此IGMP查询器感知不到HostA的离开。
假设HostC想要退出组播组G2
HostC收到IGMP查询器发送的普遍组查询报文时,不再发送针对G2的报告报文。由于网段内不存在组G2的其他成员,IGMP查询器不会收到G2组成员的报告报文,则在一定时间(缺省值为130秒)后,删除G2所对应的组播转发表项。
IGMPv2的工作机制与IGMPv1基本相同,最大的不同之处在于IGMPv2增加了离开组机制。成员主机离开组播组时,会主动发送成员离开报文通知IGMP查询器;IGMP查询器收到成员离开报文后,会连续发送特定组查询报文,询问该组播组是否还存在组成员。如果在一段时间内没有收到成员主机发送的报告报文,IGMP查询器将不再维护该组的组成员关系。IGMPv2可以使IGMP查询器及时了解到网段内哪些组播组已不存在成员,从而及时更新组成员关系,减少网络中冗余的组播流量。
与IGMPv1相比,IGMPv2的变化如下:
字段解释:
Type:报文类型。该字段有以下四种取值:
Max Response Time:最大响应时间。
成员主机在收到IGMP查询器发送的普遍组查询报文后,需要在最大响应时间内做出回应。该字段仅在IGMP查询报文中有效。
Group Address:组播组地址。
在工作机制上,与IGMPv1相比,IGMPv2增加了查询器选举和离开组机制。
IGMPv2使用独立的查询器选举机制,当共享网段上存在多个组播路由器时,IP地址最小的路由器成为查询器。
如上图所示,在IGMPv2中,查询器的选举过程如下:
最初,所有运行IGMPv2的组播路由器(RouterA和RouterB)都认为自己是查询器,向本网段内的所有主机和组播路由器发送普遍组查询报文。
RouterA和RouterB在收到对方发送的普遍组查询报文后,将报文的源IP地址与自己的接口地址作比较。通过比较,IP地址最小的组播路由器将成为查询器,其他组播路由器成为非查询器(Non-Querier)。
此后,将由IGMP查询器(RouterA)向本网段内的所有主机和其他组播路由器发送普遍组查询报文,而非查询器(RouterB)则不再发送普遍组查询报文。
非查询器(RouterB)上都会启动一个定时器(即其他查询器存在时间定时器Other Querier Present Timer)。在该定时器超时前,如果收到了来自查询器的查询报文,则重置该定时器;否则,就认为原查询器失效,并发起新的查询器选举过程。
如上图所示,在IGMPv2中,主机HostA离开组播组G1的过程如下:
HostA向本地网段内的所有组播路由器(目的地址为224.0.0.2)发送针对组G1的离开报文。
查询器收到离开报文,会发送针对组G1的特定组查询报文。发送间隔和发送次数可以通过命令配置,缺省情况下每隔1秒发送一次,共发送两次。同时查询器启动组成员关系定时器(Timer-Membership=发送间隔x发送次数)。
该网段内还存在组G1的其他成员,这些成员在收到查询器发送的特定组查询报文后,会立即发送针对组G1的报告报文。查询器收到针对组G1的报告报文后将继续维护该组成员关系。
如果该网段内不存在组G1的其他成员,查询器将不会收到针对组G1的报告报文。在Timer-Membership超时后,查询器将删除(*,G1)对应的IGMP组表项。当有组G1的组播数据到达查询器时,查询器将不会向下游转发。
IGMPv3主要是为了配合SSM(Source-Specific Multicast)模型发展起来的,提供了在报文中携带组播源信息的能力,即主机可以对组播源进行选择。
与IGMPv2相比,IGMPv3报文的变化如下:
IGMPv3查询报文字段说明:
字段 | 说明 |
---|---|
Type | 报文类型,取值为0x11。 |
Max Response Code | 最大响应时间。成员主机在收到IGMP查询器发送的普遍组查询报文后,需要在最大响应时间内做出回应。 |
Checksum | IGMP报文的校验和。 |
Group Address | 组播组地址。在普遍组查询报文中,该字段设为0;在特定组查询报文和特定源组查询报文中,该字段为要查询的组播组地址。 |
Resv | 保留字段。发送报文时该字段设为0;接收报文时,对该字段不做处理。 |
S | 该比特位为1时,所有收到此查询报文的其他路由器不启动定时器刷新过程,但是此查询报文并不抑制查询器选举过程和路由器的主机侧处理过程。 |
QRV | 如果该字段非0,则表示查询器的健壮系数(Robustness Variable)。如果该字段为0,则表示查询器的健壮系数大于7。路由器接收到查询报文时,如果发现该字段非0,则将自己的健壮系数调整为该字段的值;如果发现该字段为0,则不做处理。 |
QQIC | IGMP查询器的查询间隔,单位为秒。非查询器收到查询报文时,如果发现该字段非0,则将自己的查询间隔参数调整为该字段的值;如果发现该字段为0,则不做处理。 |
Number of Sources | 报文中包含的组播源的数量。对于普遍组查询报文和特定组查询报文,该字段为0;对于特定源组查询报文,该字段非0。此参数的大小受到所在网络MTU大小的限制。 |
Source Address | 组播源地址,其数量受到Number of Sources字段值大小的限制。 |
字段解释信息:
字段 | 说明 |
---|---|
Type | 报文类型,取值为0x22。 |
Reserved | 保留字段。 |
Checksum | IGMP报文的校验和。 |
Number of Group Records | 报文中包含的组记录的数量。 |
Group Record | 组记录。 |
字段解释:
在工作机制上,与IGMPv2相比,IGMPv3增加了主机对组播源的选择能力。
IGMPv3的成员报告报文的目的地址为224.0.0.22(表示同一网段所有使能IGMPv3的路由器)。通过在报告报文中携带组记录,主机在加入组播组的同时,能够明确要求接收或不接收特定组播源发出的组播数据。
如果Host和组播路由器之间运行的是IGMPv1或IGMPv2,Host加入组播组G时无法对组播源进行选择,无论其是否需要,都会同时接收到来自组播源S1和S2的数据。如果采用IGMPv3,成员主机可以选择仅接收S1组播数据。
当接收到组成员发送的改变组播组与源列表的对应关系的报告时(比如CHANGE_TO_INCLUDE_MODE、CHANGE_TO_EXCLUDE_MODE),IGMP查询器会发送特定源组查询报文。如果组成员希望接收其中任意一个源的组播数据,将反馈报告报文。IGMP查询器根据反馈的组成员报告更新该组对应的源列表。
IGMPv1中定义了基本的组成员查询和报告过程,IGMPv2在此基础上添加了查询器选举和组成员离开的机制,IGMPv3中增加的主要功能是成员可以指定接收或指定不接收某些组播源的报文。三个版本在演进过程中对协议报文的处理是向前兼容的,因此尽管各个版本的协议报文格式不同,但是运行IGMP高版本的路由器可以识别低版本的IGMP报文。
所有IGMP版本都支持ASM(Any-Source Multicast)模型。IGMPv3可以直接应用于SSM(Source-Specific Multicast)模型,而IGMPv1和IGMPv2则需要IGMP SSM Mapping技术的支持才可以应用于SSM模型。
项目 | IGMPv1 | IGMPv2 | IGMPv3 |
---|---|---|---|
查询器选举方式 | 依靠组播路由协议PIM选举 | 同网段组播路由器之间竞争选举 | 同网段组播路由器之间竞争选举 |
普遍组查询报文 | 支持 | 支持 | 支持 |
成员报告报文 | 支持 | 支持 | 支持 |
特定组查询报文 | 不支持 | 支持 | 支持 |
成员离开报文 | 不支持 | 支持 | 没有定义专门的成员离开报文,成员离开通过特定类型的报告报文来传达 |
特定源组查询报文 | 不支持 | 不支持 | 支持 |
指定组播源 | 不支持 | 不支持 | 支持 |
可识别报文协议版本 | IGMPv1 | IGMPv1、IGMPv2 | IGMPv1、IGMPv2、IGMPv3 |
ASM模型 | 支持 | 支持 | 支持 |
SSM模型 | 需要IGMP SSM Mapping技术支持 | 需要IGMP SSM Mapping技术支持 | 支持 |
SSM(Source-Specific Multicast)称为指定源组播,要求路由器能了解成员主机加入组播组时所指定的组播源。如果成员主机上运行IGMPv3,可以在IGMPv3报告报文中直接指定组播源地址。但是某些情况下,成员主机只能运行IGMPv1或IGMPv2,为了使其也能够使用SSM服务,路由器上需要提供IGMP SSM Mapping功能。
IGMP SSM Mapping的机制是:通过在路由器上静态配置SSM地址的映射规则,将IGMPv1和IGMPv2报告报文中的(*, G)信息转化为对应的(G, INCLUDE, (S1, S2…))信息,以提供SSM组播服务。
IGMP Proxy,也称为IGMP代理,通常被部署在接入设备(RouterA)和成员主机之间的三层设备上,IGMP Proxy设备可以收集下游成员主机的IGMP报告/离开报文,将报告/离开报文汇聚后代理下游成员主机统一上送给接入设备;另一方面,IGMP Proxy设备也可以代理IGMP查询器向下游成员主机发送查询报文,维护组成员关系,基于组成员关系进行组播转发。在接入设备RouterA看来,RouterB就是一台主机;在下游成员主机看来,RouterB就是IGMP查询器。
IGMP代理设备实现的功能主要分为两种:主机行为和路由器行为。
主机行为
主机行为是指IGMP代理设备的上游接口收到查询报文时根据当前组播转发表的状态对查询报文做出响应,或者当组播转发表发生变化时上游接口主动向接入设备发送报告/离开报文。主机行为的工作机制如下:
IGMP代理设备上游接口收到查询报文时,会根据当前组播转发表的状态对查询报文做出响应。
IGMP代理设备收到某组播组的报告报文后,会在组播转发表中查找该组播组:
IGMP代理设备收到某组播组G的离开报文后,会向接收到该离开报文的接口发送一个特定组查询报文,检查该接口下是否还存在组播组G的其他成员:
路由器行为
路由器行为是指IGMP代理设备的下游接口通过成员主机加入/离开组播组的信息生成组播转发表项、接收接入设备下发的组播数据并根据组播转发表项的出接口信息向特定的接口转发组播数据。
为了提高链路的可靠性,IGMP代理设备的上游接口配置完IGMP Proxy功能后,可以再在IGMP代理设备上配置一个IGMP
Proxy备份接口,作为上游接口的备份,如下图所示。这样,当上游接口所在链路发生故障时,备份链路会自动接管IGMP代理业务,使业务能够自动恢复。
IGMP Proxy本身并没有检测机制,如果组播链路发生了故障,无法保证及时进行主、备链路的切换,可能造成较长时间的组播业务中断。通过IGMP Proxy与NQA联动可以解决此问题。IGMP Proxy与NQA测试例联动是利用NQA测试例检测端到端的链路状态,并根据NQA测试例的检测结果,进行主、备链路的切换,从而避免通信长时间中断。
接口上设置其他IGMP查询器的存活时间。
display igmp explicit-tracking
//查看使用Include模式加入特定源组的IGMPv3主机信息。
display igmp group
//查看通过主机发送报告报文动态加入的IGMP组播组信息。
display igmp group ssm-mapping
//查看根据SSM Mapping规则创建的组播组信息。
display igmp group static
//查看IGMP静态组播组的配置信息。
display igmp routing-table
//查看IGMP路由表信息。
display igmp ssm-mapping
//查看IGMP SSM Mapping的配置信息。
igmp
//进入IGMP视图。
igmp enable
//在接口上使能IGMP功能。
igmp global limit
//配置整个路由器上可以创建的所有IGMP表项的最大个数。
igmp group-policy
//在接口上设置IGMP组播组的过滤器,限制主机能够加入的组播组范围。
igmp ip-source-policy
//配置设备根据源地址对IGMP报告/离开报文进行过滤。
igmp lastmember-queryinterval interval
//在接口上配置IGMP查询器在收到主机发送的IGMP离开报文时,
//发送IGMP特定组\源组查询报文的时间间隔。
//缺省情况下,IGMP特定组\源组查询报文的发送时间间隔是1秒。
igmp max-response-time 10
//在接口上配置IGMP普遍组查询报文的最大响应时间。
//缺省情况下,IGMP普遍组查询报文的最大响应时间是10秒。
igmp on-demand
/*
配置IGMP On-Demand功能.
使查询器不主动发送查询报文,而是根据成员的要求来维护
成员关系。配置IGMP On-Demand功能后,接口上动态加
入的组播组永不超时。
*/
igmp prompt-leave
//在接口上配置组播组成员快速离开功能,
//即IGMP查询器在接收到成员主机发送的离开报文后不发送
//特定组查询报文,立即删除该组表项。
igmp proxy
//在接口上使能IGMP Proxy功能。
igmp proxy backup
//配置接口成为具有IGMP Proxy功能的备份接口。
igmp query ip-source-policy
//配置IGMP查询报文源地址过滤策略。
igmp send-router-alert
//在接口上配置发送的IGMP报文中包含Router-Alert选项。
igmp require-router-alert
//在接口上配置丢弃不包含Router-Alert选项的IGMP报文。
igmp robust-count 2
//在接口上设置IGMP查询器的健壮系数。
//缺省情况下,IGMP查询器的健壮系数是2。
igmp ssm-mapping enable
//在接口上使能SSM Mapping。
igmp static-group
//在接口上配置静态组播组。
igmp timer other-querier-present
//接口上设置其他IGMP查询器的存活时间。
//缺省时,其他IGMP查询器的存活时间的值为125秒。
//其他IGMP查询器的存活时间 = 健壮系数 × IGMP普遍查询报文发送间隔 +(1/2)× 最大查询响应时间。
igmp timer query 60
//在接口上配置IGMP普遍组查询报文的发送间隔。
igmp version
//在接口上配置运行的IGMP版本。
lastmember-queryinterval 1
//配置IGMP查询器在收到主机发送的IGMP离开报文时,
//发送IGMP特定组\源组查询报文的时间间隔。
//缺省情况下,IGMP特定组\源组查询报文的发送时间间隔是1秒。
max-response-time 10
//全局配置IGMP普遍组查询报文的最大响应时间。
proxy source-lifetime 210
//配置Proxy设备上生成(S,G)表项的超时时间。
//缺省情况下,Proxy设备上生成(S,G)表项的超时时间是210秒。
require-router-alert
//配置丢弃不包含Router-Alert选项的IGMP报文。
reset igmp control-message counters
//清除IGMP报文统计数。
reset igmp explicit-tracking
//删除接口上通过IGMP动态加入组播组的主机。
robust-count 2
//设置IGMP查询器的健壮系数。
send-router-alert
//指定设备发送的IGMP报文中包含Router-Alert选项。
ssm-mapping
//配置SSM Mapping的源组映射规则。
timer other-querier-present
//设置其他IGMP查询器存活时间。
timer query 60
//全局配置IGMP普遍组查询报文的发送间隔。
#IGMP学习笔记
查询者可以转发组播流量,通过这种方式可以避免组播流量的重复。为了保证组播可靠性,非查询者的路由器也会创建并维护组播组,同时非查询者需要监听查询者的存在,如果查询者在Hold timer时间内没有发送查询报文,非查询者会认为查询者已经故障,需要重新选举查询者。查询者会转发组播流量,同时每隔interval(60s)的时间发送查询报文。
参考文档:华为HedEx文档