1.6 IPv6对多播的支持
新一代因特网协议IPv6则希望利用改换网络层协议的机会保证多播功能在所有的IPv6结点上都可以提供。IPv6定义了所有路由器都应该识别的一个多播地址格式,把IPv4的IGMP功能加进IPv6的基本ICMP协议,并且保证所有的路由器都能够为多播分组选择路由。
1.6.1 IPv6多播地址
新一代因特网协议IPv6要求在所有的IPv6结点上都支持多播,其运行机制跟IPv4多播基本相似,它们的主要不同点是在地址格式上。
IPv6多播地址是一组接口(典型地在不同的结点上)的标识符。一个接口可以属于任意多个多播组。多播地址具有如图1-7所示的格式。
图1-7 IPv6多播地址格式
在地址开始的8位二进制11111111标识该地址是多播地址,下面将重点介绍其后的3个域。
1.标志域
标志域是一组4个标志(参见图1-8)。在许多重要的多播中,所有的标志都被置成0。最高序(1个标志)保留,必须初始化成0。
图1-8 标志域格式
(1)T
第4位用T表示,它是Transient(暂时)的缩写。当该位置成0时,表示由全局因特网号码管理委员会分配的周知地址,也称永久分配的地址,它的含义是独立于范围的。当该位置成1时,表示一个非永久分配的暂时地址;当一个组决定进行一次多播会话时,它请求会话目录工具随机地选择一个地址;这个随机地址的唯一性由一个冲突检测算法验证;一旦会话终止,该地址就会被释放。
(2)P
P=1是一个基于网络前缀的多播,表示在多播地址中嵌入了单播前缀(参见图1-9上部),此时T必须是1。网络前缀部分最多64位。基于单播前缀的多播地址的范围必须不超过在该多播地址中嵌入的单播前缀的范围。P=0表示所分配的多播地址不是基于网络前缀的。当P=0时地址的前缀长度域和网络前缀域都是组标识符的一个部分。
(3)R
R标志为全局路由的多播指定会合点(Rendezvous Points)。R=1表示在多播地址中嵌入了会合点接口标识(参见图1-9下部),此时,P和T也必须等于1(是基于网络前缀,但非永久分配)。R=0表示在多播地址中没有嵌入会合点接口标识。
图1-9 基于单播前缀的多播地址格式
会合点的地址可以从符合上述标准的多播地址通过执行下列两个步骤(参见图1-10)得到。
图1-10 会合点地址
①复制“网络前缀”的开头“前缀长度”个位到一个128位全0的地址结构。
②用“RIID”的内容代替所建立的128位地址结构的最后4位。
2.范围域
范围是4位多播范围值,用以限制多播组的范围。该值含义如下。
0:保留
1:结点本地范围
2:链路本地范围
3:保留
4:管理本地范围
5:场点本地范围
6:(未分配)
7:(未分配)
8:组织本地范围
9:(未分配)
A:(未分配)
B:(未分配)
C:(未分配)
D:(未分配)
E:全局范围
F:保留
结点本地范围仅限于一个结点的单个接口,仅对回环多播传输有用。
链路本地范围与对应的单播范围跨越同样的拓扑区域。
管理本地范围是必须被管理配置的最小范围,也就是说,它不是从物理连接或其他非多播相关的配置自动获得的。一般说,该范围小于场点本地范围。
场点本地范围仅覆盖单个场点。
组织本地范围跨越属于单个组织的多个场点。
标有“未分配”的范围可提供给管理员定义附加的多播区域。
3.组ID域
组ID标识在给定范围内的多播组(永久的或临时的)。
非永久分配的多播地址仅在一个给定的范围内有意义。例如,如果“NTP服务器组”被分配一个带有组ID 101(十六进制值)的非永久的多播地址,那么在一个场点用非永久的场点本地多播地址FF15::101标识的组,跟在不同的场点使用同样的地址的组没有关系,跟使用同样的组ID具有不同的范围的一个非永久组没有关系,跟具有同样的组ID的一个永久组也没有关系。
多播地址不可以用作IPv6分组的源地址,也不可以出现在任何路由选择头中。路由器必须不把任何多播分组转发到在目的地多播地址中的范围域所表示的范围之外。
结点不可以源发一个分组到其范围域包含保留值0和3的多播地址;如果收到这样的一个违例分组,必须静静地将其丢弃。结点不可以源发一个分组给其范围域包含保留值F的多播地址;如果发送了或接收到这样的一个分组,它必须被当作跟目的地为全局(范围E)多播地址的分组同样对待。
下面列出的是保留的多播地址。
FF00::,FF01::,FF02::,FF03::,FF04::,FF05::, FF06::,FF07::,FF08::,FF09::,FF0A::,FF0B::, FF0C::,FF0D::,FF0E::,FF0F::。
这些地址尽管范围不同,但组ID都是0。它们永远不被分配给任何多播组。
IANA已经分配了用于IPv4多播过程的一个组标识符列表。负责这项工作的Bob Hinder和Steve Deering提出在IPv6内把这些标识符保留做同样的使用。完全列表由IANA维护,可以从其Web场点www.iana.org访问。
下列众所周知的多播地址是已经定义了的。它们的组ID是为明确的范围值定义的。把这些组ID用于T标志值为0(表示永久)的任何其他范围都是不被允许的。
● 所有结点地址
FF01::1,FF02::1
上述多播地址分别标识在范围1(结点本地)和范围2(链路本地)内的所有IPv6结点组。
● 所有路由器地址
FF01::2,FF02::2,FF05::2
上述多播地址分别标识在范围1(结点本地)、范围2(链路本地)和范围5(场点本地)内的所有IPv6路由器组。
● 被征求的结点地址
FF02::1:FFxx:xxxx(链路本地)
被征求的结点的多播地址是作为一个结点的单播和任播地址的一个函数进行计算,它的形成是取一个地址(单播或任播)的低序24位,再把这些位附接到前缀FF02:0:0:0:0:1:FF00:0/104,产生一个在下列范围里的多播地址。
FF02:0:0:0:0:1:FF00:0000
至
FF02:0:0:0:0:1:FFFF:FFFF
例如,对应于IPv6地址4037::01:800:200E:8C6C的被征求结点多播地址是FF02::1:FF0E:8C6C。
仅仅在高序位不同的IPv6地址(例如由于多个高序位前缀跟不同的聚合相关联)将被映射到同样的被征求地址。一个结点必须计算和加入(在适当的接口上)跟其被分配的每个单播和任播地址相关联的被征求的结点多播地址。这样,即使前缀改变了(例如改变ISP),该结点也能接收到IP分组。
暂时地址主要也是在为具体的范围和使用保留的区域内随机地选取。起初的规范就定义了一个这样的区段,从FF0X:0:0:0:0:0:2:8000到FF0X:0:0:0:0:0:2:FFFF,用于多媒体会议。这些地址的唯一性由会话通告协议(Session Announcement Protocol,SAP)保证。要为一个多媒体会议分配一个多播地址的站将要进行下列操作。
①加入该SAP组,更准确地讲,加入对应各种媒体将要使用的每个范围的多个多播组。
②选取一个随机的组标识符。该标识符应该属于指定的范围,并且应该尚未被另一个会议使用。
③通过给该SAP组发送一个报文宣告该会议及其地址。该宣告将定期重复,直至会议结束。会议结束时,该多播地址将被释放,可被另一个会议再度使用。
1.6.2 把IPv6多播地址映射到MAC地址
为了在局域网上发送多播分组,我们必须从IPv6多播地址自动产生一个IEEE-802 48位多播地址。现在的方法是在IPv6多播地址的最后32位的前面附加一个固定的16位前缀得以完成。这样,不是基于网络前缀的IPv6多播地址就如图1-11(a)中所示的那样,其多播标识符域总是在低序32位;而基于网络前缀的IPv6多播地址就如图1-11(b)中所示的那样。
图1-11 现在的IPv6多播地址采用32位的组标识符域
这样也就把IPv6多播组的数目限制到232,即使在未来也不太可能有什么问题。若未来突破了这个限制,还可以从保留位中扩充,只不过处理起来要慢一点。不过,对于基于网络前缀的IPv6多播地址,由于网络前缀的最大长度是64位,因此允许组标识符域的最大长度是40位。
对于IEEE-802簇系介质,比如以太网或FDDI,通过串接一个固定的16位前缀(3333 H)和IPv6的多播地址的最后32位得到48位多播地址(参见图1-12)。这个前缀被保留用于IPv6。
图1-12 在IEEE-802网络中一个多播地址的映射
1.6.3 IPv6的组管理协议
在IPv4中,主机使用一个称作IGMP的协议加入多播组,IPv6则是通过扩展的ICMP协议执行同样的功能。它们使用这类协议通知在本地网络上的路由器关于要接收发送给某个多播组的分组的愿望。
ICMP的IPv6版本包括三个组成员关系报文。
● 类型130,组成员关系查询。
● 类型131,组成员关系报告。
● 类型132,组成员减少。
以上这些等效于在RFC 1118中定义的IPv4 IGMP报文。所有这些报文(参见图1-13)都具有同样的格式。
图1-13 组管理ICMP报文
类型段将被设置成130、131或132,分别表示成员关系查询、报告或终止。编码段总是设置成0,表示成未使用的。检验和域就是常规的ICMP检验和。
站参加一个组的过程跟IPv4相同。若要测试本地站组的成员关系需要向路由器发送一个成员查询,若是一个组成员的站,则用一个组成员关系报告响应。
查询可以集中到一个特别的组,在这种情况下分组将被发送给那个组的地址。同样的地址将在作为ICMP参数的地址域中重复。路由器也可以发送指向所有组的广泛查询。这些查询将被发送给链路本地所有结点的多播地址,ICMP报文的参数(地址段)将被设置成未指定的地址0::0。
由站发送的报告总是发送给被报告的同一个组。组地址也被复制在ICMP报文参数中。这一过程的目的是避免重复报告。一个站一旦报告了对该组的成员关系,其他的每个站都接收它,并且知道没有必要发送附加的报文报告。
在查询报文中,最大响应延迟域表示响应的报告报文可以被延迟的最长时间,以毫秒为单位。在收到查询时,假定要报告其成员关系的站取在0和这个最大响应延迟之间的一个随机值。然后它等待,如果延迟时间过了,就发送响应;如果在此延迟时间之前有另一个站发送了报告,就关闭计时器。在报告和终止报文中最大响应延迟设置成0。
为了加快多播路由表的更新,离开一个组的站发送组成员终止报文。它们被发送到整个组,使剩余的站可以立即通知路由器在本地链路上还存在着一些组成员。