1、备忘录状态
略
2、简介
IP多播是用于把一个IP数据报传送给一个由多个主机组成的“组”,传送中,使用一个目的IP地址来标识由0个或多个主机组成的组。就像单播的IP数据一样,一个多播IP数据报被尽可能可靠地传送到它的目的组中的每一台主机。也就是说,数据报是不保证能够完整地到达目的组中的每一台主机,也不能保证跟其它数据报之间不会乱序。
多播组的成员是动态的,也就是说,任何时候,任何一个成员都可以加入或离开组。同时,对于组中的成员的物理位置以及成员的数目也是没有限制的。一台主机同时可以是多个组的成员。如果一台主机仅仅是需要向一个组发送数据报,它不是必须要成为这个组的成员的。
一个组,可以是永久性的,也可以是临时的。永久性组拥有一个熟知的,由管理机构分配的IP地址。当然,这个永久性指的是组IP地址的永久性,而不是说组成员是固定不变的,在任一时刻,一个永久组可能有一个或多个成员,甚至0个成员。除此之外,还有一些多播IP地址不是为固定组所保留的,它们可以被动态分配给临时性组,临时组只有当其组内有成员时才存在。
因特网内,多播IP数据报的转发是通过“多播路由器”来处理的,它可以驻留在因特网网关上,也可以跟网关分离。主机以本地多播的方式传送IP多播数据报,该数据报只能到达目的组内与该主机直接相邻的那些成员上。如果这个数据报的IP TTL大于1,那么与本地网络直接相连的多播路由器会负责把它转发到其它有组成员的网络中。在那些TTL可以到达的网络里,也有一个直接相连的多播路由器,它会以本地多播的方式把数据报最终传送到本网内的组成员上,从而完成本次多播传送。
这份文档主要说明了为实现对IP多播的支持,对主机IP实现所需要做的扩展。这里所说的主机包括因特网中的任何一台主机和除了多播路由器之外的所有网关。多播路由器上的和多播路由器之间的算法和协议对主机是透明的,会在专门的文档里进行描述。这份文档同时也不描述本地网络的多播是如何在不同类型的网络上实现的,尽管它说明了任意本地网络所需要的服务界面,并以一个以太网技术要求说明作为例子。其它类型的网络的技术说明将会在将来的文档中出现。
3、一致性等级
这份规范有3个一致性等级:
0级:不支持IP多播。
在这一等级中,不需要所有的IP实现支持IP多播。0级的主机一般不会受多播活动的影响。唯一的例外发生在某些类型的本地网络中,可能会出现1级或2级的主机错误地把IP多播数据报传递给0级主机。这类数据报的目的地址是一个D类IP地址,很容易区分出来,它们应当被不支持IP多播的那些主机丢弃。D类IP地址将在本文档的第4章描述。
1级:支持发送,但不支持接收IP多播数据报。
1级允许主机参与一些基于多播的服务,比如资源定位或状态报告,但是它不允许主机加入任何组播组。一个IP实现可以通过添加少量代码很容易地从0级升级到1级。本文档是只有4,5,6章是适用于1级的实现的。
2级:完全支持IP多播
2级允许主机加入或离开一个组,同时也允许向一个组发送IP数据报。它需要实现因特网组管理协议(IGMP),同时要对主机的IP和本地网络服务界面进行扩展。接下来的所有章节都适用于二级的实现。
4、组的地址
组是通过一个D类的IP地址来标识的,也就是那些最高四位为“1110”的IP地址,最高四位为“1111”的是E类地址,是为将来使用的保留地址。
用因特网标准的点分十进制表示法,组地址的范围是从224.0.0.0到239.255.255.255。地址224.0.0.0是不会被分配给任何组的,224.0.0.1被分配给一个永久性组,该组包括所有的IP主机(包括网关),它被用于标识直接相连的网络中的所有多播主机。但是没有一个组地址(包括其它类型的IP地址)是可以用来标识整个因特网中的所有主机的。其它熟知的,永久性组的地址将在“已分本编号”文档中公布。
附录2有一些与组地址相关的问题的背景讨论。
5、主机IP实现模型
对主机IP实现的多播扩展将在下面的模型层次图中加以说明。在这个模型中,ICMP和IGMP(2级主机)应该实现在IP模块中,IP地址到本地网络地址的映射由本地网络模块负责。这个模型仅仅是为了说明,而不应该认为它限制了实际的实现。
| 上层协议模块 |
|_________________________|
---------------IP服务界面-------------
__________________________
| | | |
| |ICMP|IGMP|
|IP模块 --------------|
|_________________________|
-----------本地网络服务界面--------
__________________________
|本地网络 |IP地址到|
|模块(比如以太网) |本地地址|
| |的映射( |
| |比如ARP)|
| -------------|
|------------------------------------------|
为了支持1级的多播,主机的IP实现必须支持多播IP数据报的传送。为了支持2级的多播,主机的IP实现还必须支持IP多播数据报的接收。这两种类型的服务会在下面的一个单独章节里描述。对每一种服务,都会描述对于IP服务界面,IP模块,本地网络服务界面和以太网本地网络模块的扩展。对非以太网类型的本地网络模块的扩展也会简单的提及,但不会很详细说明。
6、发送多播IP数据报
6.1、对IP服务界面的扩展
多播IP数据报的发送是使用跟发送单播IP数据报同样的操作方式的,一个上层协议模块只需要指定一个IP组地址作为目的地址,而不是一个单个地址即可。虽然如此,但还是有一些扩展可能是必须的,或者是可取的。
首先,服务接口必须提供一种方法,能够让上层协议模块指定发出的多播数据报的生存时间(TTL)。如果上层协议不指定生存时间,那么对所有的多播IP数据报,其生存时间缺省为1,这样的话,如果多播需要跨越一个网络,就必须指定生存时间。
第二点,对于一台可能同时连接在多个网络中的主机,服务接口需要提供一种方法让上层协议指定某一个网络接口作为多播传送的接口。最初的传送只能使用一个接口,如果有需要,多播路由器会负责把数据报转发到其它网络中。如果上层协议不指定一个网络接口作为出口发,那么应该在系统管理的控制下选择一个缺省的网络接口。
第三点(只适用于第2级的实现),如果发送的主机自己也是发送数据报的目的组的成员之一,那么服务接口应当提供一种方法让上层协议禁止多播数据报的本地传送;缺省状态下,多播IP数据报会被复制一份从本地环回接口传回来。这对于那些限制组成员关系只能是一台主机一个进程的上层协议,或者在更高的层次上处理组通讯的环回(多播传输协议)的上层协议来讲,是一种性能优化。
6.2、IP模块的扩展
为了支持多播IP数据报的发送,IP模块必须被扩展,以在作发送数据报的路由时,可以识别IP组地址。绝大部分的IP实现具有以下的逻辑:
if IP目的地址在同一个本地网络中
直接发送数据报到目的地址
else
发送数据报到本地的网关(在到目的地址的路由上的网关)
为了允许多播传送,这个逻辑必须被修改成这样:
if IP目的地址在同一个本地网络中 or IP目的地址是一个组地址
直接发送数据报到目的地址
else
发送数据报到本地的网关(在到目的地址的路由上的网关)
如果发送主机本身就是输出接口上的目的组的一个组成员,输出数据报的一个拷贝必须被环回用于本地接收,除非发送者已经禁止了它(只存在于第2级实现中)。
输出数据报的源IP地址必须是输出接口上的一个单播IP地址。一个组地址不能被放在输出IP数据报的源地址字段,或源路由,或路由记录选项中的任何字段。
6.3、本地网络服务接口的扩展
为了支持发送多播IP数据报,本地网络服务接口不需要作任何修改。IP模块在调用已存在的本地发送操作时,仅仅需要指定一个IP组地址,而非IP单播地址作为目的地址即可。
6.4、本地以太网络模块的扩展
以太网通过允许以太网数据报中的目的地址字段填入多播地址来直接支持发送本地多播数据报。为了支持发送IP多播数据报,唯一需要的是把IP组地址映射成以太网多播地址的一个过程。
一个IP组地址映射成以太网多播地址的方法是把IP地址的低23位放到以太网多播地址01-00-5E-00-00-00(16进制)的低23位。因为一个IP组地址有28位有效位(除去高位的1110),所以有可能出现多个组地址被映射成同一个以太网多播地址。
6.5、非以太网本地网络模块的扩展
其它直接支持组播的网络,比如符合IEEE 802.2标准的环网和总线网络,它们可以实现像以太网那样的为实现发送IP多播数据报所做的操作。对于一个只支持广播而不支持多播的网络,例如实验性以太网,所有的IP组地址可能被眏射成唯一的一个本地广播地址(以增加所有本地主机的费用为代价)。对于一个连接两台主机(或者一台主机和一台多播路由器)的点对点连接,多播应该完全像单播一样工作。对于像ARPANET这样的存储转发网络,或者公共的X.25网络,所有的IP组地址应当被映射成IP多播路由器的一个熟知的本地地址。在这样的网络中,路由器应当负责完成在网络内,和网络间的组播传送。
7、接收组播IP数据报
7.1、IP服务接口的扩展
输入IP组播数据报是通过跟平常的单播数据报相同的IP接收操作被上层协议模块接收到的。上层协议类型的选择是基于IP首部中的协议字段,而不是目的IP地址。但是,在发送到特定的组的数据报能够被接收到之前,上层协议必须先让IP模块去加入这个组。这样,IP服务接口就必须被扩展以提供两个新的接口:
JoinHostGroup(group-address, interface)
LeaveHostGroup(group-address, interface)
JoinHostGroup操作使本机成为给定网络接口interface上由IP地址group-address标识的组的成员,而LeaveHostGroup操作使本机退出给定网络接口interface上由IP地址group-address标识的组。对于只支持一个网络接口的主机,interface参数可以被忽略。对于那些可能连向多个网络的主机,上层协议也有可能不指定interface参数,在这种情况下,这个请求会作用于发送IP多播数据报的那个缺省接口上(见6.1节)。
在多个接口上加入同一个组是允许的,在这种情况下,一台主机可能收到一个IP多播数据报的多份拷贝。同样,多个上层协议请求加入同一个组也是允许的。
这两个操作都会立即返回(它们不是阻塞性操作)成功或失败。任何一个操作都有可能因为组地址或者接口标识的缘故失败。JoinHostGroup可能因为缺乏本地资源而失败。LeaveHostGroup可能因为主机根本就不属于组定接口上的指定组而失败。如果多个上层协议请求加入了同一个组,那么LeaveHostGroup可能成功了,但是主机还是那个组的成员。
7.2、IP模块的扩展
为了支持IP多播数据报的接收,IP模块必须被扩展,维护一个关于每个网络接口上的组成员关系的列表。属于这些组之一的输入数据报的处理方式跟目的IP地址属于该主机某一个单播IP地址的输入数据报的处理方式是相同的。
对于那些不属于主机所在组的输入IP数据报,会被丢弃而不产生任何错误报告或日志。对于一个拥有多个网络接口的主机,如果输入数据报通过某一个接口到达,但是该数据报却是属于另一个接口上的某个组,这个数据报也会被丢弃(出现这种情况的唯一原因是本地网络模块的多播过滤功能不完整)。
如果一个输入数据报的IP生存时间(TTL)为1,它不会被拒收(也就是说,对于非转发的输入数据报,生存时间(TTL)是不会被自动减1的),如果一个输入数据报的IP首部的源地址字段是一个IP组地址,那该数据报会被丢弃。对于IP多播数据报,是不会产生ICMP差错报文的。
组成员关系的列表通过上层协议调用JoinHostGroup和LeaveHostGroup请求来更新。每一个成员关系都应当有一个引用计数或相似的机制来处理多次加入和离开同一个组的情况。在第一次请求加入和最后一次请求离开给定接口上的某一个组时,该接口的本地网络模块会被通知到,它就可以更新它的组播接收过滤(见7.3节)。
IP模块还需要被扩展,以实现附录1说明的IGMP协议。IGMP用于把某一特定本地网络中存在的组成员关系通过给邻接的多播路由器。为了支持IGMP协议,每个2级主机在初始化时就必须加入每一个网络接口上的“所有主机”组(地址224.0.0.1),而且在主机活跃期间,必须一直是这个组的成员。
多播路由器会把发往“所有主机”组的数据报作为一个特殊的例子处理,不管它的TTL是多少,从来不把它转发到另一个网络中。这样的话,“所有主机”组地址就不能作为整个因特网范围的广播地址。出于IGMP的目的,只有当主机属于其它的至少一个且的时候,才真正需要成为“所有主机”组的成员。但是文档又说明了主机在任何时候都必须保持为该组的成员,这是因为,第一,这样简单,第二,收到无用的IGMP查询不是很频繁,开销很低,可以忽略,第三,“所有主机”组地址可能服务于其于面向路由的一些应用,比如通知网关的存在或解析本地地址)。
7.3、本地网络服务接口的扩展
输入的本地网络多播数据报使用跟本地网络单播数据报同样的接收操作传给IP模块。为了能让IP模块告诉本地网络模块,哪些多播数据报是要接收的,本地网络服务接口必须进行扩展,提供以下两个接口。
JoinLocalGroup( group-address )
LeaveLocalGroup( group-address )
这里,group-address是一个IP组地址。JoinLocalGroup操作请求本地网络模块接收并向上传属于给定IP组地址的那些数据报,而LeaveLocalGroup操作则请求本地网络模块停止向上传属于给定IP组地址的数据报。本地网络模块应该能够把IP组地址映射到本地网络地址,这是更新多播接收过滤所要求的。任何一个本地网络模块,如果它不能正确地过滤输入数据报的话,都可以忽略LeaveLocalGroup请求,并且可以向上传比JoinLocalGroup所请求的地址更多的IP数据报。
本地网络模块不能向上传送任何由该模块发出的数据报,因为多播的环回是在IP层或更高的层做的。
7.4、以太网本地网络模块的扩展
为了支持多播IP数据报的接收,一个以太网模块必须能够接收由以太网多播地址标识的数据报,当然,该多播地址是跟主机的IP组地址对应的。充分利用以太网硬件接口所拥有的地址过滤功能是非常可取的,这样的话,主机就只会接收到属于它的数据报。
不幸的是,现在相当多的以太网接口的硬件被配置成可识别的地址的数量有一些小小的限制。而且一个具体的实现必须能够侦听任意数量的以太网多播地址,这就意味着在地址数量超过过滤器的限制的时候,必须关闭地址过滤以接收所有的多播数据报。
对于那些硬件地址过滤功能不强的接口,在以太网模块的软件中进行以太网地址过滤可能会更好些,但这不是强制的,因为IP模块会基于IP地址进行它自己的过滤。
7.5、非以太网本地网络模块的扩展
其它的多播网络,比如IEEE 802.2网络,可以跟以太网一样地处理多播IP数据报的接收。对于纯粹的广播网络,比如实验性以太网,所有的输入广播数据报必须被接收并传给IP模块,由IP层过滤。在点对点或者存储转发网络中,多播IP数据报跟本地单播一样,所以,本地网络模块不需要作任何修改。
附录1、因特网组管理协议(IGMP)
因特网组管理协议(IGMP)被IP主机用于向与它们邻接的多播路由器报告它们的组成员关系。IGMP是一个不对称的协议,这里将从一台主机的角度,而非一个多播路由器的角度来来说明。(IGMP也可以在多播路由器之间,进行对称或非对称地使用,这种应用不在这里说明)。
像ICMP一样,IGMP被整合为IP的一部分。符合2级IP多播标准的主机都必须实现它。IGMP信息被封装在IP数据报中,IP协议号是2。主机所关心的所有IGMP信息的格式如下:
4位版本+4位类型+8位未使用+16位校验和+32位组地址
版本:本文档说明的是IGMP的版本1,版本0在RFC-988中说明,已废弃。
类型:主机关心的IGMP信息有两种类型:1-主机成员关系查询,2-主机成员关系报告。
未使用:发送的时候置0,接收的时候忽略。
校验和:校验和是对整个IGMP报文以16位为一段进行取反求和计算得到的,在计算校验和之前,校验和字段必须被清0。
组地址:在组成员关系查询信息中,组地址字段在发送前被清零,接收时被忽略。在组成员关系报告信息中,组地址字段中存放的是被报告组的IP组地址。
非正式的协议描述
多播路由器发送主机组关系查询报文(以下称称查询),以发现与它们直接相连接的网络中哪一个组已经拥有成员,查询发给“所有主机”组(地址224.0.0.1),IP生存时间设置为1。
主机对查询作出响应,产生一个主机组成员关系报告(以下简称报告),报告收到查询的那个网络接口上所在的所有组,为了避免并发报告爆炸,减少被传送的报告的总数,使用了两种技术:
1、当主机收到一个查询,它不会立即发送一个报告,它会在收到查询的那个网络接口上为每一个组成员关系都产生一个时间延迟,是在0和D秒之间的一个随机数,当定时器超时,那么相应的组的报告就会产生。这样的话,所有的报告会分散在一个D秒的时间间隔内,而不会同时并发。
2、被发送的报告的目的IP地址等于它所要报告的组的组地址,IP生存时间设为1,这样的话,同一网络内,同一组的其它成员都可以侦听到该报告。如果一台主机收到一个同一网络内自己所在组的报告,这台主机就中止它自己的定时器,不再为这个组产生一个报告了,这样的话,正常情况下,同一网络内,每一个组只会产生一个报告,这个报告是由网络内第一台超时的主机产生的。需要注意的是,多播路由器接收所有的IP多播数据报,所以不需要明确地指明它的地址。还需要注意的是,路由器不需要知道哪些主机属于某个组,它只需要知道某一特定的网络内至少有一台主机属于某个组就可以了。
对以上描述的行为,有两个例外。首先是如果一个查询到达的时候,这个组成员关系的报告延时定时器已经被启动了,那么这个定时器的超时值不会被重置为一个新的随时数,而是在它当前值的基础上继续运行。其次,对于所有组(224.0.0.1)的成员关系,没有延时报告定时器,也永远不会被报告。
如果一台主机使用一个伪随时数产生器来计算报告延时,那么主机的某一个单播IP地址需要被作为随时种子的一部分,以减少多台主机产生同一个随时序列的机会。
主机需要确认收到的报告的目的IP地址字段和它的IGMP组地址字段具有相同的IP地址,以确保主机自己的报告不会因为收到一个错误的报告而被中止。对于那些不是主机成员关系查询和主机成员关系报告的IGMP消息,主机应当把它丢弃。
多播路由器周期性地发送查询以刷新它的关于某个特定网络内组成员关系的知识。如果在发送一定数量的查询之后,关于某个组的成员报告一直没有收到,那么路由器就假定该网络内已经没有该组的成员了,它就不必再把远程的该组内的多播数据报转发到这个网络内了。通常查询的发送不会很频繁(不多于1分种1次),以保证IGMP对主机和网络的开销都非常低。但是,当一个多播路由器启动的时候,它为了快速建立对于本地网络内的组成员关系的信息,会发几个时间间隔很小的请求。
当一台主机加入一个新的组,有可能它会是这个网络内这个组的第一个成员,所以,以防万一,它应当立即发送一个关于这个组的报告,而不是等待请求。有可能最初的报告会被丢失或损坏,所以建议在一个短的时间间隔后,重复发送该报告一到两次(一个简单的实现方法是就像收到了关于这个组的查询一样,设置组的随时延时报告定时器,下面的状态变换图解释了这种方法)。
需要注意的是,在一个不存在多播路由器的网络中,唯一的IGMP传输是当一台主机加入一个新的组时,一个或多个报告会被发出来。
状态变换图
通过下面的状态变换图,将更加正式地说明IGMP的特性。一台主机会处于三种可能的状态之一,这与某一个网络接口上的某一个IP组地址有关:
-非成员状态。当主机不属于网络接口上的组时,这是所有网络接口上的所有成员的初始状态;它不需要主机的存储空间。
-延迟成员状态。当一台主机属于网络接口上的某一个组,并且正在为这个组运行延迟报告定时器时,就处于这个状态。
-空闲成员状态。当一台主机属于网络接口上的某一个组,并且已不在为这个组运行延迟报告定时器时,就处于这个状态。
有五类重要的事件会造成IGMP状态的变化:
当主机决定加入某一接口上的某个组时,会发生“加入组”事件。它只有在“非成员状态”时发生。
当主机决定离开某个接口上的某个组时,会发生“离开组”事件。它只有在“延迟成员状态”和“空闲成员状态”时发生。
当主机收到一个有效的IGMP组成员状态查询信息时,会发生“接收到查询”事件。这个查询信息必须至少有8个字节的长度,有一个正确的IGMP校验和和一个224.0.0.1的目的IP地址,才是有效有。单个查询会作用于收到查询的那个接口上的所有组成员关系,“非成员状态”和“延迟成员状态”的组成员关系会被忽略。
当主机收到一个有效的IGMP组成员关系报告信息时,会发生“接收到报告”事件。这个报告信息必须至少有8个字节的长度,有一个正确的IGMP校验和,在它的目的IP地址字段和IGMP组地址字段必须有一个相同的组地址,它才是有效的。一个报告只作用于收到报告的那个网络接口上的,该报告所标识的那个组。“非成员状态”和“空闲成员状态”的组成员关系会被忽略。
当某个接口上的一个组的报告延时定时器超时时,会发生“定时器超时”事件。它只会在“延迟成员状态”发生。
所有的其它事件,比如接收到一个无效的IGMP信息,或者不是查询或请求的IGMP信息,在这三种状态中都会被忽略。
应对上述的事件,有三种可能的行为会发生:
-对接口上的组“发送报告”。
-使用0到D秒之间的一个随时延迟,为接口上的组“启动定时器“。
-为接口上的组中止定时器。
在下面的图中,每个状态变换的箭头上都标识了引起这次状态变换的事件,在括号里标识了在这次状态变换中的行为。
————————————
| 非成员 |
----->| |<-----
| ---------------------------------- |
离开组 | |加入组 |
(关闭定时器)| |(发送报告, |离开组
| | 启用定时器) |
_____|_____ | _________|____
|延迟成员 |<------ |空闲成员 |
| |收到查询( | |
| |启用定时器) | |
| |<-----------------------| |
| |----------------------->| |
| |收到报告( | |
| |中止定时器) | |
| |----------------------->| |
| |定时器超时 | |
-----------------(发送报告) ----------------------
“所有主机”组(地址224.0.0.1)作为一个特殊的例子处理。主机一开始就在所有的网络接口上处于空闲成员状态,从不转换到其它状态,也从不发送报告。
协议参数
最大报告延迟D是10秒。
附录2:关于组地址
本附录不是IP多播规范的一部分,但它提供几点跟IP组地址相关的背景讨论。
组地址绑定
将一个IP组地址绑定到一台物理主机的过程可以看作是IP单播地址绑定的一般化处理。一个IP单播地址被静态地绑定到单个IP网络中的单个本地网络接口上。一个IP多播地址被动态地绑定到一组IP网络中的一组本地网络接口上。
很重要的一点是需要理解IP组地址不是被绑定到一组IP单播地址上,多播路由器不需要为每一个组维护一个成员的列表。比如连接到一个以太网的多播路由器,它只需要把单个的以太网组播地址跟一个有本地成员的组联系起来即可,而不需要一个成员的IP地址列表或以太网地址列表。
分配临时组地址
这份文档没有说明临时组地址是如何被分配的,可以肯定地一点是不同部分的临时IP组地址空间会使用不同的技术进行分配。比如有一定数量的服务器,可以申请一个新的临时组地址互相通讯。一些高层协议(比如RFC-1045的VMTP协议)可能会产生高层的临时“进程组”或“实体组”的地址。这些地址通过算法被映射成临时IP组地址的子集。跟IP组地址被映射成以太网多播地址的方法相似。IP组地址空间的一部分被保留,被应用程序进行随时分配,这些应用程序可能能够容忍组地址跟其它的多播用户冲突,或者另外寻找新的地址,直到找到合适的。
一般来讲,主机不能假定发往任意组地址的数据报只会到达预期的主机,换句话说,就是作为一个临时组成员接收的数据报只到达它的接收者。所以,IP层以上必须使用高层的一些标识和认证手段,对错误的传输作检测。如果发送者不希望信息被非预期的接收者接听到,那么发往一个组的信息必须被加密或者通过路由控制来管理。