IGMP是Internet Group Management Protocol的简称,又被称为互联网组管理协议,是TCP/IP协议族中负责IPv4组播成员管理
IGMP运行在主机与主机直接连接的组播路由器之间,用来建立、维护组播成员关系如下图所示:
1、IGMPv1报文解析
普遍组查询报文(General Query):查询器向共享网络上所有主机和路由器发送的查询报文,用于了解哪些组播组存在成员。成员报告报文(Report):主机向查询器发送的报告报文,用于申请加入某个组播组或者应答查询报文。Version:IGMPv1值为1;
Type:General Query普通组查询为0x1,Report成员报告报文为0x2;
Unused:发送时置0,接收时忽略;
Checksum:IGMP报文的校验和;
Group Address:组播组地址。在普遍组查询报文中,该字段设为0;在成员报告报文中,该字段为成员加入的组播组地址。
2、IGMPv1查询与响应机制
通过查询与响应,IGMP查询器可以了解到该网段内哪些组播组存在成员。
IGMP查询器周期性(缺省60s一次)发送目的地址为224.0.0.1(表示同一网段内所有主机和路由器)的普遍组查询报文;网络内所有的主机都能接收到该查询消息,如果某主机对任何组播组G感兴趣,则以组播方式发送成员报告报文,其中Group Address携带组播组G的地址,来宣告自己加入该组播组;经过查询与响应过程,IGMP路由器了解到本网络内存在组播组G对应的接收者,生成(*,G)组播表项,并依据此作为组播信息的转发依据。问题1,如果这个网络有2个或2个以上的组播路由器,谁来查询?
当一个网段内有多个组播路由器时,由于它们都可以接收到主机发送的成员报告报文,因此需要选取其中一台组播路由器发送查询报文就足够了,该组播路由器称为IGMP查询器(Querier).IGMP本身无法依靠报文选举,只能依靠上层协议替它选举。在IGMPv1中,由组播路由协议PIM得DR作为Querier。
问题2,PC1、PC2、PC3他们响应查询的report报文,目的组地址可以不同么?
收到IGMP普遍组查询报文后,被动响应请求,而告知组播路由器组活跃信息的报文,目标组地址字段可以不同,是D类非224.0.0.X地址。无论主机你加入到哪个组了,都要回复report报文告知,以便我查询器能了解到下面哪些主机处于哪个组。
问题3,假设这些主机加入的是同1个组,需不需要所有的主机都回复1个report报文?
IGMPv1中有个机制叫
3、IGMPv1主机加入组
加入组的过程就是主机主动报告的过程,不等普遍组查询报文过来,主动report声明加入;
例如主动发送针对G2的报告报文,IGMP查询器接收到HostC的报告报文后,了解到本网段内出现了组播组G2的成员,则生成组播转发项(*,G2).网络中一旦有G2的数据到达路由器,将向该网络段转发。
4、IGMPv1主机离开
IGMPv1没有专门定义离开组的报文。主机离开组播组后,便不会再对普遍组查询报文做出回应。
假设退出的主机所在组播组里还有成员
其他成员会向IGMP查询器回复report报文,因此主机的离开,查询器根本感知不到。
假设退出的主机所在组播组里没有成员
IGMP查询器不会收到该组播组的报告报文,则在一定时间(缺省值为130秒)后,删除所对应的组播转发表项。很显然,这期间组播流量继续转发,对网络是一种负担,所以这也是开发IGMPv2的主要原因。