IGMP知识要点

IGMP概述
是主机和路由器间的“ 语言”
IP  protocol number 2
TTL=1
一般路由器发送IGMP查询,主机发送IGMP报告。
主机发送报告的时间具有一定的随机性(0~10秒的范围内随机选择),而路由器的查询则是周期性的。
当一个进程加入组时,主机就发送一个IGMP报告。
进程离开一个组时,主机根据版本发送报告(版本1,版本2发送)。
当检测到一个网段里面有其它的成员已经发送了报告了,其它主机就没有必要再发送报告了。
只要有一台主机在当前网段里,路由器就必须要发送主播信息到该网段。
必须是组成员,才可以接收组播数据。
发送者不必是组成员。
多播地址只能作为目标地址。
============================================
三种版本
IGMPv1(由RFC 1112 定义)
IGMPv2(由RFC 2236 定义)
IGMPv3(由RFC 3376 定义)

三种模型
ASM(Any-source Multicast) 任意信源组播
SSM(source-specific multicast) 指定信源组播
所有版本的IGMP 都支持ASM(Any-Source Multicast,任意信源组播)模型;IGMPv3 可以直接应用于SSM(Source-Specific Multicast,指定信源组播)模型,而IGMPv1 和IGMPv2 则需要在IGMP SSM Mapping 技术的支持下才能应用于SSM 模型。
============================================
IGMPv2的主机功能
主机使用IGMPv2有3类消息:
Membership Report消息
Version Membership Report消息
Leave Group消息
        Membership Report消息用于指示一台主机希望加入一个组,这个消息在一台主机第一次加入组时发送,有时也用来响应本地路由器发出的Membership Query消息。
        Membership Report消息IP包头里的目的地址是这个组的地址,为了保证本地的路由器能够收到Membership Report消息,主机在短时间内发出一个或两个复制的报告,在RFC2236中建议这个时间间隔为10s。
        如果主机在它的计时器超时前收到一个Membership Report消息,它将不再向这个组发送Membership Report消息。通过这种方法来节省网络资源。
        Version Membership Report消息是IGMPV2主机向后兼容的。IGMPV2用于检测和支持其子网中的IGMPV1主机和路由器。
        Leave Group消息是主机用来通知本地的路由器主机将退出该组。这个消息包含退出的组的地址。但与Membership Report消息不同的是,Leave Group消息是发向子网中所有路由器地址224.0.0.2的。是因为只有子网中的多播路由器需要知道主机已经退出,而其它组成员不需要知道。RFC2236推荐只在退出的成员为最后一个发出Membership Report消息来响应查询消息的主机时才发出Leave Group消息的。

IGMPv2的路由功能
路由器发送IGMP消息只有查询一种类型,在IGMPV2中,有两类查询:
General Query消息
Group-Specific Query消息
        General Query消息是路由器用来查询其连接的所有子网是否有组员存在。并在子网中没有组员时检测,查询默认的时间间隔为60s。General Query消息被发送到子网中所有系统224.0.0.1地址。如果一台路由器在3次查询时间间隔里没有收到一个特定子网中的Membership Report消息,那么这个路由器将宣布这个子网中没有组成员。
        Group-Specific Query消息,是当主机在正常情况下退出组时会发送一个Leave Group消息,当路由器收到Leave Group消息时,必须判断子网中是否有组员存在,为了达到这个目的,路由器发送一个Group-sperific Query消息,与Greneral Query消息不同的是,它包含组的地址,并且用组的地址作为目的地址。为了防止Group-Specific Query消息被丢弃或破坏,路由器会每隔1s分别发送两个Group-Specific Query消息。
        当支持多播的路由器首先在子网中被激活,它认为自己是查询者时,会马上发送General Query消息。
查询者是负责向子网发送所有General Query和Group-Specific Query消息的路由器,当子网中有多台路由器时,需要选举查询者,有较小IP地址的路由器成为查询者,所以子网中现有的路由器在收到新路由器的General Query消息后,就检查源地址。如果它的IP地址值更小,则会继续发送查询,当新的路由器收到其中一个查询,并发现这台路由器有较小的IP地址时,它就变成非查询者。
        如果非查询者在一段时间内没有收到查询者的查询,那么它认为查询者已经不存在了,并充当这个角色。
