IGMP V2.docx
《IGMP V2.docx》由会员分享,可在线阅读,更多相关《IGMP V2.docx(18页珍藏版)》请在冰豆网上搜索。
IGMPV2
目录
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","MUSTNOT","REQUIRED","SHALL","SHALLNOT",
"SHOULD","SHOULDNOT","RECOMMENDED","MAY",and"OPTIONAL"均在RFC2119[RFC2119]有详细说明。
2.介绍
Internet组管理协议(IGMP)在IP主机上应用,并向任一个邻近的路由器报告他们的组播成员关系。
该备忘录仅描述了IGMP在主机和路由器之间如何确定其组成员关系,在此路由器和组播成员主机的行为相近。
IGMP也用于两个路由器之间,但不在此进行讨论。
和ICMP一样,IGMP也是IP的一个组成部分。
要求在所有想接收IP组播的主机都进行实现。
IGMP消息封装在IP报文中,其IP的协议号为2。
所有在该文档中说明了的IGMP消息均会用TTL为1进行传递,并在IP头中包括了IP路由检测选项[RFC2113]。
所有和主机相关的IGMP消息见下:
0123
01234567890123456789012345678901
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Type|MaxRespTime|Checksum|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|GroupAddress|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2.1.类型
有3种IGMP消息和主机与路由器的交互有关:
0x11=成员关系查询
有两个成员关系查询的子类型:
-一般查询,用于了解一个组中是否有成员在相邻的网络中。
-特定组查询,用于了解在相邻的网络中特定的组是否有成员。
这两个消息由组地址进行区分,详见第1。
4章。
成员查询消息则类似于"Query"。
0x16=版本2成员关系报告。
0x17=离开组
为了和IGMPv1兼容,还有另外的一个附加的消息类别:
0x12=版本1成员报告。
该文档中的成员关系报告实指“报告”。
当没有定义版本号时,则同时适用于两个版本。
一个不能识别的消息类型应将其忽略。
新的消息类型会用新版本的IGMP,组播路由协议或其它的用途来使用。
2.2.最大的响应时间
最大的响应时间域仅在成员关系查询中有效。
规定了在发送一个回应报文时最大的允许时间,(其单位为1/10秒)。
在所有其它的消息中,会由发送者置为0,而接收者则忽略该域。
改变该设置可以允许IGMPv2路由器调整离开延时"leavelatency"(最后一个成员离开组的时刻和通知路由协议该处已不在存在成员时的这一段时间。
),详见第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来了解在他们所有的邻接物理网络上哪个组拥有成员。
组播路由器保留有一个组播组成员的列表,和一个针对每个成员的定时器。
"Multicastgroupmemberships"指在一个指定的邻接网络上至少有一个成员存在的组播组,而不是所有成员的列表。
考虑到其所有的邻接网络,一个组应该是两个角色中的一个:
查询者或非查询者。
在每个物理网络上仅能有一个查询者。
在每个邻接的网络上,开始时所有的路由器都做为一个查询者。
如果一个组播路由器从一个拥有低IP地址的路由器听到了查询消息,则在该网络上它必须作为一个非查询者。
如果一个路由器没有从其他的路由器那听到查询消息(在查询周期内),则会继续做为一个查询者。
该路由器作为一个查询者周其性的在每个邻接的(查询周期)网络上发出通常的查询消息,请求得到成员信息。
在开始时,路由器应该发送[初始查询计数]间隔短的一般查询消息,从而可以快速的可靠的确定成员信息。
一般查询的组地址为0,发给所有系统的组播组(224.0.0.1),有最大的查询响应时间[QueryResponse 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|<---------
||||
||||
||||
||________________||
|||
|leavegroup|joingroup|leavegroup
|(stoptimer,|(sendreport,|(sendleave
|sendleaveif|setflag,|ifflagset)
|flagset)|starttimer)|
________|________|________|________
||<---------||
||||
||<-------------------||
||queryreceived||
|DelayingMember|(starttimer)|IdleMember|
---->||------------------->||
|||reportreceived||
|||(stoptimer,||
|||clearflag)||
||_________________|------------------->|_________________|
|queryreceived|timerexpired
|(resettimerif|(sendreport,
|MaxRespTime|setflag)
|-------------------
所有系统的组(地址为224.0.0.1)被处理为一个特别的事例。
对于每个接口上的组,该主机开始于空闲成员状态,并且从不发送针对此组的报告。
另外,考虑到某个单一的网络接口一个主机可以是在两个可能状态中的一个:
-"无IGMPv1路由器存在",当该主机没有听到针对[版本1的路由器存在超时]的IGMPv1风格的查询时,此为初始状态。
-"IGMPv1路由器存在",当该主机已听到了在针对[版本1的路由器存在超时]的一个IGMPv1风格的查询时。
此处有两个事件,能导致状态的改变:
-"IGMPv1查询收到",当主机接收到一个带有最大响应时间域设为0的查询时产生。
-"定时器超时",当定时器设为提示有一个IGMPv1的路由器存在已过期。
加入一个单个的反应能被一个事件所启动:
"设定定时器",设定定时器为其最大的值[版本1的路由器存在超时]且开始或重新开始它。
________________
||
||
|NoIGMPv1|
|Router|
|Present|
||
---->||----
||||
||________________||
timerexpires||IGMPv1query
|________________|received
||||(settimer)
||||
||||
-----|IGMPv1|<---
|Router|
|Present|
||
---->||----
||________________||
||
|IGMPv1queryreceived|
|(settimer)|
---------------------------
7.路由器状态报文
路由器的行为很大程度上由如下的传送提报文所定义。
考虑到任一个单一的邻接网络,一个路由器可为两个可能状态中的一个:
-"查询者",当该路由器设计为在此网络上传送IGMP成员关系查询时。
-"非查询者",当此处是另一个设为在此网络上传送IGMP成员关系查询的路由器。
如下的三个事件能导致路由器改变状态:
-"查询定时器超时"发生在定时器设为查询传送超时时。
-"从低IP地址的路由器上收到的查询消息"发生在从在同一个网络上且有低IP地址的路由器上接收到IGMP成员查询时。
-"其它的查询者存在定时器超时"发生在,当定时器设为提示另一个此网络上拥有低IP地址的查询者超时时。
此处有三个反应,可用来响应以上的事件:
-"启动一般查询定时器"针对一个邻接网络。
-"启动另一个查询者存在定时器"针对于该邻接网络[其它查询者存在周期。
-"发送一般查询"在邻接网络上发送。
一般的查询被发 给所有的系统组(224.0.0.1),并且有[查询响应周期]的最大的响应时间。
--------------------------------
_______|________gen.querytimer|
---------||expired|
|Initial|---------------->||(sendgeneralquery,|
---------(sendgen.q.,||setgen.q.timer)|
setinitialgen.q.||<----------------------
timer)|Querier|
||
-----||<---
||||
||________________||
queryreceivedfroma||otherquerier
routerwithalower||presenttimer
IPaddress||expired
(setotherquerier|________________|(sendgeneral
presenttimer)||||query,setgen.
||||q.timer)
||||
---->|Non|----
|Querier|
||
||
---->||----
||________________||
|queryreceivedfroma|
|routerwithalowerIP|
|address|
|(setotherquerier|
|presenttimer)|
---------------------------
一个路由器应该在所有的邻接网络上开始于初始状态,并且立即移到查询者状态。
另外,为了保持和那些有成员的组的联系,在考虑到任一个位于单个邻接的网络上的单一IP组播组时,一个路由器可处于四个可能状态:
-"无成员存在"状态,当已 发送该组播组报告的网络上没有主机存在时。
这对于该路由器上所有的组来说是一个初始状态;它不需要路由器的存储。
-"成员存在"状态,当已 发送该组播组报告的网络上有一个主机存在时。
-"版本1成员存在"状态,当对于该组已发送版本1成员组报告的网络上有一个主机存在时。
-"检测成员关系"状态,当路由器已接收到了一个离开组消息,今明两天没有听到针对组播组的成员报告。
此处有六个明显的能导致路由器状态改变的事件:
-"版本v2报告收到"发生在当路由器接收到针对该接口上该组的版本2成员关系报告时。
为了有效,该报告消息必须至少有8个字节长,并且必须有正确的IGMP检测字。
-"版本v1报告收到 "发生在当路由器收到了针对该接口上该组的版本1的成员报告。
应用了同样合法的请求。
-"离开收到"发生在当路由器接收到针对该接口上的该组的IGMP组离开消息时。
为使其有效,此离开组的消息必须至少有8个字节长,并且必须有正确的IGMP校验字。
-"定时器超时"发生在当定时器为一个组成员设置后超时时。
-"重传定时器超时"发生在为重传一个特定组查询的定时器超时时。
-"版本v1主机定时器超时"发生在当为提示版本1的主机作为组成员存在的定时越野时。
此处有六个可能的反应,它可能对以上的事件反应:
-"开始定时器"针对接口上的组成员-也重置定时嚣为其初始值[组成员生存期]如果该定时器当前正在运行。
-"开始定时器*"针对接口上的的组成员-该替代的响应设此计时器为[最后的组成员生存期]*[最后的成员查询计数]如果该路由器是一个查询者,或是包中的[最大的响应时间]*[最后的成员查询计数]如该路由器是一个非查询者。
-"开始重传定时器"针对于该口上的组成员[最后的成员查询周期]。
-"开始版本1主机定时器"针对于该接口上的组成员,也重置该定时器为其初始值[组成员周期]如果该定时器当前正在运行。
-"发送特定组查询"针对于邻接网络上的组。
特定组查询被发给所查询的 组中,并且有着[最后成员查询周期]的最大的响应时间。
-"通知路由+"通知路由协议在此连接的网络上该组的成员。
-"通知路由-"通知路由协议在此连接的网络上不在有该组的成员。
对于路由器查询状态的状态报文如下 :
________________
----------------------------||<-----------------------
|||timerexpired|
|timerexpired||(notifyrouting-,|
|(notifyrouting-)|NoMembers|clearrxmttmr)|
|------->|Present|<-------|
||||||
|v1reportrec'd||||------------|
|(notifyrouting+,||________________|||rexmttimer||
|starttimer,||||expired||
|