IGMPv2

                                                                    IGMPv2

与IGMPv1比较

IGMPv2是IGMPv1的升级,又向下兼容IGMPv1,主要内容定义在RFC2236文档中。与IGMPv1相比较,IGMPv2主要有以下方面的改进:

1.      增加Leave消息。IGMPv1中主机是悄然离开组播组,而不会发出任何消息,路由器必须依靠Query响应的超时才能知道组中已经没有任何host。IGMPv2中增加了一种Leave消息,当组播组中的最后一个主机离开组时会主动发送一个Leave消息以通知路由器。

2.      增加了特定组的查询。在IGMPv1中,路由器发送的查询报文是针对该网段内所有的组播组。这种查询称为General Query。IGMPv2中增加了一种特定组查询(Group-Specific Query),这种报文的目的IP是需要查询的组的地址,报文中的组地址字段也是该组地址。当路由器收到一个Leave消息后会发出这种特定组查询报文,用来确认特定的组内还有没有主机。

3.      增加了最大响应时间字段。当路由器发出查询报文时,会在报文中指定host作出响应的最大时间。主机收到该报文后需要在指定时间内作出响应。

4.      新增同一个网段内查询路由器的选举机制。当同一个网段内有多个多播路由器时,IP地址最小的路由器作为查询路由器,由该路由器发出查询报文。

报文格式

报文格式如下:

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:IGMPv2共有4种消息类型

      1.      Membership Query  (Type = 0x11)

               这种查询消息又分为两种,一种是General Query,用于查询网段上的所有组的成员。另一种是Group-Specific Query,用于查询一个指定组。

      2.      Membership Report (Type = 0x16)

      3.      Leave Group (Type = 0x17)

      4.      Version 1 Membership Report (Type = 0x12)

               这种Report消息是为了兼容IGMPv1而增加的。

·  Max Response Time:这个字段只在Query消息中有意义,用于指定host的最大响应时间,单位是1/10秒。

·  Checksum:效验和

·  Group Address:在General Query中该字段被设置成0,在Group-Specific Query中该字段是需要查询的组的地址。在Report和Leave消息中该字段是报告或离开组的组地址。

协议内容

多播路由器通过IGMP来学习相连网段上有哪些组拥有host成员。在一个物理网段可能有不止一台多播路由器,这种情况下仅需一台路由器(Querier)周期性地向这个网段发送查询消息即可,其余的路由器(None-Querier)只需要关心host的Report响应和Leave消息。需要注意的是,Querier和None-Querier是针对路由器的接口而言的。当路由器的接口刚启动时,默认自己是Querier并发送General Query用来快速查询各组的主机成员情况。除了关注host的响应消息以外,该路由器还会监听这个网段上其它路由器发送的Query消息,如果收到一个从较小IP地址发送出来的的Query消息,该路由器就会将接口从Querier状态转为None-Querier状态。同时,该接口会启动一个定时器,如果在定时器超时前没有收到来自较小IP地址的Query消息,该接口就会把自己的状态重新置为Querier。这种机制使得同一个网段上IP地址最小的路由器接口担任周期性发送查询消息的角色,从而达到减轻主机和路由器的负担以及减少重复发送查询报文的目的。

与IGMPv1一样,路由器发出的General Query消息目的地也是224.0.0.1,消息内的组地址也是0。与IGMPv1不同的是Query消息中还指定了Max Response Time(默认是10秒)。当主机收到General Query后会为每个已加入的组分别启动一个延时定时器,这个timer的时长为0~Max Response Time中的任意值。当timer超时后主机发送Report作为响应,如果在timer超时前收到了其它主机发送的相同组的Report,则停止timer并不再发送Report。当主机刚加入一个组时,一般会主动发送两个或多个Report,而不是等路由器查询时再发送。

当路由器收到主机发送的Report后,会将报告的组加入其维护的组成员表中,并启动该组的成员定时器。下次再收到这个组的Report后就会重置该定时器。如果在该定时器超时后仍未收到这个组的Report消息,路由器就认为这个组内已没有本地主机成员了,于是停止向这个网段转发目的地是这个组地址的多播数据。

当一个主机准备离开某一个组时,如果这个主机是该组的最后一个成员,那么它应该发送Leave消息。如果这个主机不是该组的最后一个成员,它可以发送也可以不发送Leave消息。一般为了简化起见,每当host离开一个组时都发送Leave消息。Leave消息的目的地址是224.0.0.2(所有的多播路由器),因为其它的主机成员没必要知道有一台主机离开了组。主机为了了解自己是否是某个组的最后一个成员,它会为每个组维护一个定时器和一个成员状态,如果在定时器超时之前收到了其它主机发送的Report则认为该组还有其它的成员,如果定时器超时之前没有收到其它主机的Report,则认为其它主机都已经离开了组自己是最后一个成员了。

当一个Querier路由器收到host发送的Leave消息后会发送多个Group-Specific Query,以确定是否还有其它成员。如果在发出的最后一个Query超时之前还没有收到主机的Report,路由器就认为这个组已没有主机成员了。None-Querier路由器则应忽略Leave消息。

IGMPv2与IGMPv1的兼容

1.      当主机运行IGMPv2,Querier路由器运行IGMPv1时,主机应发送IGMPv1类型的Report消息作为Query的响应,当主机离开组时可以不发送Leave消息。

2.      当同一网段中有路由器运行IGMPv1也有路由器运行IGMPv2,这时Querier路由器应当运行IGMPv1模式。由于路由器没有一种机制来动态的了解网络中是否有IGMPv1的路由器,所以必须由网络管理员来配置Querier使其运行IGMPv1模式。

3.      当主机运行IGMPv1,路由器运行IGMPv2时,这种情况下路由器应当忽略这个组的Leave消息。

当同一网段中既有主机运行IGMPv1也有主机运行IGMPv2时,IGMPv2主机当收到IGMPv1 Report后应当像收到IGMPv2 Report一样不再发送自己的Report消息。

参考资料:

·RFC2236

你可能感兴趣的:(IGMPv2)