IGMPv2的工作机制与IGMPv1大致相同,最大的不同点在于IGMPv2增加了离开组机制,当组成员主动离开组播组时,会主动发送成员离开报文告知查询器。查询器收到组成员发送出的组成员离开报文后,会连续发送特定组查询报文,询问该组播组中是否还存在组成员,如果一段时间内没有收到成员主机发送的报告报文,那么IGMP查询器将不再维护该组的组成员关系,IGMPv2可以使IGMP查询器及时了解到网段内哪些组播组已不存在成员,从而及时更新组播组信息,减少网络中不必要的组播流量。
IGMPv2报文与IGMPv1相比,IGMP新增了两种类型的报文:
- 成员离开报文(Leave):成员离开组播组时会主动向查询器发送该报文,告知查询器离开某个组播组。
- 特定组查询报文(Group-Specific Query):查询器向网段内指定组播组发送的查询报文,用户查询某个组播组中是否还有成员,与普遍组查询报文的区别在于,普遍组查询报文的组号是0.0.0.0,而特定组是针对某个组播组,所以他会是一个组播地址。
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Max Resp Time | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Group Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段 | 说明 |
Type | 0x11:表示查询报文,查询报文有两个子类型:
0x12:表示IGMPv1的成员报告报文 0x16:表示IGMPv2成员报告报文 0x17:表示组成员离开报文 |
Max Response Time | IGMPv2对普遍组查询报文做出了改进,添加了最大响应时间(Max Response Time),组成员收到查询报文后,要在最大响应时间内做出回应,通常是取一个小宇最大响应时间的随机值,该字段仅在查询报文中有效 |
Checksum | 校验和,在发送端计算出校验和之前,该字段为全0,当发送端计算出报文的校验和之后,必须将值插入该字段,接收端接收数据包时,必须在处理数据包内容前,完成对数据包的校验 |
Group Address |
|
IGMPv2工作机制
IGMPv2主要的工作方式增加了查询器选举机制,离开组机制,其他与IGMPv1一致。
以下图为例介绍IGMPv2的工作机制,在主机网段上有HostA,HostB,HostC三个接受者,假设HostA,HostB希望接受G1组播组的数据,HostC希望接受G2组播组的数据。
查询器选举机制
因为在同一广播域内,主机发出的报告报文,所有路由器都可以接收到,所以只需要一台路由器负责接收主机发出的报告报文与回应报告报文即可,这样可以节省很多带宽以及省略很多重复的数据包。
1.在初始化阶段,路由器都认为自己是查询器,向网段内所有主机,所有路由器发送普遍组查询报文。RouterA,RouterB收到对方发出的普遍组查询报文后,会将报文的源地址与自己的入接口地址做比较,通过比较IP地址最小的路由器将成为查询器,其他路由器将成为非查询器(Non-Querier)。所以RouterA的接口地址小于RouterB,所以RouterA将成为查询器,RouterB则成为非查询器。
2.之后,将由查询器(RouterA)向本网段内的所有主机和其他组播路由器发送普遍组查询报文,而非查询器则不再发送普遍组查询报文。
3.每个非查询器上会启动一个计时器(Ohter Querier Present Timer其他查询器存在时间定时器),在该定时器超时前,如果收到了来自查询器的查询报文,则重置定时器;否则,则认为原查询器失效,并发起新的查询器选举过程。
组离开机制
1.HostA向本地网段224.0.0.2(网段内所有路由器)发送G1组离开报文。
2.查询器收到离开报文之后,会发送针对G1的特定组查询报文,发送间隔和发送次数可以通过命令配置(默认为发送两个,每隔一一秒发送一个),同时查询器启动组成员关系定时器(Timer-Membership=发送间隔x发送次数)。
3.该网段内存在组G1的其他成员,这些成员在收到查询器发出的查询报文后,会立即发送针对G1组的成员报告报文以继续维护该组成员的关系,如果该网段内不存在G1的成员,查询器将不会收到针对G1组发出的成员报告报文,在Timter-Membership超时后,查询器将删除(*.G1)的对应IGMP组表项,当有组G1的组播数据到达查询器后,查询器将不会向下游转发。