IPv6 地址
IPv6
全称是 Internet Protocol version 6 address
.
IPv6 地址是一个数字标签,用于标识和定位使用 IPv6 参与计算机网络的计算机或网络节点的网络接口. 它是 IPv4 的后继者. IPv4 将 IP 地址长度定义为 32 位,而 IPv6 地址则为 128 位。因此,相比之下,IPv6 的地址空间显著扩大。
1. 寻址方法
IPv6 地址根据网络中常见的主要寻址和路由方法进行分类:单播寻址、任播寻址和多播寻址.
单播地址标识单个网络接口. IP 会将带有单播地址的数据包递送到特定接口.
任播地址分配给一组接口,这些接口通常属于不同的节点. 发送到任播地址的数据包只会被发送给这组接口中的一个, 通常是那个"最近的主机"(根据路由协议的距离定义). 任播地址不易识别,其格式与单播地址相同,唯一的区别在于它们在网络中的多个点上存在. 几乎所有单播地址都可以用作任播地址.
多播地址也被多个主机使用,这些主机通过参与网络路由器之间的多播分发协议来获取多播地址目的地. 发送到多播地址的数据包将被发送到已加入相应多播组的所有接口.
IPv6 不支持广播. 广播的传统作用被多播取代.
2. 地址格式
IPv6 地址包含 128 bit, 对于不同的寻址和路由方法, 通过将 128 个地址位划分成不同的组, 使用既定规则将这些位组的值与特殊的寻址特征关联起来,可以识别各种地址格式.
2.1 单播和任播地址格式
2.1.1 通用单播地址格式
单播和任播地址通常由两个逻辑部分组成:用于路由的 64 位网络前缀和用于标识主机网络接口的 64 位接口标识符.
比特 | 字段 |
---|---|
48(或更多) | 路由前缀 (routing prefix) |
16(或更少) | 子网 ID (subnet ID) |
64 | 接口标识符 (interface identifier) |
路由前缀
和子网 ID
包含在 IPv6 地址的高 64 位中. 路由前缀和子网 ID 的长度是可变的. 路由前缀长度越长,相应的子网 ID 的长度就越短.
64 位接口标识符
是从 DHCPv6 服务器获取的,或手动配置.
2.1.2 唯一本地地址
唯一本地地址(Unique local addresses)是类似于 IPv4 私有网络地址(private network addresses)的地址.
比特 | 字段 |
---|---|
7 | 前缀 |
1 | L |
40 | 随机 |
16 | 子网 ID |
64 | 接口标识符 |
前缀
字段是固定值, 1111110
(二进制).
L
字段表示当前地址是本地分配的地址. 它的值是 1
. (对于当前为设置为 0
的情况,目前是未定的)
2.1.3 链路本地地址
链路本地地址(link-local address)也基于接口标识符,但使用不同的网络前缀格式.
比特 | 字段 |
---|---|
10 | 前缀 |
54 | 全零 |
64 | 接口标识符 |
前缀
字段是固定值, 1111111010
(二进制).
这个固定的前缀值和后面的 54 个全零的字段, 使得所有链路本地地址的网络前缀都是一样的, fe80::/64
.
2.2 多播地址格式
多播地址是根据几种特定的格式规则形成的,具体取决于应用程序.
2.2.1 通用多播地址格式
比特 | 字段 |
---|---|
8 | 前缀 |
4 | 标志位(flg ) |
4 | 范围(sc ) |
112 | 组 ID |
所有的多播地址的前缀
都是相同的, 11111111
(二进制)
对于 标志位
字段,当前已经定义了 3 个标志:
比特位 | 标志 | 0 | 1 |
---|---|---|---|
8 | 未定义 | - | - |
9 | R (Rendezvous) | 未嵌入会合点 | 嵌入会合点 |
10 | P (Prefix) | 没有前缀信息 | 基于网络前缀的地址 |
11 | T (Transient) | 知名多播地址 | 动态分配的多播地址 |
范围字段(sc
)用于指示此地址在何处有效且唯一. 此外,范围字段用于标识特殊的多播地址, 例如 solicited node.
2.2.2 基于单播前缀的组播地址格式
比特 | 字段 |
---|---|
8 | 前缀 |
4 | 标志位(flg ) |
4 | 范围(sc ) |
4 | res |
4 | riid |
8 | plen |
64 | 网络前缀 |
32 | 组 ID |
3. 表示
Pv6 地址表示为 8 组 4 个十六进制数字,每组代表 16 位,各组之间用冒号 (:) 分隔.
例如: 2001:0db8:85a3:0000:0000:8a2e:0370:7334
通常情况下, 完整的表示都太长了, 标准委员会提供了一些简化 IPv6 地址表示的方法:
- IETF 建议仅使用小写字母. 比如:
2001:db8::1
, 而不是2001:DB8::1
- 每个 16 位组中的的前导零可以省略,但每组必须保留至少一位数字. 例如:
2001:0db8::0001:0000
可以表示为2001:db8::1:0
. - 最长的连续全零字段序列被替换为两个冒号 (::). 如果地址包含多个相同长度的全零字段,为了防止出现歧义,只压缩最左边的字段. 例如:
2001:db8:0:0:1:0:0:1
可以表示为2001:db8::1:0:0:1
, 而不是2001:db8:0:0:1::1
.::
不能用于表示单个全零字段. 比如:2001:db8:0:0:0:0:2:1
可以简化为2001:db8::2:1
, 但是2001:db8:0000:1:1:1:1:1
只能简化为2001:db8:0:1:1:1:1:1
.
例子:
localhost (loopback) address: 0:0:0:0:0:0:0:1
=> ::1
IPv6 unspecified address: 0:0:0:0:0:0:0:0
=> ::
在互联网从 IPv4 过渡到 IPv6 的过程中,通常会在混合寻址环境中运行. 针对这种情况,引入了一种特殊的表示法,即用我们熟悉的 IPv4 点分十进制表示法来表示 IPv4 映射地址和 IPv4 兼容 IPv6 地址,其中最低 32 位采用 IPv4 点分十进制表示法,而高 96 位则采用 IPv6 格式。
例如,IPv4 映射的 IPv6 地址 ::ffff:c000:0280
应写为 ::ffff:192.0.2.128
,从而清晰地表达了映射到 IPv6 的原始 IPv4 地址。
3.1 网路
IPv6 网络使用的地址块是一组连续的 IPv6 地址,其大小为 2 的幂. 对于给定网络中的所有主机,地址的前几位都是相同的,称为网络的地址(network's address)或路由前缀(routing prefix).
网络地址范围采用 CIDR
表示法. 网络由地址块中的第一个地址(以全零结尾), 一个斜杠 (/) 和一个等于前缀位数的十进制值表示. 例如: 2001:db8:1234::/48
表示的网络的起始地址为 2001:db8:1234:0000:0000:0000:0000:0000
, 结束地址为 2001:db8:1234:ffff:ffff:ffff:ffff:ffff
.
3.2 URI 中使用 IPv6 地址
IPv6 地址中的冒号 (:) 字符可能与URI 和 URL 中的冒号冲突. 为了避免冲突, 在 URI/URL 中使用 IPv6 地址时, 使用 []
括起来.
例子:
http://[2001:db8:85a3:8d3:1319:8a2e:370:7348]/
https://[2001:db8:85a3:8d3:1319:8a2e:370:7348]:443/
3.3 Scoped literal IPv6 addresses (with zone index)
对于非全局范围(global scope)的地址,尤其是链路本地地址(link-local addresses),发送数据包的网络接口选择可能取决于该地址所属的区域(zone). 同一个地址可能同时在不同的区域色被使用,并且由每个区域中的不同主机使用. 即使同一个地址在不同区域中未被使用,这些区域中地址的地址前缀仍然可能相同,这使得操作系统无法根据路由表(基于前缀)中的信息选择出站接口。
为了解决文本地址中的歧义,必须在地址后附加区域索引(zone index). 区域索引与地址之间用百分号 (%) 分隔.
例如:
链路本地地址: fe80::1ff:fe23:4567:890a
可以被表示为: fe80::1ff:fe23:4567:890a%eth2
或者: fe80::1ff:fe23:4567:890a%3
其中:
fe80::1ff:fe23:4567:890a%eth2
: 常见于 Linux 系统中(BSD, Linux, macOS). 其中eth2
表示的是网络接口的名称.fe80::1ff:fe23:4567:890a%3
常见于 Windows 操作系统.3
表示接口号.
3.4 UNC 路径名中使用 IPv6 地址
在 Windows 系统中,IPv4 地址可以直接在 UNC 路径中使用. 然而,冒号在 UNC 路径名中是非法字, 因此,在 UNC 路径名中使用 IPv6 地址是非法的. 为此,微软实现了一种转录算法,将 IPv6 地址表示为可在 UNC 路径中使用的域名. 为此,微软在互联网上注册并保留了二级域名 ipv6-literal.net(尽管他们于 2014 年 1 月放弃了该域名)。IPv6 地址在此命名空间内以以下方式转录为主机名或子域名:
2001:db8:85a3:8d3:1319:8a2e:370:7348
==> 2001-db8-85a3-8d3-1319-8a2e-370-7348.ipv6-literal.net
(新的地址会被 Windows 自动在本地解析, 过程中不需要查询 DNS 服务器)
如果 IPv6 地址包含区域索引,将其和地址用字符 s
拼接起来:
fe80::1ff:fe23:4567:890a%3
=> fe80--1ff-fe23-4567-890as3.ipv6-literal.net
4. 地址范围
每个 IPv6 地址(除了地址(::))都有一个范围(scope),该范围指定了它在网络的那些范围内有效.
4.1 单播地址
对于单薄地址, 定义了两个范围: link-local
和 global
.
本地链路地址(link-local addresses)和环回地址(loopback address)具有本地链路范围(link-local scope), 这意味着它们只能在单个直接连接的网络中使用.
所有其他地址(包括唯一本地地址)都具有全局范围(global scope),这意味着它们可能具有全局可路由性(global routable),并且可用于连接到任何地方的具有全局范围的地址,或连接到直接连接网络上的具有链路本地范围的地址。
4.2 任播地址
任播地址的范围与单播地址相同.
4.3 多播地址
For multicast addresses, the four least-significant bits of the second address octet (ff0s::) identify the address scope, i.e. the domain in which the multicast packet should be propagated. Predefined and reserved scopes are:
值 | 范围名称 | 描述 |
---|---|---|
0x0 | 保留 | - |
0x1 | interface-local | Interface-local scope spans only a single interface on a node, and is useful only for loopback transmission of multicast. |
0x2 | link-local | Link-local scope spans the same topological region as the corresponding unicast scope. |
0x3 | realm-local | Realm-local scope is defined as larger than link-local, automatically determined by network topology and must not be larger than the following scopes |
0x4 | admin-local | Admin-local scope is the smallest scope that must be administratively configured, i.e., not automatically derived from physical connectivity or other, non-multicast-related configuration. |
0x5 | site-local | Site-local scope is intended to span a single site belonging to an organisation. |
0x8 | organization-local | Organization-local scope is intended to span all sites belonging to a single organization. |
0xe | global | Global scope spans all reachable nodes on the Internet – it is unbounded. |
0xf | 保留 | - |