跳到主要内容

2. IPv6 Addressing (IPv6地址)

2. IPv6 Addressing (IPv6地址)

IPv6地址是用于接口和接口集的128位标识符 (其中"接口"的定义见 [IPV6] 第2节)。有三种类型的地址:

Unicast (单播):
单个接口的标识符。发送到单播地址的数据包被传送到该地址标识的接口。

Anycast (任播):
一组接口的标识符 (通常属于不同的节点)。发送到任播地址的数据包被传送到该地址标识的接口中的一个 (根据路由协议的距离度量, 传送到"最近"的一个)。

Multicast (组播):
一组接口的标识符 (通常属于不同的节点)。发送到组播地址的数据包被传送到该地址标识的所有接口。

IPv6中没有广播地址 (Broadcast Addresses), 其功能被组播地址取代。

在本文档中, 地址中的字段被赋予特定的名称, 例如 "subnet"。当此名称与术语 "ID" (标识符) 一起使用时 (例如 "subnet ID"), 它指的是命名字段的内容。当它与术语 "prefix" (前缀) 一起使用时 (例如 "subnet prefix"), 它指的是从左侧到包括该字段的所有地址部分。

在IPv6中, 除非特别排除, 否则全零和全一都是任何字段的合法值。具体来说, 前缀可以包含或以零值字段结束。


2.1. Addressing Model (地址模型)

所有类型的IPv6地址都分配给接口, 而不是节点。IPv6单播地址指的是单个接口。由于每个接口属于单个节点, 因此该节点的任何接口的单播地址都可以用作该节点的标识符。

所有接口都必须至少有一个链路本地单播地址 (Link-Local Unicast Address) (有关其他必需地址, 请参见第2.8节)。单个接口也可以有多个任何类型 (单播、任播和组播) 或范围的IPv6地址。对于不用作任何IPv6数据包的源或目的地 (往返于非邻居) 的接口, 不需要范围大于链路范围 (Link-Scope) 的单播地址。这对于点对点接口有时很方便。此地址模型有一个例外:

如果实现在将多个物理接口呈现给互联网层时将其视为一个接口, 则可以将单播地址或一组单播地址分配给多个物理接口。这对于在多个物理接口上进行负载共享很有用。

目前, IPv6延续了IPv4的模型, 即一个子网前缀与一个链路相关联。可以将多个子网前缀分配给同一链路。


2.2. Text Representation of Addresses (地址的文本表示)

有三种常规形式用于将IPv6地址表示为文本字符串:

形式1: 首选形式

首选形式是 x:x:x:x:x:x:x:x, 其中 'x' 是地址的八个16位部分的一到四个十六进制数字。

示例:

ABCD:EF01:2345:6789:ABCD:EF01:2345:6789

2001:DB8:0:0:8:800:200C:417A

注意, 不必在单个字段中写入前导零, 但每个字段中必须至少有一个数字 (除了下面第2种情况)。

形式2: 零压缩形式

由于某些IPv6地址分配方法, 地址中包含长串零位的情况很常见。为了使包含零位的地址更容易书写, 可以使用特殊语法来压缩零。使用 :: 表示一个或多个16位零组。:: 在一个地址中只能出现一次。:: 也可以用于压缩地址中的前导零或尾随零。

示例:

以下地址:

2001:DB8:0:0:8:800:200C:417A   单播地址
FF01:0:0:0:0:0:0:101 组播地址
0:0:0:0:0:0:0:1 环回地址
0:0:0:0:0:0:0:0 未指定地址

可以表示为:

2001:DB8::8:800:200C:417A      单播地址
FF01::101 组播地址
::1 环回地址
:: 未指定地址

形式3: 混合IPv4-IPv6表示

在处理IPv4和IPv6节点的混合环境时, 有时更方便的替代形式是 x:x:x:x:x:x:d.d.d.d, 其中 'x' 是地址的六个高阶16位部分的十六进制值, 'd' 是地址的四个低阶8位部分的十进制值 (标准IPv4表示)。

示例:

0:0:0:0:0:0:13.1.68.3

0:0:0:0:0:FFFF:129.144.52.38

或压缩形式:

::13.1.68.3

::FFFF:129.144.52.38

2.3. Text Representation of Address Prefixes (地址前缀的文本表示)

IPv6地址前缀的文本表示类似于无类别域间路由 (CIDR, Classless Inter-Domain Routing) [CIDR] 中IPv4地址前缀的书写方式。IPv6地址前缀由以下表示法表示:

ipv6-address/prefix-length

其中:

  • ipv6-address: 是第2.2节中列出的任何表示法中的IPv6地址。
  • prefix-length: 是一个十进制值, 指定地址的最左侧连续位中有多少位组成前缀。

示例:

以下是60位前缀 20010DB80000CD3 (十六进制) 的合法表示:

2001:0DB8:0000:CD30:0000:0000:0000:0000/60
2001:0DB8::CD30:0:0:0:0/60
2001:0DB8:0:CD30::/60

以下不是上述前缀的合法表示:

