目录
文章目录
前文列表
IPv6 的地址格式
IPv6 地址格式为 8 段 16 位(共 128 位)组成:
0010000000000001 0000000000000000 0011001000111000 1101111111100001 0000000001100011 0000000000000000 0000000000000000 1111111011111011
使用 32 个(4 * 8)十六进制数表示。十六进制表:
不同的段之间以符号 :
分隔,e.g. 2001:0db8:3c4d:0015:0000:0000:1a2f:1a2b。
- 最左侧的三个段(48 位)包含站点前缀。站点前缀描述通常由 ISP 或区域 Internet 注册机构(Regional Internet Registry,RIR)分配的站点的公共拓扑。
- 下一个段网管分配的 16 位子网 ID。子网 ID 描述专用拓扑(也称为站点拓扑),因为它是一个私有网络的标识。
- 最右侧的四个段(64 位)包含接口 ID,也称为标记。接口 ID 可以从接口的 MAC 地址自动配置,也可以采用 EUI-64 格式手动配置。
上图示例显示了 IPv6 地址的全部 128 位。前 48 位 2001:0db8:3c4d 包含表示公共拓扑的站点前缀。随后的 16 位 0015 包含代表站点专用拓扑的子网 ID。低阶(最右边的 64 位 0000:0000:1a2f:1a2b)包含接口 ID。
即使在转换为十六进制格式后,IPv6 地址仍然很长。所以 IPv6 提供了一些规则来缩短地址:
- 规则 1:丢弃前导零,高位的连 0 可省略不写,低位的 0 不可省略,上述地址可简化记为 2001:db8:3c4d:15:0:0:1a2f:1a2b。
- 规则2:连续多段全 0 可用符号
::
替代且仅替代一次(只能出现一次),上述地址可进一步简化记为 2001:db8:3c4d:15::1a2f:1a2b。
此外,还支持 点分十六进制 的写法,e.g. 2001:0db8:85a3:08d3:1319:8a2e:0370:7344 则记为 2.0.0.1.0.d.b.8.8.5.a.3.0.8.d.3.1.3.1.9.8.a.2.e.0.3.7.0.7.3.4.4,其倒序写法用于在 ip6.arpa 子域名中记录 IPv6 地址与 Domain 之间的映射关系。
站点前缀
IPv6 地址格式同样采用了 CIDR(Classless Inter-Domain Routing,无类别域间路由)的方式,通过 前缀长度(Ipv6 Address / Prefix Length) 来划分 网络号 和 主机号。
IPv6 地址最左边的字段是用来路由 IPv6 包的前缀,最多占用 IPv6 地址最左侧的 48 位。例如,IPv6 地址 2001:db8:3c4d:0015:0000:0000:1a2f:1a2b/48 的站点前缀包含在最左边的 48 位 2001:db8:3c4d 中。此前缀可使用如下形式(将零省略掉)来表示:2001:db8:3c4d::/48。
地址生成方式
IPv4:手动配置、DHCP 自动分配。
IPv6:手动配置、DHCPv6 自动分配、基于 ICMPv6 的自动生成。
IPv6 地址的分类以及寻址模式
单播(Unicast)地址
单播地址用于标识一个网络接口(Interface),在单播寻址模式下,IPv6 协议会把送往地址的数据包送往给其 Interface。
单播地址可以进一步细分为以下 4 类:
- 全球唯一地址(Global Unique Address):公网地址,全球可达。
- 唯一本地地址(Unique Local Unicast Address):私网地址,同子网段可达。
- 链路本地地址(Link-Local Address):基于邻居发现协议的自动配置地址,同一个链路上的所有主机可达,不需要手动配置。
- 站点本地地址(Site-Local Address):已丢弃,被链路本地地址替代。
单点传送地址的类型由地址中最左边(高阶)的连续位(其中包含前缀)来确定。单点传送地址的格式按以下分层结构进行组织:
- 公共拓扑
- 站点(专用)拓扑
- 接口 ID
单播地址作用范围:
Interface ID
IPv6 具有三种不同类型的本地单播地址方案。地址的后 64 位始终作为 Interface ID。在本地单播地址的场景中,Interface ID 可直接从 MAC 转换而成:MAC 地址是在世界唯一的,Interface ID 利用了 MAC 地址的唯一性。所以 Host 可以直接使用 IEEE 的扩展唯一标识符(EUI-64)格式自动的配置其 Interface ID。比如:将 48 位的 IEEE 802 MAC 地址平分为两部分,然后在中间插入 16 位的 FFFE 即可转换为 64 位的 Interface ID 了。因为,MAC 地址是全球唯一的,所以从 MAC 地址转换得来的 Interface ID 也是全球唯一的。
为了将 EUI-64 ID 转换为 IPv6 Interface ID,EUI-64 ID 的最高有效的第 7 位被补充。 例如:
全球唯一地址(Global Unique Address)
是全球唯一和可识别的 IPv6 地址,等同于 IPv4 的公网地址。由以下 3 部分组成:
- 全球路由前缀(Global Routing Prefix):标识 1 个 Site。
- Subnet ID:标识 Site 中的一个 Subnet。
- Interface ID:标识 Subnet 中的一个 Interface。
- 公共拓扑:站点前缀定义从网络到路由器的公共拓扑。企业的站点前缀可以从 ISP 或区域 Internet 注册机构(Regional Internet Registry,RIR)获取。
- 站点拓扑和 IPv6 子网:在 IPv6 中,子网 ID 定义网络的管理子网,它的最大长度为 16 位。可以在配置 IPv6 网络的过程中指定子网 ID。子网前缀通过指定已分配了子网的特定链路来定义路由器的站点拓扑。IPv6 子网在概念上与 IPv4 子网相同,因为每个子网通常都与一个硬件链路相关联。但是,IPv6 子网 ID 用十六进制表示法表示,而不是用点分十进制表示法表示。
- 接口 ID:接口 ID 用来标识特定节点的接口。接口 ID 必须在子网内唯一。IPv6 主机可以使用相邻节点搜索协议自动生成其自身的接口 ID。相邻节点搜索协议基于主机接口的 MAC 地址或 EUI-64 地址自动生成接口 ID。也可以手动指定接口 ID,建议对 IPv6 路由器和启用了 IPv6 的服务器采用这种方式。
注意,在全球单播地址中,规定如 2001:BCFF:FEA6::/48 表示一个 IPv6 路由前缀,2001:BCFF:FEA6:6C01::/64 表示一个 IPv6 子网前缀。
本地唯一地址(Local Unique Address)
唯一本地地址(Unique Local Unicast Address)
前缀为 fc00::/7,该地址是本地全局唯一的,但只能用于本地通信,不通过 Internet 路由,等同于 IPv4 的私有网络地址,用于取代站点本地地址。该地址包含一个 40 位的伪随机数,以减少当网站合并或数据包误传到网络时碰撞的风险。
站点本地地址(Site-Local Address)
只可在 Site 内路由,相当于 IPv4 的私网地址。站点本地地址由于起初的标准定义模糊而被弃用,而后 RFC 又重新定义了唯一本地地址以满足本地环境中私有 IPv6 地址的使用,已被唯一本地地址替代。
链路本地地址(Link-Local Address)
链路本地地址前缀具有以下格式:fe80::interface-ID/10,当一个节点启用 IPv6 时自动生成,interface-ID 通常从 48 位 MAC 地址派生而来。
用于单一链路,适用于自动配置、NDP(Neighbor Discovery Protocol,邻居发现协议)等实现,路由器不转发以 fe80 开头的地址到 Link。前 64 位为 fe80::,而后 64 位为 Interface ID。可见,同一个 Link 上的所有 Interfaces 的前 64 位都是相同的,再通过后 64 的 Interface ID 来唯一标识一个 Interface。所以,Link-Local Address 只在 Subnet 中有效,即使 Link 上并没有路由器,Interfaces 之间也是可以通信的。
组播(Multicast)地址
在 IPv6 中没有广播的概念,而是使用用组播来代替,因此 IPv6 中存在大量的组播使用。组播地址用于标识一组 Interfaces。IPv6 的组播寻址与 IPv4 相同,目的地为多个主机的数据包在特殊的多播地址上发送。所有对该组播信息感兴趣的主机需要首先加入该组播组。加入组的所有 Interfaces 接收组播数据包并对其进行处理,而对组播数据不感兴趣的其他主机则忽略组播信息。
普通的组播地址前缀为 ff00::/8,通过第二段的最后四位来标识多播的 “范畴”。其中有些地址已用于指定特殊协议,例如 ff0X::101 对应所有区域的 NTP 服务器。
标志位为 0000 表示是永久保留的组播地址,分配给各种技术使用;标志位为0001 表示是用户可使用的临时组播地址。范围段定义了组播地址的范围,其定义如下:
- 0001:本地接口范围。
- 0010:本地链路范围。
- 0011:本地子网范围。
- 0100:本地管理范围。
- 0101:本地站点范围,类似组播的私网地址。
- 1000:组织机构范围。
- 1110:全球范围,类似组播的公网地址。
下面是一些组播指定地址:
- FF02::1,在本地链路范围的所有节点。
- FF02::2,在本地链路范围的所有路由器。
- FF02::5,all ospf routers。
- FF02::9,所有运行 RIP 的路由器。
- FF02::A,所有运行 eigrp 的路由器。
- FF05::2,在一个站点范围内的所有路由器。
在创建某个接口的 IPv6 单点传送地址时,内核会自动使该接口成为某些多点传送组的成员。例如,内核会使每个节点都成为 “请求节点” 多点传送组的成员,相邻节点搜索协议使用该组来检测可访问性。内核还自动使节点成为 “所有节点” 或 “所有路由器” 多点传送组的成员。
- 请求节点组播地址(Solicited-node multicast address):ff02::1:FFXX:XXXX,其中 XX:XXXX 为相对应的单播或任播地址中的三个最低的字节。
任播(Anycast)地址
任播(Anycast)地址,又称任意点传送地址,相当于是单播(Unicast)和广播(Broadcast)的综合体。单播是单点通信,广播是单一来源和多个目的地进行通信。而任播则在以上两者之间,它像广播一样,会有一组接收节点的地址列表,但只会发送给距离最近或发送成本最低(根据路由表来判断)的其中一个接收地址,当该接收地址收到数据包并进行回应,且加入后续的传输,该接收列表的其他节点,会知道某个节点地址已经回应了,它们就不再加入后续的传输作业。当前,任播地址只能分配给中间设备(e.g. 路由器、三层交换机等),不能分配给终端设备(e.g. 手机、电脑等),而且不能作为发送端的地址。
IPv6 任意点传送地址用来标识一组位于不同 IPv6 节点上的接口。每组接口都称作一个任意点传送组。当包发送到任意点传送地址时,任意点传送组中物理位置最接近发送者的成员将收到包。
特殊的地址
-
未指定地址:::/128,即 0:0:0:0:0:0:0:0。只能作为尚未获得正式地址的 Host 的源地址,不能作为目的地址,不能分配给真实的 Interface。
-
环回地址:::1/128,相当于 IPv4 中的回环地址 lo 127.0.0.1。
-
路由协议的保留组播地址:
-
保留路由器/节点的多播地址:这些地址帮助路由器和主机与段上的可用路由器和主机通信,而无需配置 IPv6 地址。主机使用基于 EUI-64 的自动配置 IPv6 地址,然后通过这些地址与段上的可用主机/路由器通信。
-
ORCHID(Overlay Routable Cryptographic Hash Identifiers):2001:10::/28,这些是不可送达的 IPv6 地址,用于加密散列识别。
-
示例地址:2001:db8::/32,这些地址应用于 IPv6 地址的示例中,或用于描述网络架构,作为描述性地址。
-
IPv4 转译地址:IPv4 位址可以很容易的转化为 IPv6 格式。举例来说,如果 IPv4 的一个地址为 135.75.43.52(十六进制为 0x874B2B34),它可以被转化为 0000:0000:0000:0000:0000:FFFF:874B:2B34 或者 ::FFFF:874B:2B34。同时,还可以使用混合符号(IPv4-compatible address),则地址可以为 ::ffff:135.75.43.52。
- ::A.B.C.D,兼容 IPv4 的 IPv6 地址。其中 A.B.C.D 代表 IPv4 地址。即后 32 位可以用 10 进制数表示,因此 ::ffff:192.168.89.9 相等于 ::ffff:c0a8:5909,自动将 IPv6 包以隧道方式在 IPv4 网络中传送的 IPv4/IPv6 节点将使用这些地址。
- ::FFFF:A.B.C.D,是 IPv4 映射过来的 IPv6 地址,其中代表 IPv4 地址,e.g. ::ffff:202.120.2.30 ,它是在不支持 IPv6 的网上用于表示 IPv4 节点。
- 2001::/16,全球可聚合地址,用于 Teredo 隧道,由 IANA 按地域和 ISP 进行分配,是最常用的 IPv6 地址,属于单播地址。
- 2002::/16,6 to 4 地址,用于 6 to 4 自动构造隧道技术的地址,属于单播地址。