Skip to content

IPv6 - 地址类型

IPv6 地址使用十六进制表示,这是一种 16 进制的数制。它使用数字 0-9 和字母 A-F(代表 10-15)。每个十六进制数字对应 4 位 (bit) 二进制。例如,十六进制的 ‘F’ 在二进制中是 ‘1111’,十六进制的 ‘2B’ 在二进制中是 ‘0010 1011’。

快速转换参考:二进制 ‘0000’ 是十六进制 ‘0’,‘0001’ 是 ‘1’,…,‘1001’ 是 ‘9’,‘1010’ 是 ‘A’,‘1011’ 是 ‘B’,‘1100’ 是 ‘C’,‘1101’ 是 ‘D’,‘1110’ 是 ‘E’,‘1111’ 是 ‘F’。

一个 IPv6 地址长 128 位,而 IPv4 地址长 32 位。它由八组四个十六进制数字(每组 16 位)组成,各组之间用冒号分隔。

例如,一个 128 位的 IPv6 地址(二进制):

0010000000000001 0000110110111000 0000000000000000 0001000100010001 0000000000000000 0000000000000000 0010111100111011 0000001010101010

转换为十六进制,则为:

2001:0DB8:0000:1111:0000:0000:2F3B:02AA

为了使 IPv6 地址更易于管理,可以应用两条缩写规则:

规则 1:省略每组 16 位数字中的前导零。例如,‘0DB8’ 可以写成 ‘DB8’,‘0000’ 可以写成 ‘0’。

Applying Rule 1 to the example: 2001:DB8:0:1111:0:0:2F3B:2AA

规则 2:一个由连续的 16 位全零组组成的序列可以用双冒号 ’::’ 替换。这在一个地址中只能使用一次,以避免歧义。

Applying Rule 2 to the example (the two ‘0:0’ groups): 2001:DB8:0:1111::2F3B:2AA

如果有多个连续的零块,只能使用 ’::’ 压缩其中一块。例如,2001:0:0:0:ABCD:0:0:EF 不能压缩成 2001::ABCD::EF。它可以是 2001::ABCD:0:0:EF 或 2001:0:0:0:ABCD::EF。通常,压缩最长的连续零块。

在大多数 IPv6 单播地址中,后 64 位构成接口 ID (IID),它在子网 (subnet) 上唯一标识一个接口。前 64 位通常表示网络前缀。

生成 IID 的一种方法是使用修改的 EUI-64 (Extended Unique Identifier) 格式。这涉及取一个 48 位的 MAC 地址,将其分成两个 24 位的部分,在中间插入 ‘FFFE’(16 位),然后反转第 7 位(通用/本地 (U/L) 位)。例如,如果 MAC 地址是 00-1A-2B-3C-4D-5E:

  1. 分割: 001A2B 和 3C4D5E。
  2. 插入 FFFE: 001A2BFFFE3C4D5E。
  3. 反转第 7 位: 第一个字节是 ‘00’(二进制 00000000)。第 7 位是 0。反转后变成 1。所以,‘00’ 变成 ‘02’(二进制 00000010)。
  4. 结果 IID: 021A:2BFF:FE3C:4D5E。

然而,由于 EUI-64 存在隐私问题(因为它嵌入了固定的 MAC 地址),现代操作系统通常使用隐私扩展 (Privacy Extensions - RFC 4941)。这些扩展生成临时的、随机的 IID,它们会随时间变化,从而更难跟踪设备。

GUA 是全球唯一且可在互联网上路由的地址,类似于公共 IPv4 地址。目前大多数 GUA 从 2000::/3 范围分配(意味着前三位是 ‘001’)。

典型的 GUA 结构是:全局路由前缀 (Global Routing Prefix) (48 位) | 子网 ID (Subnet ID) (16 位) | 接口 ID (Interface ID) (64 位)。

  • 全局路由前缀:通常由 ISP 分配给组织。例如,2001:0DB8:ACAD::/48。
  • 子网 ID:组织用于创建内部子网。例如,使用这 16 位,组织可以创建多达 65,536 个子网(例如,2001:0DB8:ACAD:0001::/64、2001:0DB8:ACAD:0002::/64 等)。
  • 接口 ID:最后 64 位,用于标识该子网上的特定主机。

这些地址仅用于单个网络链路(例如,以太网段)上的通信。它们不能被路由到本地链路之外。链路本地地址对于 NDP 功能(如地址解析和路由器发现)至关重要。

它们总是以 FE80::/10 前缀开头。通常,FE80 之后的 54 位(直到第 64 位)被设置为零,这使得特定链路上的前缀实际上是 FE80::/64。剩余的 64 位是接口 ID。

示例:FE80::021A:2BFF:FE3C:4D5E(其中 IID 是 EUI-64 派生或随机生成的)。

ULA (RFC 4193) 旨在用于站点或一组站点内部的本地使用。它们是全球唯一的(如果生成正确,具有很高概率),但不打算在公共互联网上路由。它们在概念上类似于 IPv4 私有地址(例如,10.0.0.0/8)。

ULA 的前缀是 FC00::/7。第 8 位(L 位)对于本地分配的 ULA 设置为 ‘1’,使得前缀成为 FD00::/8。结构是:FD (8 位) | 全局 ID (Global ID) (40 位) | 子网 ID (Subnet ID) (16 位) | 接口 ID (Interface ID) (64 位)。

  • FD: 指示本地分配的 ULA。
  • 全局 ID:一个 40 位伪随机生成的值,用于确保在使用 ULA 的站点合并时具有唯一性。不应随意选择。
  • 子网 ID:16 位,用于站点内部的子网划分。
  • 接口 ID:64 位,用于主机。

示例:FDe3:a45b:9876:0001::1234(其中 e3a45b9876 是 40 位全局 ID)。

链路本地地址仅限于单个链路。唯一本地地址通常在组织或一组合作站点内部路由,但不跨越全球互联网。全局单播地址在全球范围内路由。理解这些范围对于网络设计和故障排除至关重要。