组织:中国互动出版网(http://www.china-pub.com/) RFC文档中文翻译计划(http://www.china-pub.com/compters/emook/aboutemook.htm) E-mail:ouyang@china-pub.com 译者:周海燕(z_d_qx z_d_qx@263.net) 译文发布时间:2001-4-2 版权:本中文翻译文档版权归中国互动出版网所有。可以用于非商业用途自由转载,但必须保留本文档的翻译及版权信息。 网络工作组 W. Fenner RFC: 2236    Xerox PARC 更新: 1112 November 1997 类别 : 标准调试 RFC 2236 Internet组管理协议,版本2 (RFC 2236 Internet Group Management Protocol, Version 2) 备忘录: 该文档为Internet团体定义了Internet标准检测协议,并要求对其进行讨论以求进一步的改进。该协议的标准及其请参考当前的“Internet 商业协议标准("Internet Official Protocol Standards" )(STD 1). 该备忘录可以任意发布。 版权声明 版权保留归Internet Society (1997)所有. 摘要: 该备忘文档IGMPv2,归IP 主机使用,并向路由器报告他们的组播成员关系。它对STD 5, RFC 1112进行了升级. IGMPv2 允许组中成员的退出可以迅速报告给路由协议,这一点对于高带宽的组播组以及其子网中成员关系的动态调整尤为重要。 该文档是Internet工程技术组织一个域内组播的技术标准。如有任何注释应向idmr@cs.ucl.ac.uk邮件列表或其作者提出。 目录 1. 关键字定义 3 2. 介绍 3 2.1. 类型 3 2.2. 最大的响应时间 4 2.3. 校验字 4 2.4. 组地址 4 2.5. 其它域: 4 3. 协议描述 4 4. 与 IGMPv1 路由器的兼容 性 6 5. 和IGMPv1 主机的兼容性 6 6. 主机状态报文 6 7. 路由器状态报文 9 8. 定时器表和默认值 13 8.1. 健壮性变量 13 8.2. 查询周期 13 8.3. 查询响应周期 13 8.4. 组成员周期 13 8.5. 其它的查询存在周期 14 8.6. 初始查询周期 14 8.7. 初始查询周期 14 8.8. 最后的成员查询周期 14 8.9. 最后成员计数 14 8.10. 非请求报告周期 14 8.11. 版本1路由器存在超时 14 9. 消息目的地 15 11. 致谢 16 12. 参考 16 13. 附录 I - 基于IGMPv1的改变 16 14. 作者地址 17 15. 版权声明 17 1. 关键字定义 关键字"MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" 均在RFC 2119 [RFC 2119]有详细说明。 2. 介绍 Internet组管理协议 (IGMP)在IP主机上应用,并向任一个邻近的路由器报告他们的组播成员关系。该备忘录仅描述了 IGMP 在主机和路由器之间如何确定 其组成员关系, 在此路由器和组播成员主机的行为相近。IGMP 也用于两个路由器之间,但不在此进行讨论。 和ICMP一样, IGMP 也是IP的一个组成部分。要求在所有想接收IP组播的主机都进行实现。IGMP消息封装在IP报文中,其IP的协议号为2。 所有在该文档中说明了的IGMP 消息均会用TTL为1进行传递 ,并在IP头中包括了IP 路由检测选项 [RFC 2113] 。 所有和主机相关 的IGMP 消息见下: 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 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2.1. 类型 有3种 IGMP 消息和主机与路由器的交互有关: 0x11 = 成员关系查询 有两个成员关系查询的子类型: - 一般查询,用于了解一个组中是否有成员在相邻的网络中。 - 特定组查询,用于了解在相邻的网络中特定的组是否有成员。 这两个消息由组地址进行区分,详见第 1。4章。成员查询消息则类似于"Query"。 0x16 = 版本 2 成员关系报告。 0x17 = 离开组 为了和IGMP v1兼容,还有另外的一个附加的消息类别: 0x12 = 版本 1 成员报告。 该文档中的成员关系报告实指“报告”。当没有定义版 本号时,则同时适用于两个版本。一个不能识别的消息类型应将其忽略。新的消息类型会用新版本的IGMP,组播路由协议或其它的用途来使用。 2.2. 最大的响应时间 最大的响 应时间域仅在成员关系查询中有效。规定了在发送一个回应报文时最大的允许时间,(其单位为1/10秒)。在所有其它的消息中,会由发 送者置为0,而接收者则忽略该域。 改变该设置可以允许IGMPv2 路由器调 整离开延时"leave latency" (最后一个成员离开组的时 刻和通知路由协议该处已不在存在成员时的这一段时间。),详见第7.8节。 也允许调整子网上的IGMP 的突发流量,详见第 7.3节。 2.3. 校验字 校验字是IGMP消息长度(IP包的整个有效负载)的16位检测。该域设为0,在计算校验字时将该域包在一起进行计算。当传送包的时候,必须计算该校验字并插入到该域中去。当接收包的时候,该校验字必须在处理该包之前进行检验。 2.4. 组地址 在成员查询消息中,发送一个通常的查询时组地址域应设为0,当发送一个特定组查询时,则应设置组的地址。 在成员报告或离开组的消息中,组的地址域保留了要报告或要离开的地址。 2.5. 其它域: 注意IGMP 消息可能会大于8个字节,尤其是将来向后兼容的IGMP版本。有 一点必须注意,一个IGMPv2 的实现在处理包的时候必须忽略第一个8位字节。但是,IGMP的校验总是在整个IP的有效负载上进行计算的,而不是正好在首先的8字节上。 3. 协议描述 注意:定时器的数值将在该文档的后面进行描述。定时器和计数器的名字都写在方括号中。术语"interface" 有时会用于该文档中,(如果一个路由器在一个网络上有多个物理接口.)意思是说"邻接网络的主接口". 主机, 另一方面来说,需要在所有的的成员加入的接口上来实他们的功能。 组播路由器使用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),如它并不是最后一个回答查询的主机,它可以不发送消息,就好象另一个在子网中的成员一样。这样也可以减少了一些数据流量。一个没有足够存储器的主机不能记住是否它是最后一个主机,它离开一个组时,它总是会发送一条离开组的消息。为了和早期的版本标准的兼容,路由器应接收该条离开组的消息。离开组消息发布给所有的路由器组,因为其它的组成员不必知道一个主机是否离开了该组,但它不会破坏该离开组的消息。 当查询者在其接口上接收到了组成员离开组的消息之后,它发送 [最后成员查询计数 ] 特定组成员查询 消息[最后成员查询间隔] 给正离开的组。这些特定组查询有最大的响应时间(设为最后成员查询间隔)。如果在最后查询的响应时间之后,没有报告者接到消息,路由器则会假定该组没有本地的成员。在该时间内,任一个查询者到非查询者的传送都会忽略,一个路由器会继续发送特定组的查询。 对于接收端口上没有组成员时,非查询者必须忽略离开组的消息,而查询者则是应该忽略离开组的消息。当查询者接收发一个特定组查询消息,如果它的组成员定时器大于[最后成员查询计数] 消息中所定义的最大响应时间,它会将其组成员计数 为该值。 4. 与 IGMPv1 路由器的兼容 性 在一个路由器没有升级到IGMPv2的子网上,IGMPv2 主机可能会被取代。如下的请求为IGMPv1 路由器会发送正常的查询消息,其响应时间设为0。这必须理解为数值100(为10秒钟点)。 IGMPv1 路由器期望版本1 的成员报告对应于它的查询,而不会注意版本2的成员报告。因此,对于每个接口都必须保留一个状态变量,描述在接口中的组播查询者是运行的IGMPv1还是IGMPv2。 该变量必须由在最后几秒内是否听到IGMPv1 查询来决定。并必须用来决定用什么类型的成员报告来发送非请求的成员报 告以及对查询响应的成员报告。 一个IGMPv2 主机可以减少使用IGMPv1查询者所在网络上的离开组消息。一个 IGMPv2 路由器可被放置在至少有一个路由器没有被升级为IGMPv2的子网上。,有如下的要求: 如果存在任一个IGMPv1 路由器,查询者必须使用IGMPv1. IGMPv1 的使用必须有组织的配置,就好象没有可靠的方法来动态决定在网络上是否有IGMPv1路由器存在一样。其实现须提供给系统管理者一个方法来打开这些路由器上IGMPv1 的使用。其配置必须默认为IGMPv2 。在 IGMPv1 模式中, 路由器必须发送最大厦响应时间为0的周期性查询。 它们必须在接收到IGMPv2 查询时报警,尽管这些报警会受速率限制。 如果一个路由器没有显式地配置为使用IGMPv1 ,且收到了一个IGMPv1 查询,它应该在日志上写上一个警告。这些警告必须有速率限制。 5. 和IGMPv1 主机的兼容性 一个 IGMPv2 主机可以被放置 于有一些主机没有被升级为IGMPv2 的子网上。如下的必要条件为 : 主机必须允许它的成员报告可被其它的版本1或版本2的成员报告所压制。 一个 IGMPv2 主机可以被放置 于有一些主机没有被升级为IGMPv2 的子网上。如下的必要条件为 : 主机必须允许它的成员报告可被其它的版本1或版本2的成员报告所压制。 如果一个路由器收到了一个版本为1的成员报告,它必须设置一个定时器来注明存在一个版本1的主机, 该主机是它接收到报告的组中的成员。该计时器应和[组成员时间间隔。 如果版本1主机声明为一个特定的组,一个路由器必须忽略任一个它所接收到的离开该组的消息。 6. 主机状态报文 主机的行为正式上由如下的传送报文状态定义。考虑到任一个单个的IP组播组在任一个单一的网络接口上,主机可以为三个可能状态中的一个: - "无成员" 状态, 当该主机不属于接口上的组时。这是一个对于所有的网络接口上的所有成员来说,是一个初始的状态,它不要求在主机上进行存储。 "滞留成员" 状态,当该主机属于在此接口上的该组时,且对于成员关系有一个报告延迟定时器。 - "空 闲成员" 状态, 当该主机属于该接口上的组时,且对于那个成员关系没有报告定时器正在运行。 有五个明显的事件,能引起IGMP 状态的改变: - "加入组" 发生时间。当主机决定加入该接口上的一个组时,它会 发生。它仅发生在无成员状态时。 - "离开组" 发生时间。发生在主机决定离开此接口上的该组时,它仅发生在滞留成员以及 空闲 成员状态时。 "收到的查询" 发生时间。发生在主机接收到一个有效的一般组成员查询消息,或者一个有效的特定组成员查询消息。为了使其有效,查询消息必须至少为8个字节长,并且有正确的IGMP 校验字。在IGMP 头中的组地址必须是0(对于一般的查询)或者为一个有效 的组播地址(对于特定组的查询)。一个特定组的查询应用于接收到查询的接口上所有的成员关系。对于在非成员状态中的成员关系,查询会被忽略。 - "收到的报告" 发生时间。发生在主机接收到一个有效的IGMP 成员报告消息(版本1或版本2)。为了使其有效,此报告消息必须至少有8个字节长并且有正确的IGMP 校验字。 一个成员关系报告仅应用于成员关系报告所标识的组中的成员关系,位于接收到成员关系的接口上。对于在非成员或空闲成员状态中的成员关系,会被 忽略。 - "定时器超时" 发生时间。发生在为接口上组设定的报告延时定时器超时时。它仅会发 生在延进成员状态中。 所有其它的事件中,例如接收有效的IGMP 消息,或者IGMP 消息而不只是查询或者是报告,在所有的状态中都会被忽略。这儿有七个可能的反应,对于以上的事件的反应来说: - "发送报告" 对于接口上的组。这类型的报告由接口的状态来决定。该报告消息被 发给正被报告的组。 - "发送离开 " 对于接口上的组。如果该接口的状态说查询者正在运行IGMPv1, 该反应应被跳过。如果说我们是最后一个主机的该状态标志被清除,该反应可被跳过。该离开消息被送给所有路由器组(224.0.0.2)。 - "设置状态" ,指我们是最后发送报告给该组的主机 。 - "清除状态", 指因为我们不是最后发送报告给该组的主机 。 - "开始定时器" ,为此接口上的组而定。使用一个唯 一的选 择值(从0到最大的响应时间间隔)延时值, 在此最大的响应时间在查询中规定。如果这是一个非请求的报告,该定时器会被设为一个唯 一的选 择值(从0到最大的响应时间间隔)延时值。 - "重置定时器 " 对于该接口上的组设为一个新的数值,其延时数值从从0到最大的响应时间间隔)延时值, 和"开始定时器"中所说的一样。 - "停止定时器 " 对于接口上的该组。 在所有如下的状态报文中,每一个状态传送弧都被标以引起该传送的事件,并且,在插入符中,有在传送中的一个反应标识。注意该传送已经被事件引发了;即使该反应是有条件的,该传送仍然发生。 ________________ | | | | | | | | --------->| Non-Member |<--------- | | | | | | | | | | | | | |________________| | | | | | leave group | join group | leave group | (stop timer, |(send report, | (send leave | send leave if | set flag, | if flag set) | flag set) | start timer) | ________|________ | ________|________ | |<--------- | | | | | | | |<-------------------| | | | query received | | | Delaying Member | (start timer) | Idle Member | ---->| |------------------->| | | | | report received | | | | | (stop timer, | | | | | clear flag) | | | |_________________|------------------->|_________________| | query received | timer expired | (reset timer if | (send report, | Max Resp Time | set flag) | < current timer) | ------------------- 所有系统的组 (地址为 224.0.0.1) 被处理为一个特别的事例。对于每个接口上的组,该主机开始于空闲成员状态,并且从不发送针对此组的报告。 另外,考虑到某个单一的网络接口一个主机可以是在两个可能状态中的一个: - "无 IGMPv1 路由器存在", 当该主机没有听到针对[版本 1 的路由器存在超时]的IGMPv1风格的查询时,此为初始状态。 - "IGMPv1 路由器存在", 当该主机已听到了在针对[版本 1 的路由器存在超时]的一个IGMPv1 风格的查询时。 此处有两个事件,能导致状态的改变: - "IGMPv1 查询收到", 当主机接收到一个带有最大响应时间域设为0的查询时产生。 - "定时器超时", 当定时器设为提示有一个 IGMPv1 的路由器存在已过期。加入一个单个的反应能被一个事件所启动: "设定定时器 ", 设定定时器为其最大的值[版本 1 的路由器存在超时]且开始或重新开始它。 ________________ | | | | | No IGMPv1 | | Router | | Present | | | ---->| |---- | | | | | |________________| | timer expires | | IGMPv1 query | ________________ | received | | | | (set timer) | | | | | | | | -----| IGMPv1 |<--- | Router | | Present | | | ---->| |---- | |________________| | | | | IGMPv1 query received | | (set timer) | --------------------------- 7. 路由器状态报文 路由器的行为很大程度上由如下的传送提报文所定义。 考虑到 任一个单一的邻接网络,一个路由器可为两个可能状态中的一个 : - "查询者", 当该路由器设计为在此网络上传送IGMP 成员关系查询时。 - "非查询者", 当此处是另一个设为在此网络上传送IGMP成员关系查询的路由器。 如下的三个事件能导致路由器改变状态: - "查询定时器超时" 发生在定时器设为查询传送超时时。 - "从低IP地址的路由器上收到的查询消息" 发生在从在同一个网络上且有低IP地址的路由器上接收到IGMP 成员查询时。 - "其它的查询者存在定时器超时" 发生在,当定时器设为提示另一个此网络上拥有低IP地址的查询者超时时。 此处有三个反应,可用来响应以上的事件: - "启动一般查询定时器" 针对一个邻接网络。 - "启动另一个查询者存在定时器" 针对于该邻接网络[其它查询者存在周期。 - "发送一般查询" 在邻接网络上发送。一般的查询被发 给所有的系统组(224.0.0.1),并且有[查询响应周期]的最大的响应时间 。 -------------------------------- _______|________ gen. query timer | --------- | | expired | | Initial |---------------->| | (send general query, | --------- (send gen. q., | | set gen. q. timer) | set initial gen. q. | |<---------------------- timer) | Querier | | | -----| |<--- | | | | | |________________| | query received from a | | other querier router with a lower | | present timer IP address | | expired (set other querier | ________________ | (send general present timer) | | | | query,set gen. | | | | q. timer) | | | | ---->| Non |---- | Querier | | | | | ---->| |---- | |________________| | | query received from a | | router with a lower IP | | address | | (set other querier | | present timer) | --------------------------- 一个路由器应该在所有的邻接网络上开始于初始状态,并且立即移到查询者状态。 另外,为了保持和那些有成员的组的联系,在考虑到任一个位于单个邻接的网络上的单一IP组播组时,一个路由器可处于四个可能状态: - "无成员存在" 状态,当已 发送该组播组报告的网络上没有主机存在时。 这对于该路由器上所有的组来说是一个初始状态;它不需要路由器的存储。 - "成员存在" 状态, 当已 发送该组播组报告的网络上有一个主机存在时。 - "版本1成员存在" 状态,当对于该组已发送版本1成员组报告的网络上有一个主机存在时。 - "检测成员关系" 状态,当路由器已接收到了一个离开组消息,今明两天没有听到针对组播组的成员报告。 此处有六个明显的能导致路由器状态改变的事件: - "版本v2 报告收到" 发生在当路由器接收到针对该接口上该组的版本2成员关系报告时。为了有效,该报告消息必须至少有8个字节长,并且必须有正确的IGMP 检测字。 - "版本v1 报告收到 " 发生在当路由器收到了针对该接口上该组的版本1的成员报告 。 应用了同样合法的请求。 - "离开收到" 发生在当路由器接收到针对该接口上的该组的IGMP 组离开消息时。为使其有效,此离开组的消息必须至少有8个字节长,并且必须有正确的IGMP校验字。 - "定时器超时" 发生在当定时器为一个组成员设置后超时时。 - "重传定时器超时" 发生在为重传一个特定组查询的定时器超时时。 - "版本v1 主机定时器超时" 发生在当为提示版本1的主机作为组成员存在的定时越野时。 此处有六个可能的反应,它可能对以上的事件反应: - "开始定时器" 针对接口上的组成员- 也重置定时嚣为其初始值 [组成员生存期]如果该定时器当前正在运行。 - "开始定时器*" 针对接口上的的组成员- 该替代的响应设此计时器为[最后的组成员生存期] * [最后的成员查询计数] 如果该路由器是一个查询者,或是 包中的[最大的响应时间] * [最后的成员查询计数]如该路由器是一个非查询者。 - "开始重传定时器" 针对于该口上的组成员 [最后的成员查询周期]。 - "开始版本1主机定时器" 针对于该接口上的组成员,也重置该定时器为其初始值[组成员周期] 如果该定时器当前正在运行。 - "发送特定组查询" 针对于邻接网络上的组。特定组查询被发给所查询的 组中,并且有着[最后成员查询周期]的最大的响应时间 。 - "通知路由+" 通知路由协议在此连接的网络上该组的成员。 - "通知路由 -" 通知路由协议在此连接的网络上不在有该组的成员。 对于路由器查询状态的状态报文如下 : ________________ ----------------------------| |<----------------------- | | |timer expired | | timer expired| |(notify routing -, | | (notify routing -)| No Members |clear rxmt tmr) | | ------->| Present |<------- | | | | | | | |v1 report rec'd | | | | ------------ | |(notify routing +, | |________________| | | rexmt timer| | | start timer, | | | | expired | | | start v1 host | v2 report received| | | (send g-s | | | timer) | (notify routing +,| | | query, | | | | start timer)| | | st rxmt | | | __________|______ | _____|_|______ tmr)| | | | |<------------ | | | | | | | | |<----- | | | | v2 report received | | | | | | (start timer) | | | | | Members Present |<-------------------| Checking | | | ----->| | leave received | Membership | | | | | | (start timer*, | | | | | | | start rexmt timer,| | | | | | | send g-s query) | | | | | --->| |------------------->| | | | | | |_________________| |______________| | | | |v2 report rec'd | | | | | | |(start timer) | |v1 report rec'd |v1 report rec'd | | | ---------------- |(start timer, |(start timer, | | |v1 host | start v1 host timer) | start v1 host | | |tmr ______________V__ | timer) | | |exp'd | |<---------------------- | | ------| | | | | Version 1 |timer expired | | | Members Present |(notify routing -) | ------->| |------------------------------------------- | |<-------------------- ------->|_________________| v1 report rec'd | | v2 report rec'd | | (start timer, | | (start timer) | | start v1 host timer) | ----------------- --------------------------   该处于非查询者路由器的状态报文 很简单,但非查询者不发送消息且仅由消息接收驱动。注意非查询者不会关心一个成员报告消息是版本1还是版本2。 ________________ | | | | timer expired| |timer expired (notify routing -)| No Members |(notify routing -) --------->| Present |<--------- | | | | | | | | | | | | | |________________| | | | | | |report received | | |(notify routing +,| | | start timer) | ________|________ | ________|________ | |<--------- | | | | report received | | | | (start timer) | | | Members Present |<-------------------| Checking | | | g-s query rec'd | Membership | | | (start timer*) | | ---->| |------------------->| | | |_________________| |_________________| | report received | | (start timer) | ----------------- 8. 定时器表和默认值 大多数定时器都可配置。如使用了非默认的设定,则他们必须在单个连接上所有的路由器中是一致的。注意这些插入语被用于组的表达以使得逻辑清楚。 8.1. 健壮性变量    健壮性变量允许在一个子网上所要的包丢失。如果子网是可以丢失的,健壮性变量可增加。 IGMP 对于 (健壮性变量 - 1) 包的丢失是健壮性的。健壮性变量不能为0,且不应为1。默认值为2。 8.2. 查询周期 查询周期是由查询者发出的一般查询间的间隔,默认值为125秒。 通过改变该[查询周期], 一个管理者可以调节子网上IGMP 消息的数目,更大的值导致了IGMP 查询发送少天10。 8.3. 查询响应周期 插入一般查询周期中的最大的响应时间。默认值为100(10秒)。   通过改变[查询响应周期], 一个管理者可以调节子网上IGMP 消息的突发性。更大一点的值可使流量少些突发性,当主机响应被散布到更大的范围时。由[查询响应周期]所代表的秒数必须小于 [查询周期]. 8.4. 组成员周期 组成员周期是在组播路由器决定此处没有成员在网络上之前必须经过的秒数。该值必须是((健壮性变量)倍 (查询周期)) 加上(一个查询响应周期)。 8.5. 其它的查询存在周期 其它的查询存在周期是在组播路由器决定网络上不在有另一个应该成为查询者的组播路由器之前,所必须经过的秒数。 该变量必须为 ((健壮性变量) 倍 (查询周期)) 加上 (一个查询响应周期的一半)。 8.6. 初始查询周期    开始查询周期是在开始时由查询者发送的一般查询之间的间隔时间。默认值为: 1/4查询周期。 8.7. 初始查询周期   初始查询周期是在初始化时发出的查询数目,其中由初始查询周期的长度进行分隔。默认值为:健壮性变量。 8.8. 最后的成员查询周期 最后的成员查询周期是响应组消息所发送的特定组 查询的最大响应时间,并且也是特定组查询消息之间的时间总数。默认值为:10 (1 秒)。 该值可以调整为适合于该网络的"离开延时"。 一个降低的数值会导时间的降低,以检测组中最后一个成员的丢失。 8.9. 最后成员计数   最后成员计数是在路由器确定已没有本地成员之前,发出的特定组成员查询的数目。认值为:健壮性变量。 8.10. 非请求报告周期  非请求报告周期是在 一个组中主机的初始化成员报告消息接收之间的时间。默认值为: 10 秒。 8.11. 版本1路由器存在超时 版本1路由器存在超时是在听到了版本1的查询之后,它发出IGMPv2消息之前,所要等的时间。其默认值为?: 400 秒。 9. 消息目的地 该消息在文档的几乎任何地方 都有提供,但在此仍遵照惯列在下面列出。 消息类型      目的组           ------------ ----------------- General Query ALL-SYSTEMS (224.0.0.1) Group-Specific Query The group being queried Membership Report The group being reported Leave Message ALL-ROUTERS (224.0.0.2) 注意: 在老的IGMPv2版本中 (例如,非标准的且现在淘汰了的) ,主机发出了离开消息给就要离开的组。路由器应该接受发布给正有成员离开的组的消息,以便对这些主机提供向后的兼容性。在所有的情况下,主机必须向所有路由器地址发布以适合该规范。 10. 安全考虑 我们考虑每个类型消息的分枝    查询消息: 来自拥有比当前查询者更低的IP值主机的一个伪造的查询消息会导致查询者方面的职权归伪造者所有。如果该伪造者随之不再发送查询消息,其它的路由上的其它的查询者生存计时器将会超时且有一个重新作为查询者。在这段时间中,如果仿造者忽略离开消息,流量,会散布到没有成员的组内直到[组成员周期]。 一个仿造的消息发到了一个有成员存在的组会导致该组内的主机报告的他们的成员关系。这导致了LAN中的流量略为增多,但没导致协议方面的问题。 报告消息: 一个仿造的消息可以导致组播路由器认为组中的成员都在子网上,而实际上却不是。来自于本地的子网的一个仿造的消息是没有意义的,因为加入一个主机所在的组通常是没有特权的操作,所以一个本地的用户可以简单地得到同样的结果而不需要仿造消息。一个从外部来的仿造的消息则更讨厌了,有两个方法可以防御仿造的消息。 - 忽略该报告,如果你不能认出一个属于该接口的子网上的包中的源地址,在该接口上收到了该包。这种解决 方案 意味着由移动主机发出的报告而不是在本地子网上发出的将会被忽略。 - 忽略没有路由警告选项[RFC 2113]的报告消息, 且请求路由器不转发报告消息。 (该请求不是在转发路径上一般来说经过了过滤的请求,因为这些包已经在其中包括了路由警告选项[RFC 2113]) 。该解决方案破坏了 和早期版本实现的向后的兼容性,早期的版本不要路由警告选项[RFC 2113]。 一个伪造版本1报告消息可以针对一个选定的组把一个路由器置为"版本1成员存在" 状态,这意味着该路由器会忽略离开消息。这能导致流量遍布那些没有成员的整个组内并且持续 [Group Membership Interval]。有两个方法可以防御仿造的版本1报告消息: - 为了来自外部的源端版本1报告,忽略该报告如果你不能确定包的源地址是属于收到该包的接口上的子网。 该解决方案意味着由移动主机(不在 本地网上)发出的版本1报告将会被忽略。 - 提供带有配置开关的路由器以完全忽略版本1消息。此方法会使得不能自动的和版本1主机进行兼容,因此应该仅仅用于那些对"快速离开"要求严格的地方。该解决方案很好地防止了来自本地子网的伪造的版本1消息。 离开消息: 一个伪造的离开消息导致查询者发出一个特定组查询来查询该组。这会导致在每一个路由器上和组中的每一个成员上过多的处理,但是不会导致预期流量的减少。这儿有两个方法可以防御来自外部的伪离开消息: - 忽略该离开消息,如果你不能确定包的源地址是属于收到该包的接口上的子网。该解决方案意味着由移动主机(不在 本地网上)发出的离开消息将会被忽略。 - 忽略没有路由器警告选项[RFC 2113]的离开消息,且要求路由器不再转发离开消息。 (该请求不是在转发路径上通常化过滤后的请求,因为该包已经包括了路由器警告选项)。该解决方案一样破坏了和早期的在该规范方面没有路由器警告选项的兼容性。 11. 致谢 IGMPv2 由Rosen Sharma 和 Steve Deering设计。 12. 参考 RFC 2119 Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, March 1997. RFC 2113 Katz, D., "IP Router Alert Option," RFC 2113, February 1997. RFC 1112 Deering, S., "Host Extensions for IP Multicasting", STD 5, RFC 1112, August 1989. 13. 附录 I - 基于IGMPv1的改变 IGMPv1 "Version" and "Type" 域被整合为一个"Type" 域。 一个新的IGMP 类型设为版本2 的成员报告消息, 因此路由器可以在IGMPv1 和IGMPv2 主机的报告中分辨其不同。 一个新的IGMP 类型特为 IGMPv2 离开组消息创建。 改变了成员查询消息,从而以前 没有利用的域饮食了一个新的数值,为最大的响应时间。 IGMPv2 spec 现在 规定了一个查询者选举机制。在IGMPv1中 , 查询者选举机制和组播路收协议没有什么关系,而且不同的协议使用不同的机制。这会导致每一个网络中不止一个查询者,因此在IGMPv2中查询者选举机制已标准化了。 然而, 这意味着必须小心一个IGMPv2 路由器试图和一个使用不同的查询者选举机制的IGMPv1 路由器一起退出的情况。尤其是,意味着当发生了这样的配置时,IGMPv2 路由器必须能够在特定的网络上做为一个 IGMPv1 路由器。该反应包括如下: - 在所有的查询中设置最大的响 应间为0。 - 忽略离开组消息。 IGMPv2 spec 放松了对成员查询和成员报告的有效性检查。当对其中的某个实现部分升级时,要确保移除不再属于的一些检测机制。 IGMPv2 spec 需要在所有的包中有该备忘录中所说的IP 路由器警告选项 [RFC 2113] 。 14. 作者地址 William C. Fenner Xerox PARC 3333 Coyote Hill Road Palo Alto, CA 94304 Phone: +1 650 812 4816 EMail: fenner@parc.xerox.com 15. 版权声明 版权(C) 属于The Internet Society (1997). 所有版权保留。 该文档及其译本可以复制和传阅,可以进一步地对其注释或者对其部分或整体地 进行实现、拷贝、出版、发行,而无任何方面的限制,以上版权注释的声明以及图列都 包含在所有的拷贝中和对其的扩展中。然而,该文档本身不能被随意改动的, 列如移走版 权的注释或者是Internet Society 的引用,或者是其它的 Internet 组织,除非是出于发展Internet 标准的目的需要,而这对于Internet标准中规定版权的程序是必须遵守的。或是按要求将其从英语翻译到其它的语言。 以上该受限的许可是永久的且不会被废弃或分配。在此所说的该文档和包含的信息是基于一个 "AS IS" 的基础和INTERNET SOCIETY以及INTERNET 工程任务组织的全部授权,表达或者是其引申意义,包含了没有受限的一些授权,因此对于某一特定的目的来说,该信息的使用不会侵犯销售产品中所授的权利和引申的权利。 RFC 2236 Internet Group Management Protocol, Version 2 Internet组管理协议,版本2 1 1 RFC中文文档翻译计划