RFC4291下的IPv6地址架构揭秘

RFC4291下的IPv6地址架构探究

作者:Once Day 日期:2025年6月15日

本文译自RFC 4291 - IP Version 6 Addressing Architecture,文章聚焦IPv6的基础概念,属于IPv6协议的入门讲解。

文章目录

      • RFC4291 IP Version 6 Addressing Architecture
      • 1. 概览
        • 1.1 本备忘录状况
      • 1.2 版权声明
      • 1.3 总结
      • 2. IPv6编址
        • 2.1 地址模型
      • 2.2 地址的文本展现
      • 2.3 地址前缀的文本呈现
      • 2.4 地址类型标识
      • 2.5 单播地址
        • 2.5.1 接口标识符
        • 2.5.2 未指定地址
        • 2.5.3 回环地址
        • 2.5.4 全局单播地址
        • 2.5.5 嵌入IPv4地址的IPv6地址
        • 2.5.6 链路本地IPv6单播地址
        • 2.5.7 站点本地IPv6单播地址
      • 2.6. 任播地址
        • 2.6.1. 必需任播地址
      • 2.7. 多播地址
        • 2.7.1. 预定义多播地址
      • 2.8. 节点的必需地址
      • 3. 安全考量
      • 4. IANA相关事项
1. 概览
1.1 本备忘录状况

此文档为互联网社区确立了一种处于互联网标准轨道的协议,同时征求对该协议改进的讨论与建议。关于该协议的标准化状态等情况,可参考当前版本的《互联网官方协议标准》(STD 1)。本备忘录的分发不受限制。

1.2 版权声明

版权归互联网协会所有,时间为2006年。

1.3 总结

本规范明确了IPv6(互联网协议第6版)的编址架构。文档内容涵盖IPv6编址模型、IPv6地址的文本表示方式、IPv6单播地址、任播地址以及多播地址的定义,还有IPv6节点的必需地址等。该文档替代了RFC 3513《IPv6编址架构》。

2. IPv6编址

IPv6地址是用于标识接口及接口集合的128位标识符(“接口”的定义可参考[IPV6]第2节)。地址分为三类:

单播(Unicast)

用于标识单个接口。发送至单播地址的数据包会被转发到该地址所标识的接口。

任播(Anycast)

用于标识一组接口,这些接口通常属于不同节点。发送至任播地址的数据包会被转发到该地址所标识的其中一个接口,选择依据是路由协议的距离度量,会选“最近”的接口。

多播(Multicast)

用于标识一组接口,这些接口通常属于不同节点。发送至多播地址的数据包会被转发到该地址所标识的所有接口。

IPv6中不存在广播地址,其功能由多播地址替代。

文档中,地址字段被赋予特定名称,例如“子网”。当名称后接“ID”(如“子网ID”)时,指该命名字段的内容;当接“前缀”(如“子网前缀”)时,指从地址左侧开始直至该字段(含)的全部内容。

在IPv6中,除非有特别排除,任何字段的合法值均可为全零或全一。具体来说,前缀可能包含以零值字段结尾的情况。

2.1 地址模型

所有类型的IPv6地址都分配给接口,而非节点。IPv6单播地址标识单个接口,由于每个接口属于唯一节点,该节点任意接口的单播地址均可作为节点标识符。

所有接口必须至少拥有一个链路本地单播地址(其他必需地址见2.8节)。单个接口可同时拥有多种类型(单播、任播、多播)或不同作用域的IPv6地址。对于不用于与非邻居节点收发IPv6数据包的接口,无需配置作用域大于链路范围的单播地址,这对端到端接口尤为便利。该编址模型存在一个例外情况:

若实现将多个物理接口在网络层视为单个接口,则可向这些接口分配单个或一组单播地址。此特性适用于通过多物理接口实现负载分担的场景。

当前IPv6沿用IPv4模型,即子网前缀与一条链路关联,同一链路可分配多个子网前缀。

即使接口仅用于本地通信,也必须配置链路本地地址(如FE80::/10前缀地址),以确保链路层通信的基础可达性。

2.2 地址的文本展现

IPv6地址以文本字符串表示时有三种常规形式:

(1)首选格式
格式为x:x:x:x:x:x:x:x,其中每个x为地址中8个16位段的1~4位十六进制数字。示例:
* ABCD:EF01:2345:6789:ABCD:EF01:2345:6789
* 2001:DB8:0:0:8:800:200C:417A

