IGMPV1基本原理
IGMP报文封装在IP报文中,IGMPv1报文有两种类型:
1.普遍组查询报文(GeneralQuery):查询器向共享网络上所有主机和路由器发送的查询报文,用于了解哪些组播组存在成员。
2.成员报告报文(Report):主机向组播路由器发送的报告消息,用于申请加入某个组播组或者应答查询报文。
IGMPv1工作机制:IGMPv1协议主要基于查询和响应机制完成组播组管理。当一个网段内有多个组播路由器时,只需要其中一台发送查询报文就足够了,此时需要选举出一个IGMP查询器。在IGMPv1中,由组播路由协议PIM选举出唯一的组播信息转发者(AssertWinner或DR,该部分内容后续介绍)作为IGMPv1的查询器,负责该网段的组成员关系查询。
普遍组查询和响应
组播网络中R1和R2连接主机网段,R1为查询器,在主机网段上有PC1、PC2、PC3三个接收者。假设PC1和PC2想要接收发往组播组G1的数据,PC3想要接收发往组播组G2的数据。普遍组查询和响应过程如下:
IGMP查询器(R1)发送普遍组查询报文,目的地址是224.0.0.1(表示同一网段内所有主机和路由器)。普遍组查询报文是周期性发送的,发送周期可以通过命令配置,缺省每隔60秒发送一次。
网段内所有主机都接收到该查询报文,PC1和PC2是组播组G1成员,则在本地启动定时器Timer-G1。PC3是组播组G2的成员,则在本地启动定时器Timer-G2。定时器的范围为0~10秒之间的随机值。
第一个定时器超时的主机发送针对该组的报告报文。PC1上的Timer-G1首先超时,向该网段发送目的地址为G1的报告报文。也想加入组G1的PC2侦听到此报告报文,则停止定时器Timer-G1,不再发送针对G1的报告报文。这样报告报文被抑制,可以减少网段上的流量。
PC3上的Timer-G2超时,向该网段发送报告报文,目的地址为G2。
路由器接收到报告报文后,了解到本网段内存在组播组G1和G2的成员,则由组播路由协议生成(*,G1)和(*,G2)组播转发项,“*”代表任意组播源。网络中一旦有组播组G1和G2的数据到达路由器,将向该网段转发。
新组成员加入
假设在网段上新接入一个主机PC4,想加入组播组G3,但是侦听到网段中没有G3的组播数据。则不等待普遍组查询报文的到来,立即发送针对G3的报告报文。路由器收到报告报文后,了解到本网段内出现了组播组G3的成员,则生成组播转发项(*,G3)。网络中一旦有G3的数据到达路由器,将向该网段转发。
组成员离开
IGMPv1没有专门定义离开组的报文。当主机离开组播组时,将不会再对普遍组查询报文做出回应。假设PC4退出组播组G3,当收到普遍组查询报文时,PC4不再发送针对G3的报告报文。由于网段上不存在组G3的其他成员,路由器不会收到G3的报告报文,则在一定时间(130秒,即组成员关系超时时间=IGMP普遍查询消息发送间隔× 健壮系数 + 最大查询响应时间)后,删除G3所对应的组播转发项。
IGMPV2基本原理
相比于IGMPv1,除了普遍组查询报文和成员报告报文之外,IGMPv2新增了两种报文:
1.特定组查询报文(Group-SpecificQuery):查询器向共享网段内指定组播组发送的查询报文,用于查询该组播组是否存在成员。
2.成员离开报文(Leave):成员离开组播组时主动向路由器发送的报文,用于宣告自己离开了某个组播组。
IGMPv2对普遍组查询报文格式也做了改进,添加了最大响应时间(MaxResponse Time)字段。此字段取值可以配置,用于控制成员的响应速度。
查询者选举:
IGMPv2使用独立的查询器选举机制,当共享网段上存在多个组播路由器时,IP地址最小的路由器成为查询器。而IGMPv1依赖于PIM等上层协议进行选举。
拓扑描述:
1.所有IGMPv2路由器在初始时都认为自己是查询器,向本地网段内的所有主机和路由器发送普遍组查询报文。
2.其他路由器在收到该报文后,将报文的源IP地址与自己的接口地址作比较。通过比较,IP地址最小的路由器将成为查询器,其他路由器成为非查询器(Non-Querier)。R1的接口地址小于R2,则R1当选为查询器。
3.所有非查询器上都会启动一个定时器(即其他查询器存在时间定时器OtherQuerier Present Timer,其他IGMP查询器的存活时间=健壮系数 × IGMP普遍查询消息发送间隔+(1/2)×最大查询响应时间。当健壮系数、IGMP普遍查询消息发送间隔和最大查询响应时间都取缺省值时,其他IGMP查询器的存活时间的值为125秒。)。在该定时器超时前,如果收到了来自查询器的查询报文,则重置该定时器;否则,就认为原查询器失效,并发起新的查询器选举过程。
离开组机制:
在IGMPv2中,主机PC3想离开组播组G2时,过程如下:
1.PC3向本地网段内的所有组播路由器(目的地址为224.0.0.2)发送针对组G2的离开报文。
2.查询器收到离开报文,会发送针对组G2的特定组查询报文。发送间隔和发送次数可以配置。缺省每隔1秒发送一次,一共发送两次。同时启动组成员关系定时器Timer-Membership=发送间隔x发送次数。
3.网段内不存在其他组G2的成员,则路由器不会收到针对组G2的报告报文,会在Timer-Membership超时后,删除(*,G)表项中对应的下游接口。组G2的数据再到达路由器时,将不会再向该网段转发。
4.如果网段内还有组G2的其他成员,则这些成员在收到特定组查询报文后,会在该报文中指定的最大响应时间内发送针对组G2的报告报文。路由器继续维护该组成员关系。
IGMPV3基本原理
IGMPv3主要是为了配合SSM(Source-SpecificMulticast)模型发展起来的,提供了在报文中携带组播源信息的能力,即能加入到指定源的组播组。
IGMPv3报文包含两大类:查询报文和报告报文。相较IGMPv2,其变化如下:
查询报文中除了普遍组查询和特定组查询,新增了特定源组查询报文(Group-and-Source-SpecificQuery)。该报文由查询器向共享网段内特定组播组成员发送,用于查询该组成员是否愿意接收特定源发送的数据。特定源组查询通过在报文中携带一个或多个组播源地址来达到这一目的。
报告报文不仅通知路由器主机要加入某组播组,并且可以指定只接收哪些组播源发往该组的数据。IGMPv3增加了针对组播源的过滤模式(INCLUDE/EXCLUDE),将组播组与源列表之间的对应关系简单的表示为(G,INCLUDE,(S1、S2...)),表示只接收来自指定组播源S1、S2……发往组G的数据;或(G,EXCLUDE,(S1、S2...)),表示接收除了组播源S1、S2……之外的组播源发给组G的数据,即S1、S2……在接收范围之外。
IGMPV3报告报文组记录
IS_IN:表示组播组与源列表之间的对应方式为INCLUDE,即接收从指定源列表发往该组播组的数据。
IS_EX:表示组播组与源列表之间的对应方式为EXCLUDE,即接收从指定源列表发往该组播组的数据。
TO_IN:表示组播组与源列表之间的对应方式由EXCLUDE转换到INCLUDE。如果这时指定源列表为空,则表示离开该组播组。
TO_EX:表示组播组与源列表之间的对应方式由INCLUDE转换到EXCLUDE。
ALLOW
表示在现有的基础上,还希望从某些组播源接收组播数据。如果当前对应关系为INCLUDE,则向现有源列表中添加某些组播源;如果当前对应关系为EXCLUDE,则从现有源列表中删除某些组播源。
表示在现有的基础上,不再希望从某些组播源接收组播数据。如果当前对应关系为INCLUDE,则从现有源列表中删除某些组播源;如果当前对应关系为EXCLUDE,则向现有源列表中添加某些组播源。
IGMPv3中一个成员报告报文可以携带多个组播组信息,而之前的版本一个成员报告只能携带一个组播组。这样在IGMPv3中报文数量大大减少。
IGMPv3没有定义专门的成员离开报文,成员离开通过特定类型的报告报文来传达。例如组225.1.1.1的成员想离开这个组,则会发送(225.1.1.1,TO_IN,(0))的报告报文。
IGMPV3工作机制:
如如果主机和路由器之间运行的是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。