2001:0DB8:0:CD3/60    可以删除前导零, 但不能删除地址任何16位块内的尾随零

2001:0DB8::CD30/60 "/" 左侧的地址扩展为
2001:0DB8:0000:0000:0000:0000:0000:CD30

2001:0DB8::CD3/60 "/" 左侧的地址扩展为
2001:0DB8:0000:0000:0000:0000:0000:0CD3

当同时写入节点地址和该节点地址的前缀 (例如, 节点的子网前缀) 时, 两者可以组合如下:

节点地址:      2001:0DB8:0:CD30:123:4567:89AB:CDEF
其子网编号: 2001:0DB8:0:CD30::/60

可以缩写为: 2001:0DB8:0:CD30:123:4567:89AB:CDEF/60

2.4. Address Type Identification (地址类型识别)

IPv6地址的类型由地址的高阶位标识, 如下所示:

地址类型二进制前缀IPv6表示法章节
Unspecified00...0 (128位)::/1282.5.2
Loopback00...1 (128位)::1/1282.5.3
Multicast11111111FF00::/82.7
Link-Local unicast1111111010FE80::/102.5.6
Global Unicast(其他所有)-2.5.4

任播地址取自单播地址空间 (任何范围), 并且在语法上与单播地址无法区分。

全局单播地址的一般格式在第2.5.4节中描述。包含嵌入式IPv4地址的全局单播地址的一些特殊用途子类型 (用于IPv4-IPv6互操作) 在第2.5.5节中描述。

未来的规范可能会为其他目的重新定义全局单播空间的一个或多个子范围, 但除非并且直到发生这种情况, 否则实现必须将所有不以上述任何前缀开头的地址视为全局单播地址。


2.5. Unicast Addresses (单播地址)

IPv6单播地址可以使用任意位长度的前缀进行聚合, 类似于无类别域间路由下的IPv4地址。

IPv6中有几种类型的单播地址, 特别是全局单播、站点本地单播 (已废弃, 请参见第2.5.7节) 和链路本地单播。还有一些特殊用途的子类型全局单播地址, 例如包含嵌入式IPv4地址的IPv6地址。其他类型的单播地址可能会在未来定义。

IPv6节点可能对IPv6地址的内部结构有相当多或很少的了解, 这取决于节点所扮演的角色 (例如, 主机与路由器)。至少, 节点可以认为单播地址 (包括其自己的) 没有内部结构:

|                           128位                              |
+-----------------------------------------------------------------+
| 节点地址 |
+-----------------------------------------------------------------+

稍微复杂一点的主机 (但仍然相当简单) 可能还会意识到它所连接的链路的子网前缀, 其中不同的地址可能对 n 有不同的值:

|          n位               |           128-n位            |
+-------------------------------+---------------------------------+
| 子网前缀 | 接口ID |
+-------------------------------+---------------------------------+

尽管一个非常简单的路由器可能不了解IPv6单播地址的内部结构, 但路由器通常会了解一个或多个层次边界, 以便进行路由协议的操作。已知的边界将因路由器而异, 这取决于路由器在路由层次结构中的位置。

除了前面段落中讨论的子网边界知识外, 节点不应对IPv6地址的结构做出任何假设。


2.5.1. Interface Identifiers (接口标识符)

IPv6单播地址中的接口标识符用于标识链路上的接口。它们必须在子网前缀内是唯一的。建议不要将相同的接口标识符分配给链路上的不同节点。它们也可能在更广泛的范围内是唯一的。在某些情况下, 接口的标识符将直接从该接口的链路层地址派生。只要连接到不同的子网, 就可以在单个节点的多个接口上使用相同的接口标识符。

请注意, 接口标识符的唯一性独立于IPv6地址的唯一性。例如, 可以使用本地范围接口标识符创建全局单播地址, 也可以使用通用范围接口标识符创建链路本地地址。

对于所有单播地址 (除了以二进制值000开头的地址外), 接口ID必须是64位长, 并且必须以修改的EUI-64格式 (Modified EUI-64 Format) 构造。

基于修改的EUI-64格式的接口标识符在从通用令牌 (例如, IEEE 802 48位MAC或IEEE EUI-64标识符 [EUI64]) 派生时可能具有通用范围, 或者在全局令牌不可用 (例如, 串行链路、隧道端点) 或不希望使用全局令牌 (例如, 用于隐私的临时令牌 [PRIV]) 的情况下可能具有本地范围。

修改的EUI-64格式接口标识符是通过在从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|
+----+----+----+----+----+----+

以互联网标准位序 (Internet Standard Bit-Order) 书写, 其中 "u" 是通用/本地位, "g" 是个体/组位, "c" 是公司ID的位。附录A "创建修改的EUI-64格式接口标识符" 提供了基于修改的EUI-64格式的接口标识符创建的示例。

在形成接口标识符时反转 "u" 位的动机是使系统管理员在硬件令牌不可用时可以轻松地手动配置非全局标识符。预计对于串行链路和隧道端点等情况会是这样。替代方案是这些将采用0200:0:0:1, 0200:0:0:2等形式, 而不是更简单的0:0:0:1, 0:0:0:2等。