================================
IGMPv1
IGMPv1没有Leave Group消息
IGMPv1没有Group-Specfic Query消息
IGMPv1不在查询消息中规定最大响应时间
IGMPv1没有查询者选举的过程
在某些情况下,IGMPv1和IGMPv2可能同时存在一个子网中
某些组员运行IGMPv1,而另一些运行IGMPv2
某些组员运行IGMPv2,而路由器运行IGMPv1
路由器运行IGMPV2,而某些组员运行IGMPV1
一台路由器运行IGMPv1,而子网中的另一台路由器运行IGMPv2。
        如果同一子网中同时有版本1和版本2的成员,如果一个版本2成员听到路由器的查询,随后又收到同一组中版本1的Membership Report消息,那么它就不再发送自己的Membership Report消息。版本1的主机则忽略版本2的消息。
        如果一台主机运行版本2,而本地路由器运行版本1,那么IGMPv1路由器将忽略版本2的消息。所以版本2的主机收到版本1的查询后,将用版本1的Membership Report消息来进行响应。
        如果版本2的路由器收到版本1的Membership Report消息,它会将所有的组员按版本1对待。路由器忽略Leave Group消息,也不发送Group-Specific Query。
=============================================
IGMPv3
IGMPv3正在开发,IGMPv3中主要增加了Group-and-Source-Specific Query消息。它用来识别源地址。也对Membership Report和Leave Group消息进行了修改。
==========================================
Packet Format

===========================================================
IGMPv1消息格式

Version(版本):IGMP版本1。版本0在RFC-988中说明,它现在已经废弃。
Type(类型):有两种与主机相关的IGMP报文:
    1=主机成员请求
    2=主机成员报告
Unused(未用):未用字段,在发送时为零,接收时被忽略。
Group Address(组地址):主机成员请求报文在被发送时组地址字段为零,被接收时忽略该字段。主机成员报告报文中,组地址字段为被报告组的IP主机组地址。
=======================================================
IGMPv2消息格式

1..Type(类型) 有3种 IGMP 消息和主机与路由器的交互有关:
        Membership Query(成员关系查询)其值为0x11,用于多播路由器发现子网中的成员。其有两个成员关系查询的子类型,General Membership Query(一般查询),用于了解一个组中是否有成员在相邻的网络中,将组地址设置为0.0.0.0。Group-Specific Query(特定组查询),用于了解在相邻的网络中特定的组是否有成员,将组地址设置为要查询的组的地址。这两个消息由组地址进行区分,成员查询消息则类似于"Query"。
        Version 2 Membership Report(版本2成员关系报告)其值为0x16。用于告知路由器子网中至少有一个组员存在。
        Leave Group(离开组)其值为0x17,通知路由器其退出组。
        Version 1 Membership Report(版本 1 成员报告)其值为0x12。为了和IGMP v1兼容
2..最大的响应时间
        最大的响应时间域仅在成员关系查询中有效。规定了在发送一个回应报文时最大的允许时间,(其单位为1/10秒)。在所有其它的消息中,会由发送者置为0,而接收者则忽略该域。
        改变该设置可以允许IGMPv2 路由器调整离开延时"leave latency" (最后一个成员离开组的时刻和通知路由协议该处已不在存在成员时的这一段时间。)
3..校验和
        校验字是IGMP消息长度(IP包的整个有效负载)的16位检测。该域设为0,在计算校验字时将该域包在一起进行计算。当传送包的时候,必须计算该校验字并插入到该域中去。当接收包的时候,该校验字必须在处理该包之前进行检验。
4..组地址
        在General Query成员查询消息中,发送一个通常的查询时组地址域应设为0,当发送一个Group-Specific特定组查询时,则应设置组的地址。 在Membership Report成员报告或Leave Group离开组的消息中,组的地址域保留了要报告或要离开的地址。
5..其它域
        注意IGMP 消息可能会大于8个字节,尤其是将来向后兼容的IGMP版本。有一点必须注意,一个IGMPv2 的实现在处理包的时候必须忽略第一个8位字节。但是,IGMP的校验总是在整个IP的有效负载上进行计算的,而不是正好在首先的8字节上。
        组播路由器使用IGMP 来了解在他们所有的邻接物理网络上哪个组拥有成员。 组播路由器保留有一个组播组成员的列表,和一个针对每个成员的定时器。 "Multicast group memberships" 指在一个指定的邻接网络上至少有一个成员存在的组播组,而不是所有成员的列表。 考虑到其所有的邻接网络,一个组应该是两个角色中的一个:查询者或非查询者。在每个物理网络上仅能有一个查询者。在每个邻接的网络上,开始时所有的路由器都做为一个查询者。如果一个组播路由器从一个拥有低IP地址的路由器听到了查询消息,则在该网络上它必须作为一个非查询者。如果一个路由器没有从其他的路由器那听到查询消息(在查询周期内),则会继续做为一个查询者。 该路由器作为一个查询者周其性的在每个邻接的(查询周期)网络上发出通常的查询消息,请求得到成员信息。在开始时,路由器应该发送 [初始查询计数] 间隔短的一般查询消息,从而可以快速的可靠的确定成员信息。一般查询的组地址为0,发给所有系统的组播组 (224.0.0.1),有最大的查询响应时间 [Query Response Interval]。