注意:单个字段中的前导零无需书写,但每个字段至少保留一位数字(除非符合第2点描述的情况)。

(2)零压缩语法
由于部分IPv6地址分配方式会产生长串零位,为简化书写,可用特殊语法压缩连续零段:
* 用::表示一个或多个16位零组,且每个地址中::只能出现一次,可用于压缩地址中的前导或trailing零。

原始地址 压缩后地址 类型说明
2001:DB8:0:0:8:800:200C:417A 2001:DB8::8:800:200C:417A 单播地址
FF01:0:0:0:0:0:0:101 FF01::101 多播地址
0:0:0:0:0:0:0:1 ::1 回环地址
0:0:0:0:0:0:0:0 :: 未指定地址

(3)IPv4 - 兼容混合格式
在IPv4/IPv6混合环境中,可用x:x:x:x:x:x:d.d.d.d格式。前6个x为地址高6个16位段的十六进制值,后4个d为低4个8位段的十进制值(标准IPv4表示法)。示例:
* 完整格式:0:0:0:0:0:0:13.1.68.30:0:0:0:0:FFFF:129.144.52.38
* 压缩格式:::13.1.68.3::FFFF:129.144.52.38

2.3 地址前缀的文本呈现

IPv6地址前缀的文本表示方式类似于无类别域间路由(CIDR)记法中IPv4地址前缀的写法。IPv6地址前缀的表示格式为:

ipv6-address/prefix-length

其中:
* ipv6-address:采用2.2节中任意一种记法表示的IPv6地址。
* prefix-length:一个十进制数值,表示地址中左侧连续多少位构成前缀。

合法与非法表示示例:

前缀描述 合法表示示例 非法表示示例
60位前缀20010DB80000CD3 2001:0DB8:0000:CD30:0:0:0:0/602001:0DB8::CD30:0:0:0:0/602001:0DB8:0:CD30::/60 2001:0DB8:0:CD3/602001:0DB8::CD30/602001:0DB8::CD3/60

错误原因:
1. 压缩后的段必须保持16位对齐。
2. ::扩展后前缀长度不足60位。
3. 压缩导致非末尾段的零被移除。

当同时表示节点地址及其子网前缀时,可采用以下简化方式:
* 节点地址:2001:0DB8:0:CD30:123:4567:89AB:CDEF
* 子网前缀:2001:0DB8:0:CD30::/60

组合缩写:

2001:0DB8:0:CD30:123:4567:89AB:CDEF/60
2.4 地址类型标识

IPv6地址的类型通过地址的高位比特进行标识,如下所示:

地址类型 二进制前缀 IPv6表示法 章节
未指定地址 全0(128位) ::/128 2.5.2
回环地址 00…1(128位) ::1/128 2.5.3
多播地址 11111111 FF00::/8 2.7
链路本地单播地址 1111111010 FE80::/10 2.5.6
全球单播地址 (其他所有情况) - -

任播地址取自单播地址空间(任意作用域),且在语法上与单播地址无区别。

全球单播地址的通用格式在2.5.4节描述。部分包含嵌入式IPv4地址的全球单播地址子类型(用于IPv4-IPv6互操作)在2.5.5节说明。

未来规范可能会将全球单播地址空间的一个或多个子范围重新定义为其他用途,但在此之前,实现必须将所有不以上述前缀开头的地址视为全球单播地址。

2.5 单播地址

IPv6单播地址可使用任意比特长度的前缀进行聚合,这与无类别域间路由(CIDR)体系下的IPv4地址类似。

IPv6中存在多种单播地址类型,特别是全球单播地址站点本地单播地址(已弃用,参见2.5.7节)链路本地单播地址。此外,全球单播地址还包含一些特殊用途的子类型(如嵌入IPv4地址的IPv6地址)。未来可能会定义更多地址类型或子类型。

根据节点角色(如主机与路由器)的不同,IPv6节点对IPv6地址内部结构的认知程度可能存在差异。至少,节点可认为单播地址(包括其自身地址)不具备内部结构:128位的节点地址。

略复杂的主机(但仍属于简单类型)可能额外知晓其连接链路的子网前缀(不同地址的n值可能不同):

n位子网前缀 + 128-n位接口标识符

尽管非常简单的路由器可能不了解IPv6单播地址的内部结构,但通常情况下,路由器会知晓一个或多个用于路由协议运行的层次化边界。具体知晓的边界因路由器在路由层次中的位置而异。

