1.IGMPv1 工作机制
IGMPv1 主要基于查询和响应机制来完成对
组播组成员的管理。当一个
网段内有多台
组播路由器时,由于它们都能从
主机那里收到IGMP 成员关系报告
报文(Membership Report Message),因此只需要其中一台路由器发送IGMP查询
报文(Query Message)就足够了。这就需要有一个查询器(Querier)的选举机制来确定由哪台
路由器作为IGMP 查询器。对于IGMPv1 来说,由
组播路由协议(如PIM)选举出唯一的
组播信息转发者DR(Designated Router,
指定路由器)作为IGMP 查询器。
IGMPv1 没有专门定义离开
组播组的报文。当运行IGMPv1 的
主机离开某组播组时,将不会向其要离开的组播组发送报告
报文。当
网段中不再存在该
组播组的成员后,IGMP
路由器将收不到任何发往该组播组的报告
报文,于是IGMP 路由器在一段时间之后便删除该组播组所对应的组播转发项。
2.IGMPv2 的改进
与IGMPv1 相比,IGMPv2 增加了查询器选举机制和离开组机制。
1) 查询器选举机制
在IGMPv2 中,增加了独立的查询器选举机制,其选举过程如下:
(1) 所有IGMPv2
路由器在初始时都认为自己是查询器,并向本地网段内的所有
主机和路由器发送IGMP 普遍组查询(General Query)
报文(目的地址为:224.0.0.1);
(2) 本地网段中的其它IGMPv2
路由器在收到该
报文后,将报文的源IP 地址与自己的接口地址作比较。通过比较,IP 地址最小的
路由器将成为查询器,其它路由器成为非查询器(Non-Querier);
(3) 所有非查询器上都会启动一个定时器(即其它查询器存在时间定时器OtherQuerier Present Timer)。在该定时器超时前,如果收到了来自查询器的IGMP查询
报文,则重置该定时器;否则,就认为原查询器失效,并发起新的查询器选举过程。
2)离开组机制
在IGMPv1 中,
主机离开
组播组时不会向组播
路由器发出任何通知,导致组播
路由器只能依靠组播组成员查询的响应超时来获知组播组成员的离开。
(1) 该
主机向本地网段内的所有
组播路由器(目的地址为224.0.0.2)发送离开组(Leave Group)
报文;
(2) 当查询器收到该
报文后,向该
主机所声明要离开的那个
组播组发送特定组查询(Group-Specific Query)报文(目的地址字段和组地址字段均填充为所要查询的组播组地址);
(3) 如果该网段内还有该
组播组的其它成员,则这些成员在收到特定组查询
报文后,会在该报文中所设定的最大响应时间(Max Response Time)内发送成员关系报告报文;
(4) 如果在最大响应时间内收到了该
组播组其它成员发送的成员关系报告
报文,查询器就会继续维护该组播组的成员关系;否则,查询器将认为该
网段内已无该组播组的成员,于是不再维护这个组播组的成员关系。
3.IGMPv3 的改进
IGMPv3 在兼容和继承IGMPv1 和IGMPv2 的基础上,进一步增强了
主机的控制能力,并增强了查询和报告
报文的功能。
IGMPv3 增加了针对
组播源的过滤模式(INCLUDE/EXCLUDE),使
主机在加入某组播组G 的同时,能够明确要求接收或拒绝来自某特定组播源S 的组播信息。当
主机加入
组播组时:
若要求只接收来自指定
组播源如S1、S2、……的组播信息,则其报告
报文中可以标记为INCLUDE Sources(S1,S2,……);
若拒绝接收来自指定
组播源如S1、S2、……的组播信息,则其报告
报文中可以标记为EXCLUDE Sources(S1,S2,……)。
IGMPv3 不仅支持IGMPv1 的普遍组查询和IGMPv2 的特定组查询,而且还增加了对特定源组查询的支持:
z 普遍组查询
报文中,既不携带组地址,也不携带源地址;
z 特定组查询
报文中,携带组地址,但不携带源地址;
z 特定源组查询
报文中,既携带组地址,还携带一个或多个源地址。
IGMPv3 报告
报文的目的地址为224.0.0.22,可以携带一个或多个组记录。在每个组记录中,包含有
组播组地址和组播源地址列表。组记录可以分为多种类型,如下:
IS_IN:表示
组播组与组播源列表之间的过滤模式为INCLUDE,即只接收从指定组播源列表发往该组播组的组播数据。
IS_EX:表示
组播组与组播源列表之间的过滤模式为EXCLUDE,即只接收从指定组播源列表之外的组播源发往该组播组的组播数据。
z TO_IN:表示
组播组与组播源列表之间的过滤模式由EXCLUDE 转变为INCLUDE。
TO_EX:表示
组播组与组播源列表之间的过滤模式由INCLUDE 转变为EXCLUDE。
ALLOW:表示在现有状态的基础上,还希望从某些
组播源接收组播数据。如果当前的对应关系为INCLUDE,则向现有
组播源列表中添加这些组播源;如果当前的对应关系为EXCLUDE,则从现有
组播源列表中删除这些组播源。
BLOCK:表示在现有状态的基础上,不再希望从某些
组播源接收组播数据。如果当前的对应关系为INCLUDE,则从现有组播源列表中删除这些组播源;如果当前的对应关系为EXCLUDE,则向现有组播源列表中添加这些组播源。