百度空间 | 百度首页 
 
查看文章
 
RFC3376 因特网组管理协议 第3版续(译)
2006年12月21日 星期四 下午 06:38
5、组成员协议的描述
    IGMP是一个非对称的协议,分别指定组成员(即那些希望接收多播数据报的主机和路由器)和多播路由器的行为。本节主要描述IGMPv3运用于所有组成员 的那部分(需要注意的是,一个同时是组成员的多播路由器会同时执行IGMPv3的两部分,对来自自己的和邻居的IGMP消息,它都会接收和报告。 IGMPv3的多播路由器部分在第6节描述)。
    一个系统在所有支持多播接收的接口上执行本节所描述的协议,即使有多个接口连接在同一网络上也是如此。
    为了能跟运行旧版本IGMP协议的多播路由器互操作,系统在支持多播接收的每一个接口上维护了一个MulticastRouterVersion变量。本节描述在MulticastRouterVersion=3的接口上组成员系统的行为。关于确定MulticastRouterVersion变量的值的算法和非第3版的行为,在第7节描述。
    “所有系统”多播地址224.0.0.1作为一个特殊的情况处理。所有的系统(包括主机和路由器,多播路由器)接收发往“所有系统”多播地址的来自所有源的数据报。关于这一点,在所有支持多播的接口上都是永远被打开着的。
    有两种类型的事件可以触发接口上的IGMPv3协议的行为:
    -由本地的IPMulticastListen调用引起的接口接收状态的修改。
    -收到一个查询。
    (除了要跟早期版本的IGMP进行互操作的请求,接收到的非查询类型的IGMP消息都会被忽略)。
    接下来的章节描述这两种情况下所发生的行为。在这些描述中,定时器和计数器的名字出现在方括号中,这些定时器和计数器的缺省值将在第8节描述。
5.1、接口状态改变时发生的行为
    一个IPMulticastListen调用会引起接口上的多播接收状态的改变,改变规则见3.2节。每一个这样的改变只作用在单个接口上的单个多播地址。
    接口状态的改变引起系统立即从该接口发送一个状态改变报告。该报告的组记录的类型和内容取决于针对该IP多播地址的改变前后,过滤模式和源列表的比较。如果改变前,对于该多播地址不存在接口状态(即这个改变是创建一个新的接口记录),或者改变后,不存在接口状态(即该改变是删除一个接口记录)。那么就涉及 到一个“不存在”状态,该状态被看作拥有一个INCLUDE过滤模式和一个空的源列表。
    旧的状态             新的状态                发送的状态改变记录
    INCLUDE(A)        INCLUDE(B)          ALLOW(B-A)    BLOCK(A-B)
    EXLUCDE(A)        EXCLUDE(B)        ALLOW(A-B)    BLOCK(B-A)
    INCLUDE(A)        EXCLUDE(B)         TO_EX(B)
    EXCLUDE(A)        INCLUDE(B)        TO_IN(B)
    如果计算得到的源列表中,ALLOW状态改变记录为空,或者BLOCK为空,那么在报告消息中这个记录就被省略。
    考虑到状态改变报告消息可能错过一个或多个路由器的可能性,它会被重传[健壮性变量]-1次,时间间隔是从范围(0,[主动报告间隔])中随机选取的一个值。
    如果前一个改变的状态改变报告还没有被重传完,同一个接口上就发生了新的改变。那么这个新的改变会造成立即对新的状态改变报告进行重传。
    新传送的报告的内容通过如下的方法计算得到:第一个报告完成后,相关的组在上一次改变前和改变后的接口状态被进行比较。然后根据上述的表格,报告的记录中表达了两者的不同。但是这些记录不在一条消息中进行传输,而是跟上一次未传送完的的报告的内容合在一起,产生一条新的状态改变报告。把状态改变报告和未传送完的报告进行合并,产生差异报告的规则描述如下。
    合并的状态改变报告在被传输之前,同一个多播地址上的前一个状态改变报告会被中止,然后,新的状态改变报告进行[健壮性变量]次数的重传。
    每一次被包含到差异报告中的一个源以上述的方法计算得到,对于该源的重传状态需要被维护到主机对状态改变报告已经传送了[健壮性变量]次数。这是为了保证接下来的一系例状态改变不会破坏协议的健壮性。
    如果接口的接收状态改变,并触发了新的过滤模式改变的状态报告,那么,下一轮[健壮性变量]次数的状态改变报告会包含过滤模式改变记录。如果在此期间,有 任何数量的源列表改变发生,该规则都适用。主机必须为该组维护重传状态,直到有[健壮性变量]次数的状态改变报告被发送出去了。当在上一次过滤模式改变之 后,已经有[健壮性变量]次数的含有过滤模式改变记录的状态报告被发送出去了,并且接口接收的源列表改变已经启动了下一轮的报告,那么下一轮的状态改变报 告只含有源列表改变记录。
    每一次被传送的状态改变报告,其内容以如下的方式确定:如果报告应当含有一个过滤模式改变记录,并且接口的当前过滤模式是INCLUDE,那么报告中就会含有一个TO_IN记录,否则就会含有一个TO_EX记录。或者,如果报告中应当含有源列表改变记录,那就会有一个ALLOW和一个BLOCK记录。这些记录的内容依据下列的表格建立:
    记录            包含的源
    TO_IN            所有在当前接口状态中必须被转发的
    TO_EX            所有在当前接口状态中必须被阻止的
    ALLOW            所有在重传状态中必须被转发的
    BLOCK            所有在重传状态中必须被阻止的
    如果计算出的ALLOW的源列表,或者BLOCK的源列表是空的,在状态报告中的记录就会被省略。
    注意:当第一个状态改变报告被发出去,会合并进一个不存在的未完成的状态报告。可以被看作是一个拥有空的ALLOW或者BLOCK记录的源改变报告(这种重传状态下没有源)。
