12.1 IGMP概述
在组播网络中,IGMP(Internet Group management Protocol, 因特网组管理协议)运行在最后一跳路由器和组播接收者之间,主要功能为:路由器可通过IGMP协议发现直连链路中的组播成员,并会维护一个IGMP组表;组播接收者可以使用IGMP报文宣布自己加入组播组,终端想要加入一个组播组时,会在网络中发送一个IGMP报文,用以宣告自己加入组播组。
IGMP报文采用IP封装,IP头部的协议号为2,TTL字段为1,TTL值也就意味着IGMP报文只能在本地网段内传播。
12.2 IGMPv1
12.2.1 报文类型
成员关系查询(Menbership Query):IGMP查询器使用该报文查询直连网段中是否存在组播组成员,其中目的IP地址是224.0.0.1。
成员关系报告(Nembership Report):当组播组成员收到来自路由器的成员关系查询报文后,会用该报文回应,另外当终端想要加入组播组时,无需等待成员关系查询报文,会立即发送该报文。该报文的目的IP地址为终端所加入的或期望加入的组播IP地址,报文中数据载荷的组地址字段也会记录对应的组播IP地址。
IGMP报文格式:
版本:IGMPv1报文中此字段恒为1。
类型:为1时,为成员关系查询报文;为2时,为成员关系报告报文。
组地址:终端所加入的或期望加入的组播IP地址,在成员关系查询报文中此字段为0.0.0.0。
12.2.2 IGMPv1查询及响应
如上图所示,R1为组播路由器,GE0/0/1有三台加入组播组的PC。R1激活IGMPv1后,会以224.0.0.1为目的地址、60s为周期发送成员关系查询报文。三台PC因为都加入了对应的组播组,所以在收到成员关系查询报文后,会用成员关系报告报文作为回应,其中报文的目的地址和报文中的组地址字段被填充为本地所加入的组播组地址。
在组播网络中,组播接收者也会周期性的发送成员关系报告报文(周期为0-10s的随机数)。但对于R1来讲,它并不需要关注GE0/0/1端口下,同一个组播组中有多少成员,它需要关注的是在GE0/0/1端口下的组播接收者都加入了哪些组播组,以便在相应的组播组流量到达后,能准确的将流量转发给对应的接口。在上图的拓扑中,PC1和PC3发送的成员关系报告报文对于R1来讲是重复不必要的,所以在IGMPv1中,当PC1发送成员关系报告报文后,会被交换机泛洪,PC3收到后,发现和自己加入的组播组相同,它就会抑制自己的成员关系报告,这样就减少了网络中IGMP的流量。
12.2.3 IGMPv1组成员加入
当PC加入组播组时,无需等待成员关系查询报文,会立即发送成员关系报告报文,用以宣告自己加入哪个的组播组。路由器收到后,会将对应的组播组加入自己的IGMP组表项中。
12.2.4 IGMPv1组员离开
组播接收者默默的走掉即可,当路由器超过130s没有收到对于组播成员关系查询报文的回应后,会在IGMP组表项中,将此组播组删除,也就意味着路由器不会转发该组播组的数据。
12.2.5 IGMPv1查询器
上图中,一个网段连接了两台组播路由器,两台路由器都周期的向网段中发送成员关系查询报文,这显然是不合理的,同一网段中,只要有一台路由器周期性的发送成员关系查询报文足矣。所以当同一网段中的存在多个组播路由器时,会进行选举,胜出的为查询器,继续以缺省60s的周期发送成员关系查询报文,其他的非查询器会侦听成员关系查询报文,以便在查询器故障时接替查询器的工作。
IGMPv1中并没有定义查询器的选举机制,只能求助PIM这样的组播协议路由。例如当依赖于PIM时,PIM中选举产生的DR将会成为IGMPv1的查询器。