《IPv6精髓(第2版)》——3.9 任播地址

本节书摘来自异步社区《IPv6精髓(第2版)》一书中的第3章,第3.9节,作者: 【美】Silvia Hagen 更多章节内容可以访问云栖社区“异步社区”公众号查看。

3.9 任播地址

任播地址的作用是在多台主机或多台路由器提供相同服务的场合下实现冗余性和负载均衡机制。任播并不专用于IPv6,早在1993年的RFC 1546中就已经将任播定义为用于IPv4的试验性规范。该规范为任播定义了专用前缀,使得通过该前缀即可识别任播地址。任播主要应用于DNS和HTTP等服务。为了正确处理这些非全局唯一的地址,该RFC还讨论了需要对TCP做的可能修改。

但是在实际应用中,任播并没有得到所期望的实现和使用。通常使用的是一种被称为共享单播地址(shared unicast address)的方法。该方法通过将一个普通单播地址分配给多个接口并在路由表中创建多个路由表项。在这种情况下,网络层和传输层都将其视为全局唯一的IP地址。如果不是,那么应用程序中就必须内嵌处理这种有歧义地址的相关机制。一种例外情况就是应用程序采用了独立的无状态请求/应答处理方式,如DNS over UDP。Internet上的根DNS就是使用共享单播地址设立的,该过程无需网络层的任何支持,也能用于IPv6。

IPv6开发人员在设计之初就考虑如何根据RFC 1546将任播融合到网络层中,因而没有为任播分配特殊前缀。IPv6任播地址空间与全局单播地址完全相同,因而必须为任播参与接口明确说明所配置的是任播地址。在接口包含相同任播地址的区域中,必须在路由表中将每台主机都宣告为一条独立的表项。如果多播接口没有可定义的区域,那么就要通过Internet传播所有的任播表项(这是最坏的一种情况),因而建议不使用或严格限制这类全局任播地址。

如果网络中的一组路由器都能提供访问公共路由域的能力,那么就可以为这组路由器分配单个地址。客户端向该地址发送数据包时,会被依次转发给可用路由器。一个例子就是RFC 3068中定义的6to4中继任播地址(将在第10章讨论)。移动IPv6规范也使用了任播地址。

需要注意到是,使用任播地址时,发送端无法控制将数据包发送到特定接口,该决策是在路由协议层面确定的。发送端向任播地址发送多个数据包的时候,数据包可能会到达不同的目的端。因此,如果是一系列请求和应答消息或者数据包被分段了,任播就可能会出现问题。

子网路由器任播地址(subnet-router anycast address)是一个必需的任播地址(定义在RFC 4291中),其地址格式如图3-7所示。


《IPv6精髓(第2版)》——3.9 任播地址

从本质上来看,该地址看起来与普通的单播地址很相似,只是将子网和标识符指定为全0。发送给该地址的数据包会被传送给子网上的某一台路由器。对于路由器接口所连接的子网来说,所有路由器都必需支持子网路由器任播地址。

RFC 2526提供了有关任播地址格式的更多信息,并指定了其他保留的子网任播地址和ID。保留的子网任播地址有两种格式(详见图3-8)。

RFC 2526规定,每个子网中最高的128接口标识符值保留给子网任播地址。目前已保留的任播ID列在表3-4中。


《IPv6精髓(第2版)》——3.9 任播地址


《IPv6精髓(第2版)》——3.9 任播地址https://yqfile.alicdn.com/ccb30fdbb810c667f4c2b44dabf36af7e219d4c3.png" >

任播地址与共享单播地址在使用上的主要区别在于,使用共享单播地址时,应用必须支持任播,而使用任播地址时,应用可以不支持任播,因而需要有相应的使用指南并说明如何对现有的状态化传输协议进行修改。Draft-doi-ipv6-anycast-func-term-05.txt描述了IPv6任播的使用条件以及使用要点。

上一篇:JavaScript中的内存泄漏以及如何处理


下一篇:24.NAT地址转换技术