5.2、接收到一个查询时的行为
    当系统接收到一个查询,它不会立即响应。它会把这个响应延迟一个随机时间,这个时间就在接收到的查询消息的最大响应代码中计算得到的最大响应时间的范围 内。一个系统可能在不同的接口上接收到多个查询,并且是不同类型的(比如普通查询,指定组查询,指定组和源的查询),每一个查询都需要相应的延迟响应。
    在调度一个查询的响应之前,系统必须考虑到前一次调度的还未完成的响应,大多数情况下,会重新调度一个组合的响应。因此,系统必须能够维护下列的状态:
    -每一个接口上都有一个定时器,用于调度普通查询的响应。
    -每一个接口和特定组相关的定时器,用于调度对指定组查询和指定组和源的查询的响应。
    -每一个接口和特定组相关的源列表,被放置在指定组和源查询的响应中。
    当一个带有路由器警告选项的查询到达接口上时,那么系统的状态就是要报告,报告的延迟时间从范围(0,[最大响应时间])中获取,这里,最大响应时间是从接收到的查询中的最大响应代码计算得到的。下面的规则用于确定一个报告是否需要被调度以及被调度的报告的类型。这些规则依次被考虑,当发现第一个匹配规则 时,即被应用:
    1、如果还存在对前一个普通查询的未完成响应,它在被选择的延迟之前被调度,就不需要再调度额外的响应。
    2、如果收到的查询是一个普通查询,接口的定时器在选定的延迟之后,必须调度一个普通查询的响应。
    3、如果收到的查询是一个指定组查询,或者是一个指定组和源的查询,并且不存在该组的前一个查询的未完成的响应,那么组定时器就用于调度一个报告。如果收到的查询是一个指定组和源的查询,那么被查询的源列表必须被记录下来,用于生成响应。
    4、如果对该组的前一个查询已经存在未完成的响应,并且新的查询是一个指定组的查询,或者已经被记录下来的该组的源列表是空的,那么这个组的源列表被清空,并使用组定时器调度单个的响应。新的响应在未完成报告的剩余时间和选定的延迟两个时间中的较早那个时间被发送出去。
    5、如果收到的查询是一个指定组和源的查询,并且该组存在一个拥有非空源列表的未完成响应。那么组的源列表被增长以含有新的查询的源列表,并且使用组的定时器调度一个单个的响应。新的响应在未完成报告的剩余时间和选定的延迟两个时间中的较早的那个时间被发送出去。
    当未完成报告相关的定时器超时,系统在相关的接口上传送一个或多个报告消息,消息中含有一个或多个当前状态记录,如下:
    1、如果超时的定时器是接口定时器(即它是一个响应普通查询的报告),那么为指定的拥有接收状态的接口上的每一个多播地址发送一个当前状态记录。当前状态记录含有该多播地址和相关的过滤模式(MODE_IS_INCLUDE或者MODE_IS_EXCLUDE),以及源列表。多个当前状态记录被尽可能地打 到一个报告消息中。
    当系统是大量的组的成员的时候,不成熟的算法会导致数据报的爆炸。不要使用单个的定时器,建议实现把这样的报告消息的传输分散到间隔(0,[最大响应时 间])中。需要注意的是,任何这样的实现,必须避免“ask-implosion”问题,即不能收到一个普通查询后立即发送报告。
    2、如果超时的定时器是组定时器,并且该组的记录下来的源列表是空的(即它是一个未完成的指定组的查询的响应),那么,当且仅当接口对该组地址有一个接收 状态时,为该地址发送一个当前状态记录。当前状态记录含有该多播地址,它相关的过滤模式(MODE_IS_INCLUDE或者 MODE_IS_EXCLUDE)以及源列表。
    3、如果超时的定时器是组定时器,并且该组的记录下来的源列表是非空的(即它是一个未完成的指定组和源的查询的响应),那么,当且仅当接口对该组地址有一个接收状态时,用于响应的当前状态记录的内容由接口的状态和未完成响应记录来决定,如下表所述:
    接口状态        未完成响应记录中的源集        当前状态记录
    INCLUDE(A)        B                            IS_IN(A*B)
    EXCLUDE(A)        B                            IS_IN(B-A)
    如果结果的当前状态记录有一个空的源地址集,就不会发送响应。
    最后,在需要的报告消息被产生以后,跟所有被报告组相关的源列表都会被清除。
   