除上述关于子网边界的认知外,节点不应对IPv6地址的结构做任何假设。

2.5.1 接口标识符

IPv6单播地址中的接口标识符用于标识链路上的接口,要求在子网前缀内唯一。建议同一链路上不同节点不分配相同的接口标识符,其也可在更广泛范围内唯一。在某些情况下,接口标识符可直接从该接口的链路层地址派生。单个节点的多个接口若连接至不同子网,可使用相同的接口标识符。

需注意,接口标识符的唯一性与IPv6地址的唯一性无关。例如,可使用本地范围接口标识符创建全球单播地址,或使用全局范围接口标识符创建链路本地地址。

除二进制值以000开头的单播地址外,所有单播地址的接口标识符必须为64位长,并采用修改的EUI-64格式构造。

基于修改的EUI-64格式的接口标识符,若派生自全局令牌(如IEEE 802 48位MAC或IEEE EUI-64标识符[EUI64])则具有全局范围;若缺乏全局令牌(如串行链路、隧道端点)或无需全局令牌(如隐私保护临时令牌[PRIV]),则具有本地范围。

从IEEE EUI-64标识符构造接口标识符时,需翻转“u”位(IEEE EUI-64术语中的全局/本地位)。在修改的EUI-64格式中:
* “u”位设为1表示全局范围;
* 设为0表示本地范围。

IEEE EUI-64标识符的前三个八位组二进制结构如下(按互联网标准位序):

             0       0 0       1 1       2
            |0       7 8       5 6       3|
            +----+----+----+----+----+----+
            |cccc|ccug|cccc|cccc|cccc|cccc|
            +----+----+----+----+----+----+

其中:
* “u”为全局/本地位;
* “g”为个体/组位;
* “c”为公司标识符位。

翻转“u”位的设计初衷是便于系统管理员在缺乏硬件令牌时手动配置非全局标识符(如串行链路、隧道端点场景)。若不翻转该位,标识符可能需表示为0200:0:0:10200:0:0:2等形式,而翻转后可简化为0:0:0:10:0:0:2

IPv6节点无需验证“u”位设为全局的修改EUI-64令牌所创建接口标识符的唯一性。修改的EUI-64格式标识符中全局/本地位的设计,为未来利用全局范围接口标识符的技术发展预留空间。

接口标识符的具体构造细节在相应的“<链路>上的IPv6”规范中定义,如《以太网承载IPv6》[ETHER]和《FDDI承载IPv6》[FDDI]。

2.5.2 未指定地址

地址0:0:0:0:0:0:0:0称为未指定地址,绝不可分配给任何节点。它表示地址缺失,典型用途如初始化主机在获取自身地址前发送的IPv6数据包的源地址字段。

未指定地址不得作为IPv6数据包的目的地址或出现在IPv6路由报头中。源地址为未指定地址的IPv6数据包,IPv6路由器必须不进行转发

2.5.3 回环地址

单播地址0:0:0:0:0:0:0:1称为回环地址,节点可用其向自身发送IPv6数据包,但绝不可分配给任何物理接口。该地址被视为具有链路本地作用域,可理解为虚拟接口(通常称为“回环接口”)连接到虚构链路的链路本地单播地址。

回环地址不得作为节点外发IPv6数据包的源地址。目的地址为回环地址的IPv6数据包,绝不可发送到节点外部,且IPv6路由器必须不进行转发。接口接收到目的地址为回环地址的数据包时,必须丢弃

2.5.4 全局单播地址

IPv6全球单播地址用于在全球范围内唯一标识网络中的设备,其一般格式如下3:

n位 m位 128 - n - m位
全球路由前缀 子网ID 接口ID

其中,全球路由前缀是分配给一个站点(子网/链路集群)的值,通常采用分层结构;子网ID用于标识站点内的链路;接口ID如2.5.1节中所定义。

除了以二进制000开头的地址外,所有全球单播地址都有一个64位的接口ID字段(即n + m = 64),其格式如2.5.1节所述。以二进制000开头的全球单播地址,对接口ID字段的大小或结构没有此限制。例如,以二进制000开头的全球单播地址有2.5.5节中描述的内嵌IPv4地址的IPv

版权声明:程序员胖胖胖虎阿 发表于 2025年7月7日 上午3:51。
转载请注明:RFC4291下的IPv6地址架构揭秘 | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...