IGMP的3各个版本及各自工作原理
IGMP(因特网组管理协议)是TCP/IP协议族中负责IP组播成员管理的一个子协议,用来在IP主机和与其直接相邻的组播路由器之间(不是应用于多个组播路由器之间)建立、维护组播组成员关系。IGMP消息封装在IP报文中,其IP的协议号为2。
IGMP有3个版本:IGMPv1(由RFC1112定义)、IGMPv2(由RFC2236定义)和IGMPv3(由RFC3376定义)。IGMPv1中定义了基本的组成员查询和报告过程,IGMPv2在此基础上添加了查询器选举和组成员离开的机制,IGMPv3中增加的主要功能是成员可以指定接收或指定不接收某些组播源的报文。
IGMP的3个版本是向前兼容的,运行IGMP高版本的路由器可以识别低版本的成员报告。所有3个版本的IGMP都支持ASM模型,IGMPv3可以直接应用于SSM模型。而IGMPv1和IGMPv2需要SSM-Mapping技术的支持。
IGMP工作机制:
● 接收者主机向所在的共享网络报告组成员关系。
● 查询器周期性地向该共享网段发送组成员查询消息。
● 接收者主机接收到查询消息后进行响应以报告组成员关系。
● 网段中的组播路由器依据接收到的响应来刷新组成员的存在信息。
在末端网络上使用的主机对路由器的信令机制,分为两个功能部分:主机侧和路由器侧。
IGMP工作机制如下所述:
1.接收者主机向所在的共享网络报告组成员关系。
2.处于同一网段的所有使能了IGMP功能的组播路由器选举出一台作为查询器(查询器在不同的版本中有不同的选举机制),查询器周期性地向该共享网段发送组成员查询消息。
3.接收者主机接收到该查询消息后进行响应以报告组成员关系。
4.网段中的组播路由器依据接收到的响应来刷新组成员的存在信息。如果超时无响应,组播路由器就认为网段中没有该组播组的成员,从而取消相应的组播数据转发。
所有参与组播传输的接收者主机必须应用IGMP协议。主机可以在任意时间、任意位置、成员总数不受限制地加入或退出组播组。
支持组播的路由器不需要也不可能保存所有主机的成员关系,它只是通过IGMP协议了解每个接口连接的网段上是否存在某个组播组的接收者,即组成员。而各主机只需要保存自己加入了哪些组播组。
从此体系结构中可以知道IGMP处于组播协议的最底层,是整个组播协议的基础。在组播协议中,只有IGMP协议直接与点播主机联系,运行IGMP的路由器负责管理组用户主机的加入、离开,通过维护用户数据,发送组播数据到主机。
一、IGMPv1工作原理
IGMPv1是最初的版本,主要基于查询和响应机制来完成对组播成员的管理。IGMPv1主机可以通过发送加入消息加入直接相连的组播路由器上特定的组播组,但离开时不会发送离开消息(Leave messages)。IGMPv1组播路由器使用基于超时的机制去发现其成员不关注的组。
IGMPv1报文有两种类型。
(1)普遍组查询报文(General Query):是查询器主动向共享网络上所有主机和路由器发送的查询报文,用于了解哪些组播组存在成员。
(2)成员报告报文(Report):是主机为了响应普遍查询报文而被动向组播路由器发送的,或者是主机主动向组播路由器发送的报告消息,用于应答普遍查询报文加入某个组播组,或者主动申请加入某个组播组。
IGMPv1协议主要基于查询/响应机制完成组播组管理。当一个网段内有多个组播路由器时,只需要其中一台发送查询报文就足够了,此时需要选举出一个IGMP查询器。在IGMPv1中,由组播路由协议PIM选举出唯一的组播信息转发者(Assert Winner或DR)作为IGMPv1的查询器,负责该网段的组成员关系查询。
IGMPv1报文格式如图所示,各字段表示如下:
● Version: IGMP版本标识,版本1为1。 IGMPv2的报文中没有该字段。
● Type:类型字段。表示IGMP报文类型。
● IGMPv1支持两种类型的报文:
☆ 成员关系查询(0x11):路由器周期性的发送成员关系查询报文去查询是否有组播成员。默认查询周期为60秒。
☆ 成员关系报告(0x12):成员关系报告用于表示主机想加入某个组播组。
☆ 成员关系报告的发送可以被动发送也可主动发送。
☆ 被动发送是指当主机收到成员关系查询消息后如果对某个组播组感兴趣想加入组播组时发送成员关系报告。
☆ 主动发送是指如果主机想加入某个组播组时,可以不用等待成员关系查询报文,而主动地发送成员关系报告。
● 组地址:不同类型的IGMP报文中组地址不同。
☆ 在成员关系报告报文中,组地址为某个特定的组播地址。
☆ 在成员关系查询报文中,组地址为0。
1、普遍组查询和响应机制
如上图(左图显示的是普遍查询报文的传递过程,右图显示的是成员报告报文的传递过程),组播网络中RouterA和RouterB连接主机网段,RouterA为查询器(由PIM路由器选举决定)。在主机网段上有HostA、HostB、HostC三个接收者。现假设HostA和HostB想要接收发往组播组G1的数据,HostC想要接收发送组播组G2的数据(均需要事先要经过相应配置)。普遍组查询和响应过程如下:
(1)IGMP查询器(RouterA)以目的地址224.0.0.1(这是一个永久组播地址,代表了同一网段内所有主机和路由器,相当于广播地址)向该网段中所有主机和路由器发送普遍组查询报文,以了解该网段中有哪些组播成员存在。普遍组查询报文是周期性发送的,发送周期可以通过命令配置,缺省60s发送一次。
(2)网段内所有主机和路由器都会接收到该查询报文,但只有已配置了对应组播组的成员才做出响应。为了避免多个成员主机同时发送响应的报告报文,在IGMP中规定,每个组播组会要求组播成员在发送报告报文前启动一个随机定时器(为0~10s),只有定时器超时后才会发送报告报文。因为HostA和HostB是组播组G1成员,所以均会在本地启动定时器Timer-G1;HostC是组播组G2的成员,同样会在本地启动定时器Timer-G2。
(3)当同一组播组中的第一个成员启动的定时器超时后,会以224.0.0.1为目的地址发送针对该组播组的报告报文,在该网段中所有主机和组播路由器(包括IGMP查询器)上都可以接收到该报文,但只有查询器才会做出相应的响应。现假设HostA上的Timer-G1首先超时,它会向该网段发送目的地址也为224.0.0.1的报告报文,此时想加入组G1的HostB也可以侦听到HostA发送的报告报文,则停止自己的定时器Timer-G1,不再发送针对G1的报告报文,这样做的目的可以减少网段上的流量。——也就是说,HostB也接受了HostA的报告报文,查询了其中的组地址字段,发现与自己的组播组相同,才停止定时器。
同样,HostC的Timer-G2超时后也会向该网段发送报告报文,目的地址也是224.0.0.1。
(4)路由器接收到报告报文后,了解到本网段内存在组播组G1和G2的成员(但不需要了解具体所有成员,只需要知道哪些组播组中有成员),然后由路由器上运行的PIM协议生成对应的两个组播转发表项——(*,G1)和(*,G2),“*”代表任意组播源。这样,网络中一旦有组播组G1和G2的数据到达组播路由器,则将向该网段的对应组播组中的所有成员主机转发。
2、新组成员加入
注意,这里所说的是有成员要加入新的组播组,而不是现有组播组中有新成员加入。
假设在网段上新接入一个主机HostD,想加入组播组G3(事先要通过配置),这是一个在PIM路由器还没建立的新的组播组。此时,该成员主机不会等待查询器的普遍组查询报文的到来,立即主动发送针对G3的报告报文(目的地址也为224.0.0.1)。查询器在收到报告报文后,了解到本网段内出现了新的组播组G3的成员,会由上层PIM协议生成新的组播转发表项——(*,G3)。这样,当网络中一旦有G3的数据到达该PIM路由器后将向该网段的对应组播组中的所有成员主机转发。——其实,这里用新组播组的加入更合适。
3、组成员离开
IGMPv1没有专门定义离开组的报文。当主机离开组播组时不会再对后续的普遍组查询报文做出回应,纯粹通过普遍组查询报文的最大响应定时器来确定某组播组中是否还有组播成员。假设上图中的HostC退出组播组G2,当收到普遍组查询报文时,HostC不再发送针对G2的报告报文进行响应。此时,由于网段上不存在组G2的其他成员,查询器永远不会收到G2的报告报文,会在一定时间(130s)后删除G2所对应的组播转发项。但是如果HostA退出组播组G1,则路由器不会感知到它的离开,因为G1中还有成员HostB,它会进行响应的。
再来一组示意图:
● 主机主动发送IGMP成员关系报告报文,表示想加入一个组播组中。
● 该报文中组地址为主机想加入的组播组的地址
● 1、IGMP查询器周期性地向共享网段内所有主机以组播方式(目的地址为224.0.0.1)发送成员关系查询消息(组地址为0)。
● 2、网络内所有主机都接收到该查询消息,如果某主机(如PC1、PC2和PC3)对任意组播组G感兴趣,则以组播方式发送“成员关系报告”报文(其中携带组播组G的地址)来宣告自己将加入该组播组。
● 3、经过查询/响应过程后,IGMP路由器了解到本网络内存在组播组G对应的接收者,生成(*,G)组播转发项。*表示组播组成员,G表示某个组播组。——这里的解释与前面的有点区别,*应该表示组播组的源。
● IGMP成员关系查询报文是目的地址是224.0.0.1,就是说网段内所有的设备都会接收到该查询报文。但并不是所有接收到该报文的主机都会响应查询请求的。只有一个主机会以成员关系报告报文响应,而其他主机则抑制成员关系报告的发送。
● 实际上主机收到IGMP成员关系查询时,会对它已经加入的每个组播组启动一个倒计数报告计时器。 V1中计时器值固定使用10秒。计时器到时的主机则主动发送成员关系报告,组地址为该组播组地址,目的地址为224.0.0.1。于是网段内其它主机都会收到该成员关系报告报文,接收到成员关系报告报文的主机抑制成员关系报告的发送,并删除计时器。
● 当路由器周期性的发送成员关系查询报文时,每个主机都会再次启动计时器进行查询/响应/抑制。
● 由于IGMPv1没有定义专门离开组播组的消息,因此主机离开组时是默默离开不发送任何报文。主要是基于查询无响应进而超时的思路实现的。
● 成员悄悄离开组播组,不发送任何报文。路由器依旧周期性的发送成员关系查询报文,周期为60秒,当路由器发送3次成员关系查询报文都没有收到响应的成员关系报告报文时,路由器认为组内已经没有成员,不再向该网段转发组播报文。
二、IGMPv2的改进
与IGMPv1相比,IGMPv2增加了独立的查询器选举机制(IGMPv1中的查询器是组播路由协议选举指定路由器(DR)当担查询器的)和离开组机制,包含了离开信息,允许迅速向组播路由协议(如PIM)报告组成员终止情况,这对高带宽组播或易变型组播组成员而言是非常重要的。
● IGMPv2报文与IGMPv1报文略有不同,取消了版本字段而相应增加了最大响应时间字段。
● IGMPv2报文中有三种报文类型:
● Type=0x11 成员关系查询报文,又分两种子类型:
☆ 常规查询:用于确定哪些组播组是有效的,即该组是否还有成员在使用,常规查询组地址全零;
☆ 特定查询:用于查询特定的组播组是否还有组成员。组地址为特定的组播地址。
● Type=0x16 IGMPv2组成员关系报告。
☆ 为了和IGMP v1兼容,还有另外的一个附加的消息类别:
☆ 0x12 = IGMPv1成员报告。
● Type=0x17 离开组消息,主机发送的离开报告
● 最大响应时间字段,仅用于组成员关系查询。表示主机响应查询返回报告的时间范围。 IGMPv1中没有该字段。
● 组地址字段:
☆ 发送常规查询时,组地址字段设置为零;
☆ 特定组查询时候,设置为要查询的组地址。
☆ 当主机成员发回组关系报告或是发送离开组消息时,本字段设置为目标组地址。
● 校验字是IGMP消息长度(IP包的整个有效负载)的16位检测。该域设为0。
IGMPv2新增的查询器选举机制和成员离开组机制:
1、查询器选举
IGMPv2使用独立的查询器选举机制,当共享网段上存在多个组播路由器时,IP地址最小的路由器成为查询器,当然这是由各个运行IGMP协议的路由器之间自动选举的,但可以通过IP地址设置间接指定查询器。下图中为两台IGMP路由器IGMP查询器的选举机制(左图为查询器选举初始状态下的普遍查询报文传递情况,右图为查询选举后的普遍查询报文传递情况)
(1)所有IGMPv2路由器在初始时都认为自己是查询器,向本地网段(本示例为10.10.1.0/24)内的所有主机和路由器发送普遍组查询报文。
(2)其他路由器在收到某路由器发来的普遍查询报文后,将报文的源IP地址与自己的接口地址作比较。通过比较,IP地址最小的路由器将成为查询器,其他路由器成为非查询器(Non-Querier)。本示例中,RouterA的接口地址小于RouterB,所以RouterA最终当选为查询器。
所有非查询器上都会启动一个定时器,即“其他查询器存在时间定时器”(Other Querier Present Timer)。在该定时器超时前,如果收到了来自查询器的查询报文,则重置该定时器;否则,就认为原查询器失效,并发起新的查询器选举过程。这就相当于像RIP、OSPF这些动态路由协议中用来决定邻居路由器是否有效的Hello定时器。
2、离开组机制
如上图,如果两路由器都运行了IGMPv2协议,现主机HostC想离开组播组G2,将会发生以下流程。
(1)在HostC离开组时向本地网段内所有组播路由器(目的地址为224.0.0.2,这是一个代表本网段内所有组播路由器的永久组播地址)发送一个离开组播组G2的报文。
(2)当查询器收到离开报文后,会发送针对组播组G2的特定组查询报文(注意这里不是“普遍组查询报文”),以查询本网段内是否还有其他组播组G2的成员。发送间隔和发送次数可以配置。缺省每隔1s发送一次,一共发送两次。同时启动组成员关系定时器Timer-Membership=发送间隔 X 发送次数。
(3)如果本网段内不存在其他组播组G2的成员,则路由器不会收到针对组播组G2的报告报文,这时会在Timer-Membership定时器超时后,删除(*,G2)表项。这样,粗播组G2的数据再到达路由器时,将不会再向该网段转发。
但在Timer-Membership定时器超时前有其他G2组播组成员以报告报文进行响应特定组查询报文,则表明该网段内还有组播组G2的其他成员,路由器继续维护该组成员关系。
● 当一个主机首次加入组播组时,主机立即发送成员关系报告报文。初始的成员报告可能会丢失或受到损害,推荐在短的间隔时间内报告一次或两次(推荐时间间隔为10秒)。
● IGMPv2主机也支持IGMPv1的策划那个圆关系报告报文。
● IGMPv2中增加了最大响应时间字段。前面介绍的主机收到成员关系查询报文时,会为每个已经加入的组播组启动一个计时器。计时器到期的主机才会发送IGMP成员关系报告报文来响应路由器的查询。在版本v2中该计时器的值为(1~最大响应时间)之间的一个随机值。
● IGMPv2版本增加最大响应时间字段,以动态地调整主机对组查询报文的响应时间。
● 在IGMPv1中,组播路由器发起的查询是针对该网段下的所有组播组,这种查询被称为普遍组查询。——报文的目的IP地址应该为224.0.0.1
● IGMPv2版本中,在普遍组查询之外增加了特定组的查询,这种查询报文的目的IP地址为某个组播组的IP地址,报文中的组地址字段也为该组播组的IP地址,网络中属于该组播组成员的主机才会进行相应,避免了属于其他组播组成员的主机发送响应报文。
● 对于一个网段上有多个组播路由器的共享网段,由于此网段下运行IGMP的路由器都能从主机那里收到成员关系报告消息,因此,只需要一个路由器发送成员资格查询消息,这就需要一个路由器选举机制来确定一个路由器作为查询器。
● 只有查询器才会发送成员关系查询报文。在IGMPv1版本中,查询器的选择由组播路由协议决定;
● IGMPv2版本对此做了改进,规定同一网段上有多个组播路由器时,具有最小IP地址的组播路由器被选举出来充当查询器。
● 路由器启动,主动发出到目的地(224.0.0.1)的IGMPv2常规查询信息。
● 收到常规查询信息的路由器,会把此信息的源IP地址和接收口的IP地址作比较,拥有最低IP地址的路由器被选举为IGMP查询路由器。
● 查询器也会有失效的时候,当查询器失效时,另一路由器成为查询器。所以非查询路由器会启动一个查询计时器,周期检查IGMP查询路由器的状态,缺省情况下120秒。该值可以通过命令 timer other-querier-present interval 修改。
● 在IGMPv1版本中,主机悄然离开组播组,不会向任何组播路由器发出任何通知。造成组播路由器只能依靠响应超时来获知组播成员的离开。而在v2版本中,当一个主机决定离开一个组播组时,它会向网络中所有组播路由器以组播方式(224.0.0.2)发送离开组的消息,为了明确该组播组中是否还包含其它成员主机,该组播路由器会向网络中发送特定组查询消息。在查询的最大响应时间内(默认为1秒)没有收到该组的报告,则再次发送特定组查询。 2次特定组查询后仍没有收到成员报告,则认为组播成员全部离开。
● 版本1路由器把IGMPv2报告看作无效的IGMP信息类型并且忽略它。当版本1路由器作为有效的IGMP查询器的时候,版本2的主机必须发送IGMPv1报告。
● 当版本2的主机检测出IGMP查询器是版本1的路由器时,它必须始终用IGMPv1报告做出响应。在这种情况下,版本2的主机也可以抑制发送离开组信息。为了维护本接口的状态,无论何时IGMPv1查询在接口处被收到,版本2主机会启动一个400秒的倒计时器,当另一个IGMPv1查询被收到时,计时器被复位。如果计时器计满,此接口恢复成为IGMPv2接口并且IGMPv2信息被再次发送。——就是使用v1版本的查询报文作为标记,不停的通知v2版本的主机,请发送v1版本的报告报文,超时未接到v1版本的查询报文,恢复发送v2版本的报告报文。
● 版本2主机必须允许它的成员关系报告被IGMPv1或IGMPv2成员关系报告抑制。——即这两种报文都能抑制主机的成员关系报告报文的发送。
● 如果某个版本2的路由器是IGMP查询器,同时在局域网中版本1的主机也是同一组成员,那么该组的IGMPv1报告总是被收到,因为IGMPv2报告在版本1的主机中不会引起报告抑制,版本1的主机不理解版本2的报告,因此忽略他们。——这里的抑制报文是指其他v2主机发送的报告报文,因为v1主机不能理解和接收这类报文,无法起到抑制作用。
● 无论何时,只要版本1的主机成为组成员, IGMPv2离开过程都将被搁置。——因为v1主机不能发送离开报文,所以路由器(查询器)只能使用超时机制确定组播组是否存在。
● 如果一些版本1的路由器存在于子网中,那么必须被强制性地为子网中的所有路由器配置IGMPv1以便正常使用。
三、IGMPv3的改进
IGMPv3在兼容和继承IGMPv1和IGMPv2的基础上进一步增强了主机的控制能力,支持指定组播源/组播组功能,即主机在加入某组播组G的同时能够明确地要求接收或不接收某特定组播源S发出的组播信息。这主要是为了配合SSM模型发展起来的,提供了在报文中携带组播源信息的能力,使组播成员能加入指定源的组播组。——主机不仅可以指定加入组播组,还可以指定组播源,这就是指定源组播功能,一个组播组中可能存在多个组播源,v3中可以指定接收特定的组播源。
如果主机仅需要获得某些特定源的信息,可以将IGMP报告中的Filter-Mode字段设置为Include模式,并在该报告中指定需要接收的组播源地址Sources,从而实现从指定源地址接收组播报文,鉴于描述方便可以表示为Include Sources(S1,S2, ……);
如果主机不想接收某些特定源的信息,则可以要求从除指定源外的所有其他源地址接收组播报文,在IGMP报告中标记为Exclude Sources(S1, S2, ……)。
1、IGMPv3报文
IGMPv3报文也包含两大类:查询报文和报告报文。相较IGMPv2,其变化如下。
(1)查询报文中除了普遍组查询和特定组查询,新增了特定源组查询报文(Group-and-Source-Specific Query)。该报文由查询器向共享网段内特定组播组成员发送,用于查询该组成员是否愿意接收特定组播源发送的数据。特定源组查询通过在报文中携带一个或多个组播源地址来达到这一目的。
(2)报告报文不仅通知路由器要加入某组播组,并且可以指定只接收哪些组播源发往该组的数据。IGMPv3增加了针对组播源的过滤模式(INCLUDE/EXCLUDE),将组播组与源列表之间的对应关系简单地表示为(G,INCLUDE,(S1,S2……)),表示只接收来笼子指定组播源S1、S2……发往组G的数据;或(G,EXCLUDE,(S1、S2……)),表示接收除了组播源S1、S2……之外的组播源发给组G的数据,即S1、S2……在接收范围之外。
(3)当组播组与组播源列表的对应关系发生了变化,在组播成员发给查询器的IGMPv3报告报文的组记录(Group Record)字段中做出相应变化。组记录有6种类型:
在IGMPv3中一个成员报告报文可以携带多个组播组信息(之前的IGMP版本一个成员报告只能携带一个组播组),所以在IGMPv3组播中的报文数量会大大减少。
IGMPv3没有定义专门的成员离开报文,成员离开通过特定类型的报告报文来传达。例如组225.1.1.1的成员想离开这个组,则会发送(225.1.1.1,TO_IN,(0))的报告报文,通过清空里面的指定组播源来预示要离开对应的组播组。
2、IGMPv3工作机制
在工作机制上,与IGMPv2相比,IGMPv3增加了主机对组播源的选择能力,包括特定源组加入和特定源组查询两方面。
(1)特定源组加入
IGMPv3的成员报告报文的目的地址为224.0.0.22(代表同一网段所有使能IGMPv3的路由器,也是一个永久组播地址)。通过在报告报文中携带组记录,主机在加入组播组的同时能够明确要求接收,或不接收特定组播源发出的组播数据。如下图所示,网络中存在S1和S2两个组播源,均向组播组G发送组播数据,但Host仅希望接收从组播源S1发往组播组G的信息。
如果主机和路由器之间运行的是IGMPv1或IGMPv2,Host加入组播组G时无法对组播源进行选择,无论其是否需要,都会同时接收到来自组播源S1和S2的数据。但如果运行的是IGMPv3,Host可以选择仅接收S1组播数据。具体有以下两种方法:
①Host发送IGMPv3报告(G,IS_IN,(S1)),明确指定仅接收组播源S1向组播组G发送的数据。这种方法最彻底,不受后面新增组播源的影响,均只接收来自S1的数据。
②Host发送IGMPv3报告(G,IS_EX,(S2)),明确排除不接收指定源S2向组播组G发送的数据,这样一来就间接的预示着仅接收来自S1的组播数据。这种方法不彻底,因为如果网络中有新增的组播要向组播组G发送数据时仍不能被排除。
(2)特定源组查询
当查询器接收到改变组播组与组播源列表的对应关系的报告时(如表12-3的后4种报告报文),会向组播成员发送特定源组查询报文。如果组播成员希望接收其中任意一个源的组播数据,将反馈报告报文。路由器根据反馈的组成员报告更新该组对应的源列表。
IGMPv3包含查询报文和报告报文两种不同格式的报文。
IGMPv3查询报文格式
字段 | 长度 | 描述 |
Type | 8比特 | 成员关系查询 Type = 0x11。 |
Max Resp Code | 8比特 | 设备接收到查询消息后发出响应报文的最大延迟时间,超过该时间没有发出响应报文,则查询设备认为此次查询超时,单位是1/10秒。 |
Checksum | 16比特 | IGMP消息的校验和。传送报文时,必须计算校验和并填入该字段中;接收报文时,必须在处理报文之前检验校验和,以判断IGMP消息在传输过程中是否发生了错误。 |
Group Address | 32比特 | 对于普遍组查询消息,该字段置0。对于特定组查询消息、特定组/源查询消息,该字段为设置为欲查询的组播组的地址。 |
Resv | 4比特 | 保留字段,发送报文时置0;接收到报文时,对该字段不做任何处理。 |
S | 1比特 | 该比特位置1时,所有收到此查询消息的其他路由器不启动定时器刷新过程,但是此查询消息并不抑制查询器选举过程和路由器的主机侧处理过程。 |
QRV | 3比特 | 查询者的健壮变量,如果不为0,QRV中包含中一个被查询者使用的[健壮变量]的值,如果查询者的健壮变量的值超过7,即QRV字段的最大值,那么QRV被设成0。路由器取最近收到的查询中的QRV值作为它们自己的健壮性变量的值,除非最近收到的QRV是0,在这种情况下,接收者使用缺省的健壮性变量值,或者是一个静态配置的值。 |
QQIC | 8比特 | 查询器的查询间隔,单位是秒。非查询器收到查询报文时,如果发现该字段非0,则将自己的查询间隔参数调整为该字段的值。 |
Number of Sources (N) | 16比特 | 消息中包含的组播源的数量。对于普遍组查询报文和特定组查询报文,该字段为0;对于特定组/源地址查询报文,该字段非0。此参数的大小受到所在网络MTU大小的限制。 |
Source Address [i] | 32比特 | 组播源地址,其数量受到Number of Sources字段值大小的限制。 |
查询消息有三种类型的变体:
1、“普通查询”由多播路由器发出,用于获知邻接接口(即查询所传输的网络中所相连的接口)的完整的多播接收状态。在一个普通查询中,组地址字段和源数量(N)字段都为0。
2、“指定组查询”由一台多播路由器发出,用于获知邻接接口中跟某一个IP地址相关的多播接收状态。在指定组查询中,“组地址”字段含有需要查询的那个组地址,源数量(N)字段为0。
3、“指定组和源查询”由一台多播路由器发出,用于获知邻接接口是否需要接收来自指定的这些源的,发往指定组的多播数据报。在一个指定组和源的查询中,组地址字段含有要查询的多播地址,源地址[i]字段含有相关的源地址。
成员报告消息的格式:
成员报告消息是主机向组播路由器发送的报告消息,用报告加入某组播组并只接收由指定组播源发往该组的数据。
封装该消息的IP报文头的目的地址字段为224.0.0.22,本地网段上的所有IGMPv3路由器都能识别并接收。
Group Record字段格式:
字段 | 长度 | 描述 |
Type | 8比特 | Type = 0x22成员关系报告 |
Reserved | 8比特 | 保留字段,在发送的时候是以0填充,在接收的时候是不作任何处理的。 |
Checksum | 16比特 | 校验和是对整个IGMP消息以16位为一段进行取反求和。为了计算校验和,校验和字段首先必须被置0。当收到一个数据,在处理之前,必须先对校验和进行验证。 |
Reserved | 16比特 | T保留字段,在发送的时候是以0填充,在接收的时候是不作任何处理的。 |
Number of Group Records (M) | 16比特 | 该字段表示该报告报文中包含有几个组记录。 |
Group Record | 变长 | 一个主机可能需要点播多个组播地址的组播业务,每个记录包含了对应于其中一个组播地址的源地址列表等信息,它受到Number_of_Group_Records的大小的影响。 每一个组记录字段是一整块数据,其含有的信息是关于发送者在报告发送接口上的某一个多播组的成员关系。 |
Record Type | 8比特 | Group Record消息的类型。
|
Aux Data Len | 8比特 | 辅助数据长度含有在组记录中的辅助数据的实际长度,其单位是32bit字。它有可能是0,这就表示辅助数据不存在。 |
Number of Sources (N) | 16比特 | 源数量(N)字段标明在组记录中存在多少源地址。 |
Multicast Address | 32比特 | 多播地址字段标明该组记录从属的多播IP地址。 |
Source Address [i] | 32比特 | 源地址[i]字段是一个数组,含有n个单播地址。n就是该记录的源数量(N)字段的值。 |
Additional Data | 变长 | 附加数据。如果收到的报告中的IP首部的数据报长度字段标明在最后一个组记录后面有附加的数据存在。IGMPv3的实现必须在计算和验证校验和的时候包含这些附加数据,但是同时必须忽略这些附加数据。当发送一个报告时,一个IGMPv3的实现在最后一个组记录后面不能包含附加数据。 |
● IGMPv1和v2版本的响应消息和查询消息具有相同的报文结构,即报文中仅包含组地址信息。 IGMPv3响应消息包含的组地址为224.0.0.22,其中可以携带1个或多个组记录,在每个组记录中,包含组播组地址、数目不等的源地址信息。组记录可以分为多种类型,如:
● 当前状态记录:报告了接口的当前接收状态,分为Include和Exclude两种状态类型。 Include表示包含指定源地址列表, Exclude表示包含除指定源地址列表外的所有源地址。
● 过滤模式改变记录:报告接口接收状态从Include状态切换到Exclude状态,或从Exclude状态切换到Include状态。
● 源地址列表改变记录:报告新源地址加入,或删除某源地址。
● IGMPv3不仅支持IGMPv1版本的普遍组查询,支持IGMPv2版本的特定组查询,而且支持IGMPv3版本的指定源/组查询。在IGMP消息中携带组播源地址和多种控制字段(如查询器的强壮性系数、查询间隔等)。对于普遍组查询,既不携带组地址,也不携带源地址;对于特定组查询,携带组地址,但是不携带源地址;对于指定源/组查询,既携带组地址,而且还携带1个或多个源地址信息。
四、IGMP SSM Mapping
SSM要求路由器能了解成员主机加入组播组时所指定的组播源。如果成员主机上运行IGMPv3,可以在IGMPv3报告报文中直接指定组播源地址。但是某些情况下,用户主机只能运行IGMPv1或IGMPv2,为了使其也能够使用SSM服务,路由器上需要提供IGMP SSM Mapping功能。但是IGMP SSM Mapping不处理IGMPv3的报告报文。
SSM Mapping的机制是:通过在路由器上静态配置SSM地址的映射规则,将IGMPv1和IGMPv2报告报文中的(*,G)信息转化为对应的(S,G)信息,以提供SSM组播服务。缺省情况下,SSM组播组的组播IP地址范围为232.0.0.0~232.255.255.255。
配置了SSM Mapping规则后,当路由器收到来自成员主机的IGMPv1或IGMPv2报告报文时,首先检查该报文中所携带的组播组地址G,然后根据检查结果的不同分别进行处理:
(1)如果G在ASM(Any-SourceMulticast,任意源组播)范围内,则只提供ASM服务。
(2)如果G在SSM组地址范围内,而路由器上又没有G对应的SSM Mapping规则,则无法提供SSM服务,丢弃该报文。
(3)如果G在SSM组地址范围内,路由器上有G对应的SSMMapping规则,则依据规则将报告报文中所包含的(*,G)信息映射为(S,G)信息,提供SSM服务。
如下图,在SSM网络中HostA运行IGMPv3、HostB运行IGMPv2、HostC运行IGMPv1,且HostB和HostC无法升级到IGMPv3。如果要为该网段中的所有主机提供SSM服务,需要在Router上使用IGMP SSM Mapping。
假如在Router上配置以下4个组播组(均为SSM组播IP地址)和组播源的映射关系:
●232.0.0.0/8——>10.10.1.1
●232.1.0.0/16——>10.10.2.2
●232.1.0.0/16——>10.10.3.3
●232.1.1.0/24——>10.10.4.4
经过映射后,Router收到HostB和HostC的成员报告报文时,首先判断报文携带的组播组IP地址是否在SSM范围内,结果发现是在SSM范围内,然后根据配置的映射规则生成如表12-4所示的组播表项。如果一个组地址映射了多个源,则生成多个(S,G)表项。在映射过程中,一个组播组地址只要能在规则中匹配到一个组播源地址,就会生成一条相应的表项。如HostB的报告报文中携带的组播组IP地址为232.1.2.2,从前面的组播组和组播源映射中可以看出,这样一个组播组IP地址可以分别与10.10.1.1、10.10.2.2和10.10.3.3匹配,因为IP地址232.1.2.2可以是232.0.0.0/8中的一个地址,也可以是232.1.0.0/16中的一个地址(它又与10.10.2.2和10.10.3.3这两个组播源进行了映射),但不可能是232.1.1.0/24中的一个IP地址(因为第三个八位不可能一样),所以组播组地址232.1.2.2最终有3条表项。同理,组播组地址232.1.1.1最终有4条表项。
五、IGMP典型应用
IGMP运行在成员主机和与其直连的组播路由器上,负责组播组成员关系的管理和维护。同时,为了将组播源的数据顺利转发到接收者,组播路由器之间需要运行组播路由协议PIM来建立转发路径。下图为IGMP的典型应用组网图。