6、多播路由器的协议描述
    由于当前重点关注主机的实现,该部分略。

7、跟旧版本的IGMP之间的互操作
    IGMPv3的主机和路由器跟未升级到IGMPv3的主机和路由器要能互操作。这种兼容性由主机和路由器根据同一网络中其它主机和路由器的IGMP版本采取相应的行为来完成。
7.1、查询版本的差异
    成员关系查询消息的IGMP版本以如下方式确定:
    IGMPv1查询:长度=8字节,最大响应代码字段为0。
    IGMPv2查询:长度=8字节,最大响应代码字段非0。
    IGMPv3查询:长度>12字节。
    不符合上述情况的查询消息(比如说一个10字节长的查询)必须被丢弃。
7.2、组成员行为
7.2.1、当有旧版本查询者存在的时候
    为了跟旧版本的路由器兼容,IGMPv3的主机必须能够在第1版和第2版兼容模式下操作。IGMPv3主机必须为每一个本地接口维护一个跟相连网络的兼容 模式相关的状态。一台主机的兼容模式由主机的兼容模式变量来决定。兼容模式变量有三种可能的状态:IGMPv1,IGMPv2和IGMPv3,该变量在每 一个接口上都维护一个,其值取决于接口接收到的普通查询的版本,还有接口上的旧版本的查询者存在定时器。
    为了能更优雅地在IGMP各版本间进行切换,主机在每一个接口上维护了一个IGMPv1查询者存在定时器和一个IGMPv2查询者存在定时器。任何时候, 当一个IGMPv1成员关系查询被收到时,IGMPv1查询者存在定时器被设置成旧版本查询者存在超时的时间。当一个IGMPv2普通查询被收到后, IGMPv2查询者存在定时器被设置成旧版本查询者存在超时的时间。
    当一个更旧版本的查询被收到(比当前的兼容模式还旧),或者特定的定时器条件发生时,主机某个接口上的兼容模式就会发生变化。当一个IGMPv1查询者存 在定时器超时,如果当前还有一个IGMPv2查询者存在定时器在运行,那主机就切换到IGMPv2的兼容模式。如果当前没有IGMPv2查询者存在定时器 在运行,主机就直接切换到IGMPv3兼容模式。当IGMPv2查询者存在定时器超时后,主机直接切换到IGMPv3兼容模式。
    主机的兼容模式变量的取值取决于在前一个旧版本查询者存在超时时间内,是否收到旧版本的普通查询。主机的兼容模式的确定如下:
    主机兼容模式            定时器状态
    IGMPv3(缺省)            IGMPv2查询者存在没有在运行
                                     IGMPv1查询者存在也没有在运行
    IGMPv2                    IGMPv2查询者存在正在运行
                                     IGMPv1查询者存在不在运行
    IGMPv1                    IGMPv1查询者存在正在运行
    当主机收到一个查询,该查询会造成它的查询者存在定时器被更新,并且需要相应地调整它的兼容模式,它应当立即调整兼容模式。
    当主机的兼容模式是IGMPv3,主机就在该接口上使用IGMPv3协议。当主机的兼容模式是IGMPv2,主机就在该接口上使用IGMPv2协议。当主机的兼容模式是IGMPv1,主机就在该接口上使用IGMPv1协议。
    一台IGMPv1路由器会发送最大响应代码为0的普通查询,这时,最大响应时间必须被解释为100(10秒)。
    一台IGMPv2路由器发送的普通查询,其最大响应代码被解释为最大响应时间。即,该字段的全范围段是线性的,不存在指数表示法。
    任何时候主机改变了它的兼容模式,会结束掉所有的未完成的响应和重传定时器。