IPv6节点不需要验证使用修改的EUI-64令牌创建的接口标识符 (其 "u" 位设置为通用) 是唯一的。

在修改的EUI-64格式标识符中使用通用/本地位是为了允许开发可以利用具有通用范围的接口标识符的未来技术。

形成接口标识符的详细信息在适当的 "IPv6 over <link>" 规范中定义, 例如 "IPv6 over Ethernet" [ETHER] 和 "IPv6 over FDDI" [FDDI]。


2.5.2. The Unspecified Address (未指定地址)

地址 0:0:0:0:0:0:0:0 称为未指定地址。它绝不能分配给任何节点。它表示没有地址。其使用的一个示例是在正在初始化的主机发送的任何IPv6数据包的源地址字段中, 在它学习到自己的地址之前。

未指定地址不能用作IPv6数据包的目的地址或IPv6路由头中。源地址为未指定的IPv6数据包绝不能被IPv6路由器转发。


2.5.3. The Loopback Address (环回地址)

单播地址 0:0:0:0:0:0:0:1 称为环回地址。节点可以使用它向自己发送IPv6数据包。它不能分配给任何物理接口。它被视为具有链路本地范围, 并且可以被认为是通向虚构链路的虚拟接口 (通常称为 "环回接口") 的链路本地单播地址。

环回地址不能用作IPv6数据包的源地址, 这些数据包被发送到单个节点外部。目的地址为环回的IPv6数据包绝不能在单个节点外发送, 也绝不能被IPv6路由器转发。在接口上接收到目的地址为环回的数据包必须被丢弃。


2.5.4. Global Unicast Addresses (全局单播地址)

IPv6全局单播地址的一般格式如下:

|         n位         |   m位  |       128-n-m位         |
+------------------------+-----------+----------------------------+
| 全局路由前缀 | 子网ID | 接口ID |
+------------------------+-----------+----------------------------+

其中全局路由前缀是一个 (层次化) 值, 分配给站点 (一组子网/链路), 子网ID是该站点内子网的标识符, 接口ID如第2.5.1节所定义。

除了以二进制值000开头的地址外, 所有全局单播地址都有64位接口ID字段 (即, 在全局路由前缀中, n + m必须等于64)。

全局路由前缀的结构和分配超出了本文档的范围。


2.5.5. IPv6 Addresses with Embedded IPv4 Addresses (嵌入IPv4地址的IPv6地址)

IPv6过渡机制包括一些在IPv6地址中嵌入IPv4地址的技术。这些地址有两种类型: IPv4兼容的IPv6地址和IPv4映射的IPv6地址。

2.5.5.1. IPv4-Compatible IPv6 Address (IPv4兼容的IPv6地址)

注意: IPv4兼容的IPv6地址类型已被废弃。

IPv4兼容的IPv6地址的格式如下:

|        80位         | 16位 |     32位      |
+--------------------+------+---------------+
| 0000......0000 | 0000 | IPv4地址 |
+--------------------+------+---------------+

表示为: ::d.d.d.d (其中 d.d.d.d 是IPv4地址的十进制表示)

2.5.5.2. IPv4-Mapped IPv6 Address (IPv4映射的IPv6地址)

IPv4映射的IPv6地址的格式如下:

|        80位         | 16位 |     32位      |
+--------------------+------+---------------+
| 0000......0000 | FFFF | IPv4地址 |
+--------------------+------+---------------+

表示为: ::FFFF:d.d.d.d (其中 d.d.d.d 是IPv4地址的十进制表示)

这些地址用于表示仅支持IPv4的节点作为IPv6地址。它们仅在IPv6节点内部使用, 用于表示IPv4节点的地址。IPv4映射的IPv6地址永远不会用作IPv6数据包的源或目的地址。


链路本地地址用于单个链路上的地址自动配置、邻居发现或没有路由器时的通信。

链路本地地址的格式如下:

|   10位   |    54位    |        64位         |
+----------+------------+---------------------+
|1111111010| 0 | 接口ID |
+----------+------------+---------------------+

前缀: FE80::/10

链路本地地址设计用于在单个链路上寻址, 用于自动地址配置、邻居发现或没有路由器时的通信。路由器不能转发具有链路本地源或目的地址的数据包到其他链路。


2.5.7. Site-Local IPv6 Unicast Addresses (站点本地IPv6单播地址)

注意: 站点本地地址已被废弃, 不应在新的实现或部署中使用。请参见 [RFC3879]。

站点本地地址的格式如下:

|   10位   |    54位    |        64位         |
+----------+------------+---------------------+
|1111111011| 子网ID | 接口ID |
+----------+------------+---------------------+

前缀: FEC0::/10

站点本地地址设计用于在站点内部寻址, 而无需全局前缀。但是, 由于站点边界的定义不明确和其他问题, 站点本地地址已被废弃, 并被唯一本地地址 (Unique Local Addresses, ULA) [RFC4193] 取代。