当一个主机接收到了普通的查询,它会给每个组(有查询请求到达并有成员存在的端口,包括所有系统平台的组)都设一个延时定时器,每一个定时器都设为一个不同的随机值,该值由主机上所能有的最高时钟频率产生,范围从0,到查询包中所定义的最大响应时间。当一个主机接收到了一个特定组的查询,则会将延时定时器设为从0到最大响应时间的一个随机值。如果定时器已经运行了,则如果所要求的最大响应时间小于当前运行的定时值所剩部份时,重置该定时器。当组的定时器到时后,主机组播一个版本2的成员报告到该组中,其IP 中 TTL的值为1。如主机接收到了另一个主机的报告(版本为1或2),而其本身的定时器还没有到时,则它会停止其特定组的定时器,且不发送报告,这样就减少了重复的报告。
        当路由器接收到了报告,它就会把该组报告加入到一个组播组成员列表中,并且会为其成员关系设一个值为组成员生存周期的定时器 。重复的报告会导致该定时器的刷新。如果在定时器到时之前没有接收到一个特定组的报告,路由器则会假定没有本地的成员,它也不再需要在邻接的网络上为该组转发组播消息了。
        当一个主机加入了一个组播组,则应该立即发送一个非请求的版本2的成员关系报告给组,以防它是网络上该组的第一个成员。初始的成员报告可能会丢失或会受到损害,为了防止此种情况,推荐在短的间隔时间内报告一次或两次(非请求报告间隔)。(一种简单的方法可以解决该问题。即通过发送版本号为2的初始成员报告,就好象是从一个组接收到了特定组查询的消息一样,并设置适当的定时器)。
当一主机离开一个组播组,如果它是最后一个主机,除它外没有其它的机器来报告成员关系了,则它应该发送一条离开组的消息 给所有路由器,地址为组播组(224.0.0.2),如它并不是最后一个回答查询的主机,它可以不发送消息,就好象另一个在子网中的成员一样。这样也可以减少了一些数据流量。一个没有足够存储器的主机不能记住是否它是最后一个主机,它离开一个组时,它总是会发送一条离开组的消息。为了和早期的版本标准的兼容,路由器应接收该条离开组的消息。离开组消息发布给所有的路由器组,因为其它的组成员不必知道一个主机是否离开了该组,但它不会破坏该离开组的消息。
        当查询者在其接口上接收到了组成员离开组的消息之后,它发送 [最后成员查询计数 ] 特定组成员查询 消息[最后成员查询间隔] 给正离开的组。这些特定组查询有最大的响应时间(设为最后成员查询间隔)。如果在最后查询的响应时间之后,没有报告者接到消息,路由器则会假定该组没有本地的成员。在该时间内,任一个查询者到非查询者的传送都会忽略,一个路由器会继续发送特定组的查询。
对于接收端口上没有组成员时,非查询者必须忽略离开组的消息,而查询者则是应该忽略离开组的消息。当查询者接收发一个特定组查询消息,如果它的组成员定时器大于[最后成员查询计数] 消息中所定义的最大响应时间,它会将其组成员计数 为该值。
=====================================================
IGMP报文V3版本 :
RFC 3376
添加/删除源地址列表
添加了新API:IP Multicast Listen
需要新协议栈 / 重写应用程序
224.0.0.22 IGMP V3路由器
没有IGMP回应抑制
==============================================
加入组
这是版本1和版本2都支持的消息。
◆ 发送加入消息

====================================================
维护组
◆ 路由器查询发往224.0.0.1
◆ 一个成员发送回应(每台主机会产生一个随机计时器0-10秒,这样谁先发送,其他将被抑制) 
◆ 其它成员抑制回应

==========================================
查询者选取(版本2中)
◆ 最初所有路由器发送查询
◆ 最低IP地址路由器被选为查询者
◆ 其它路由器成为非查询者

========================================
离开组(版本1)
◆ 主机安静离开组(离开组之前不发送任何信息)
◆ 路由器发送3此查询无回应(3分钟左右),则超时。

================================
离开组(版本2)
◆ 主机发送离开报告
◆ 路由器发送查询无回应,则超时
◆ 约3秒钟


生存时间字段

  IGMP报告和查询的生存时间(TTL)均设置为1,这将使多播数据报仅限于同一子网内传送。更大的TTL值能被多播路由器转发。224.0.0.0-224.0.0.255的特殊地址使打算用于多播范围不超过1跳的应用,不管TTL是多少,多播路由器均不转发目的地址为这些地址中的任何一个地址的数据报。


所有主机组

  224.0.0.1地址称为所有主机组地址,它涉及在一个物理网络中所有具备多播能力的主机和路由器。当接口初始化后,所有具备多播能力接口上的主机均自动加入这个多播组。这个组的成员无需发送IGMP报告。

DF 负责转发流量
DR 负责注册

IGMPv1查询包里的组地址是0.0.0.0


 

原文地址:https://www.cnblogs.com/cyrusxx/p/12824109.html