7.2.2、旧版本的组成员的存在
    一台IGMPv3的主机可能被放置在某一个网络中,该网络中还有主机未升级到IGMPv3。一台主机的IGMPv3成员关系记录要可以被一个第1版成员报告或者第2版成员报告禁止。
7.3、多播路由器的行为
7.3.1、存在旧版本的查询者
    IGMPv3路由器可能被放置在一个网络中,该网络中至少还有一台路由器没有被升级到IGMPv3。这就产生了以下需求:
    -如果路由器上存在更旧版本的IGMP,查询者必须使用网络中最低版本的IGMP。这必须通过管理系统来确保;希望跟IGMPv1和IGMPv2兼容的路 由器必须有一个配置选项以运行在IGMPv1或IGMPv2兼容模式下。当在IGMPv1模式下,路由器必须周期性地出最大响应代码为0的查询,并且查询 会在组地址字段被截取掉(即8字节长度),而且必须忽略离开组消息。它们应当在收到IGMPv2和IGMPv3查询时发出警告,但是这样的警告必须受到一 定的频率限制。如果运行在IGMPv2模式,路由器必须周期性地发出查询,该查询也要在组地址字段被截取(即8字节长度),在收到IGMPv3查询时,也 要发出警告(这样的警告的频率必须受到限制)。它还要在最大响应代码字段填入最大响应时间。
    -如果路由器没有被显示地配置为使用IGMPv1或IGMPv2,并接收到了一个IGMPv1或IGMPv2的普通查询,它应当写下一个警告日志,这种警告必须受到频率限制。
