本节书摘来自异步社区《IPv6精髓(第2版)》一书中的第3章,第3.10节,作者: 【美】Silvia Hagen 更多章节内容可以访问云栖社区“异步社区”公众号查看。
3.10 多播地址
本节主要讨论多播地址的格式,有关多播以及多播侦听者发现(Multicast Listener Discovery,MLD)或多播组管理(Multicast Group Management)的内容请参见第4章。
多播地址是由高阶字节FF(或二进制1111 1111)标识的一组节点(如表3-2所示)。一个节点可以属于一个或多个多播组。将数据包发送给多播地址时,该多播组的所有成员都要处理该数据包。IPv4中虽然也有多播,但是IPv6对多播做了重新定义和改善。多播地址的格式如图3-9所示。
第一个字节表示该地址是多播地址,接下来的4比特是标志(Flag)字段,定义如下:标志字段的第一个比特必须为0,保留给将来使用;第二个比特指示该多播地址是否内嵌了RP(Rendezvous Point,聚合点),RP是多播网络中指定多播流的分发点(RFC 3596);第三个比特指示该多播地址是否内嵌了前缀信息(本章将在后面进行讨论,RFC 3306);标志字段的最后一个比特指示该多播地址是永久分配的多播地址(如由IANA分配的周知多播地址)还是临时多播地址。范围(Scope)字段的作用是限定多播地址的范围,取值情况如表3-5所示。
https://yqfile.alicdn.com/de8ef2ef7958d81f8e4a8763098993e21db9a01b.png" >
3.10.1 周知多播地址
根据RFC 4291,多播地址中的最后112比特是多播组ID(group ID)。在上一个版本的规范中,组ID被限定为32比特,以简化组地址到MAC地址的映射。RFC 3307“Allocation Guidelines for IPv6 Multicast Addresses”采用的就是32比特组ID。在实际应用中,通常也都将组ID限定为32比特。
RFC 2375定义了最初永久分配的IPv6多播地址。某些多播地址有固定的范围,而某些多播地址则适用于所有范围。表3-6列出了已分配的有固定范围的周知多播地址。请注意,表3-5列出的范围值位于多播标识符FF(第一个字节)之后。
https://yqfile.alicdn.com/0e8017a7e143424edde2335055f76b48335bfd78.png" >
由于RFC 2375中的术语“节点本地范围(node-local scope)”已被更改为“接口本地范围(interface-local scope)”,因而大家有时可能会同时遇到这两个术语。与范围无关的已分配的永久多播地址列表非常长,可以参考本书附录和RFC 2375。这些地址都以FE0X开头,其中,X是一个范围值可变的占位符。
IPv4的广播地址被替换成链路本地范围的全部节点多播地址FF02::1。IPv6没有与IPv4的子网广播地址相对应的地址。
下面来看一个RFC 2373中描述的多播地址。这里为全部NTP服务器定义了一个多播组ID,该多播组ID是0x101。该组ID与不同的范围值结合得到不同的多播地址。
FF01:0:0:0:0:0:0:101
同一个节点上的全部NTP服务器都作为发送端。
FF02:0:0:0:0:0:0:101
同一条链路上的全部NTP服务器都作为发送端。
FF05:0:0:0:0:0:0:101
同一个站点上的全部NTP服务器都作为发送端。
FF0E:0:0:0:0:0:0:101
Internet上的全部NTP服务器。
临时分配的多播地址仅在限定范围内有意义。
提示
多播地址不应该被用作IPv6包的源地址,也不应该出现任何路由报头中。
IPv6利用基于ICMPv6的MLD来管理多播。如果希望了解如何管理多播地址,可以参见第4章中的“MLD”一节。
3.10.2 请求节点多播地址
请求节点多播地址(solicited-node multicast address)是每个节点都必须为其每个单播地址和任播地址加入的多播地址,通常用于邻居发现进程(详见第4章)。请求节点多播地址的相关规范定义在RFC 4291中。
对IPv4来说,ARP请求(用于确定接口的MAC地址)会被发送到MAC层广播地址,因而链路上的每个接口都要处理该消息。而对IPv6来说,解析接口MAC地址的工作是通过向请求节点多播地址(而非链路本地范围内的全部节点多播地址)发送邻居请求(Neighbor Solicitation)消息(详见第4章)来完成的。通过这种方式,只有注册到该多播地址的节点才会检查该数据包。
该地址的构成方式是将IPv6地址的低阶24比特(主机ID的最后部分)附加到周知前缀FF02:0:0:0:0:1:FF00::/104上,因而请求节点多播地址的取值范围从FF02:0:0:0:0:1: FF00:0000到FF02:0:0:0:0:1:FFFF:FFFF。
例如,主机Marvin的MAC地址为00-02-B3-1E-83-29,IPv6地址为fe80::202:b3ff: fe1e:8329,相应的请求节点多播地址就是FF02::1:ff1e:8329。如果该主机有其他IPv6单播地址或任播地址,那么每个地址也都一个相应的请求节点多播地址。
3.10.3 多播地址的动态分配
RFC 3306扩展了多播地址的体系,允许分配基于单播前缀的多播地址(unicast prefix-based multicast addresses)和指定源多播地址(source-specific multicast addresses)。该规范基于修改后的包含了前缀信息的多播地址格式,其目标是减少需要分配多播地址的协议数量。
图3-10给出了扩展后的多播地址格式。
https://yqfile.alicdn.com/dcf6c794361c9c83610b4e7660ee84994093b66f.png" >
在最初的规范中,标志字段仅使用最后一个比特(T)来指示该多播地址是永久分配的周知多播地址还是临时多播地址。这里给出的扩展后的多播地址格式使用倒数第二个比特(P)来指示该多播地址基于网络前缀(值为1)还是不基于网络前缀(值为0)。P比特为1表示这是一个遵循扩展格式的多播地址。范围字段的使用方式没有变化,如果P标志为1,那么范围字段后面的8比特就被保留且被置为0。接下来的8比特(PLen)指定了前缀字段中的前缀长度。如果前缀长度小于64比特,那么前缀字段中的其他未用比特都应该被置为0。组ID为32比特。请注意,如果P比特为1(扩展的多播地址),那么T标志也应该被置为1(临时多播地址)。
有关指定源多播地址的信息可参考RFC 3569。在传统的被称为ASM(Any-Source Multicast,任意源多播)的多播模型中,多播侦听者无法控制从哪个多播源接收数据。有了SSM(Source-Specific Multicast,指定源多播)之后,接口就可以注册到多播组并为数据指定源端。利用MLDv2和扩展的多播地址格式即可实现SSM。
提示
有关多播和MLD的更多信息请参见第4章。
对于指定源多播地址来说,T标志和P标志均为1,前缀长度和网络前缀均为0,因而相应的多播地址是FF3X:/32,其中X是范围值。IPv6报头中的源地址标识该多播地址的所有者,所有SSM地址的格式都是FF3X::/96。
目前有一个草案标准对IPv6协议的多播地址体系做了扩展。该扩展可以使用接口标识符来分配链路本地范围的多播地址。该草案标准是draft-ietf-ipv6-link-scoped-mcast-09.txt,在本书印刷之前即将成为RFC。在该多播地址中,标志字段被设置为二进制0011;范围字段被设置为2,表示链路本地范围;PLen字段被设置为FF(二进制全1);64比特网络ID字段被用作接口标识符。生成的组ID标识多播应用,而且只要在该主机上具有唯一性即可。