7.3.2、存在旧版本的组成员
    IGMPv3路由器可能被放置在一个网络中,该网络中还有主机没有被升级到IGMPv3。为了跟旧版本的主机兼容,IGMPv3路由器必须在IGMPv1 或IGMPv2兼容模式下运行。IGMPv3为每一个组记录维护一个兼容模式。组的兼容模式由组的兼容模式变量来决定,该变量可能是下列中个值中的一个: IGMPv1,IGMPv2和IGMPv3。每条组记录都有这么一个变量,它的值取决于该组所接收到的成员报告的版本,以及该组的旧版本主机存在定时器。
    为了更优雅地在不同版本的IGMP间进行切换,路由器为每一个组维护了一个IGMPv1主机存在定时器和一个IGMPv2主机存在定时器。当收到一个 IGMPv1成员关系报告时,IGMPv1主机存在定时器会被设置为旧版本主机存在超时时间。当收到一个IGMPv2成员关系报告时,IGMPv2主机存 在定时器会被设置为旧版本主机存在超时时间。
    当收到一个更旧版本的报告(比当前兼容模式的版本更旧),或者特定的定时器事件发生,组记录的组兼容模式就要发生改变。当IGMPv1主机存在定时器超 时,如果当前正在运行IGMPv2主机存在定时器就切换到IGMPv2的兼容模式。如果没有IGMPv2主机存在定时器在运行,就直接切换到IGMPv3 兼容模式。当一个IGMPv2主机存在定时器超时并且IGMPv1主机存在定时器不在运行,就切换到IGMPv3兼容模式。需要注意的是,当一个组切换回 IGMPv3模式,它需要一些时间去重新获取指定源的状态信息。指定源的信息通过下一个普通查询获取,但是应当被阻止的源还没有被阻止,直到下一个[组成 员关系间隔]后。
    组兼容模式变量的值取决于在上一个旧版本主机存在超时时间内,是否收到一个更旧版本的报告。组兼容模式的设置依据下列规则:
    组兼容模式            定时器状态
    IGMPv3(缺省)        IGMPv2主机存在没有运行
                                  IGMPv1主机存在也没有运行
    IGMPv2                 IGMPv2主机存在正运行
                                 IGMPv1主机存在没有运行
    IGMPv1                IGMPv1主机存在正运行
    如果一台路由器收到一个报告,该报告造成该路由器的旧版本主机存在定时器被更新并且其兼容模式也要发生相应的变化,它应当立即切换其兼容模式。
    当组兼容模式是IGMPv3,路由器为该组使用IGMPv3协议。当组兼容模式是IGMPv2,路由器在内部把下面的IGMPv2消息转化为它们等价的IGMPv3模式:
    IGMPv2消息            IGMPv3等价形式
    报告                IS_EX({})
    离开                TO_IN({})
    IGMPv3的阻止消息被忽略,在TO_EX()消息中,源列表也被忽略,即任何TO_EX()消息被处理为TO_EX({})。
    当组兼容模式是IGMPv1,路由器在内部把下面的该组的IGMPv1,IGMPv2消息转化为它们的等价的IGMPv3形式:
    IGMP消息        IGMPv3等价形式
    v1报告            IS_EX({})
    v2报告            IS_EX({})
    除了忽略IGMPv3阻止消息,和IGMPv2兼容模式下的TO_EX()消息的源列表,IGMPv2离开消息,IGMPv3的TO_IN消息也要被忽略。

8、定时器,计数器列表和它们的缺省值
    略。
9、安全性方面的考虑
    略。

类别:组播与igmp协议 | 添加到搜藏 | 浏览() | 评论 (4)
 
最近读者:
 
网友评论:
1
2006年12月23日 星期六 下午 01:12 | 回复
好专业啊,谢谢你的来访!
 
2
2007年06月01日 星期五 下午 01:28 | 回复
挺好的怎么没有之前的呢 1-4章呢?
 
3
2007年09月12日 星期三 上午 10:42 | 回复
写的好,翻译的好!
 
4
2009年07月08日 星期三 下午 02:47 | 回复
真棒...
 
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu