[TOC]
# IPv6 联网概念
## 目标
能够说明 IPv6 地址和联网的基本概念
## IPv6 概述
IPv6 旨在替换网络协议。它通过使用大得多的网络地址空间解决了 IPv4 地址耗尽的主要问题。它还在网络配置管理方面提供了一些增强功能和新特性并且支持将来的协议变更。
目前尚未广泛部署 IPv6 的关键原因是,核心协议没有一种简单方法使仅具有 IPv6 地址的系统能够与仅具有 IPv4 地址的系统进行通信。
目前最佳的过渡计划是为所有主机同时提供 IPv4 和 IPv6 两种地址,以便能够从主机访问仅使用其中一种协议的 Internet 资源。这称为双栈配置,也是重点讲述的方法。
### 注意
目前正在开发多种有前景的过渡方法以使具有 IPv6 的主机能够使用 IPv4 Internet 或者支持其他形式的 IPv4/IPv6 转换,如 NAT64(RFC 6145)和 464XLAT(RFC 6877)。
Internet 工程任务组(IETF)的基本观点是:使用 IPv4 的网络运营商应“获取 IPv6 前缀,在其网络中以及自身和其他同级上游或下游网络邻居之间开启 IPv6 路由,在其计算机上启用并在正常处理期间使用它。这应该在保持 IPv4 稳定的情况下完成,直至可以执行的任何通信均能够同样正常地使用任意一协议。到那时,同时运行这两者的经济合理性论证会变得有争议,并且网络运营商可以合理的关闭 IPv4。”(RFC 6144,简介)
## 解读 IPv6 地址
IPv6 地址
IPv6 地址是一个 128 位数字,通常表示为八组以分号分割的四个十六进制半字节。每个半字节均表示 4 位的 IPv6 地址,因此每个组表示 16 位的 IPv6 地址。
~~~
2001:0db8:0000:0010:0000:0000:0000:0001
~~~
为了便于编写 IPv6 地址,不需要编写分号分隔的组中的前导零。但是,每个字段中必须至少编写一个半字节。不需要编写在组中跟在非零半字节后面的零。
~~~
2001:db8:0:10:0:0:0:1
~~~
由于带有很长的零字符串地址很常见,一组或多组连续零可以通过正好一个::块来合并。
~~~
2001:db8:0:10::1
~~~
注意,根据这些规则,2001:db8: :0010:0:0:0:1 将成为编写示例地址的另一种不太方便的方法。但它也是相同地址的有效表示法,而这可能让不熟悉 IPv6 的管理员感到困惑。有关编写始终可读的地址的一些提示如下:
1 必须始终隐藏组中的前导零。
2 使用::来尽可能地缩短。如果连串连续零的长度相等,则最好是缩短最左侧的前导零。
3 请不要使用::来缩短一组零(尽管允许这样)。而是应使用:0并保存::以表示多串长于一组的连续零。
4 始终对十六进制数字使用小写字母 a 到 f。
### 重要
如果在 IPv6 地址后面包括 TCP 或 UDP 网络端口,请始终将 IPv6 地址包括在方括号中,以便端口不会被误认为是地址的一部分。
~~~
[2001:db8:0:10:]:80
~~~
## IPv6 子网
普通的单播地址分为两部分:网络前缀和接口 ID。网络前缀标识子网。同一子网上的任何两个字网接口都不能具有相同接口 ID,接口 ID 可标识子网上的特定接口。
与 IPv4 不同的是,IPv6 具有一个标准的子网掩码/64,用于几乎所有的普通地址。在此情况下,地址的一半是网络前缀,另一半是接口 ID。这意味着单个子网可以根据需要容纳任意数量的主机。
通常,网络提供商将为组织分配一个较短的前缀,如/48。这会保留其余网络部分以用于通过这一分配的前缀来指定子网。对于 /48 分配,将保留 16 位以用于子网(最多 65536 个子网)。
![](https://box.kancloud.cn/b84ad5a643979bcce681085272917c31_752x479.png)
## IPv6 地址分配
通用 IPv6 地址和网络
| IPv6 地址或网络 | 用途 | 描述 |
| --- | --- | --- |
| ::1/128 | 本地主机 | 等效于 127.0.0.1/8 的 IPv6,在回环口上设置。 |
| :: | 未指定的地址 | 等效于 0.0.0.0 的 IPv6。对于网络服务,这可能表示其正在侦听所有已配置的 IP 地址。 |
| ::/0 | 默认路由(IPv6 Internet) | 等效于 0.0.0.0/0的 IPv6 。路由表中的默认路由与此网络匹配;此网络的路由器是在没有更好路由的情况下发送所有流量的位置。 |
| 2000::/3 | 全局单播地址 | “普通”得 IPv6 地址目前由 IANA 从该空间进行分配。这等同于范围从 2000::/16 到 3fff::/16 的所有网络。 |
| fd00::/8 | 唯一本地地址(RFC 4193) | IPv6 没有 RFC 1918 专用地址空间的直接等效对象,尽管这很接近。站点可以使用这些以在组织中自助分配可路由的专用 IP 地址空间,但是这些网络不能在全局 Internet 上使用。站点必须随机从该空间中选择一个 /48,但是它可以正常将分配空间划分为 /64 网络。 |
| fe80::/64 | 本地链接地址 | 每个 IPv6 接口自动配置一个本地链接地址,该地址仅在该网络中的本地链接中有效。这在后面将更加详细地讨论。 |
| ff00::/8 | 多播 | 等效于 224.0.0.0/4 的 IPv6。多播用于同时传输到多个主机,并且在 IPv6 中特别重要,因为其没有广播地址。 |
#### 本地链接地址
IPv6 中的本地链接地址是一个无法路由的地址,仅用于与特定网络链接上的主机进行通信。系统上的每个网络接口都通过 fe80:: 网络上的本地链接地址来自动配置。为确保其唯一性,本地链接地址的接口 ID 是通过网络接口的以太网硬件地址来构建的。将 48 位 MAC 地址转换为 64 位接口 ID 的常规过程是设置 7 位的 MAC 地址,然后在其两个中间字节之间插入 ff:fe。
* 网络前缀:fe80::/64
* MAC 前缀:00:11:22:aa:bb:cc
* 本地链接地址:fe80::211:22ff:feaa:bbcc/64
其他计算机的本地链接地址可以由相同链接上的其他主机像普通地址那样使用。由于每个链接都具有 fe80::/64 网络,不能使用路由表来正确地选择出站接口。在地址的结尾必须使用作用域标识符来指定与本地链接地址进行通信时使用的链接。作用域标识符由 % 以及后跟的网络接口名组成。
例如,要使用 ping6 对本地链接地址 fe80::211:22ff:feaa:bbcc 进行 ping 操作(使用连接到 eth0 网络接口的链接),正确的命令是:
~~~
[student@domo~]$ ping6 fe80::211:22ff:feaa:bbcc%eth0
~~~
### 注意
仅当联系具有“链接”作用域的地址时,才需要使用作用域标识符。普通全局地址的使用就如同在 IPv4 中的用法一样,并且从路由表中选择其出站接口。
### 多播
多播在 IPv6 中比在 IPv4 中扮演着更重要的角色,因为 IPv6 中没有广播地址。IPv6 中的一个重要多播地址是 ff02::1,即全节点本地链接地址。对此地址进行 ping 操作会将流量都发送到链接上的所有节点。与本地链接地址一样,需要使用作用域标识符来指定链接作用域多播地址(从 ff02::/8 开始)。
~~~
[student@demo~]$ ping6 ff02::1%eth0
PING ff02::1%eth0(ff02::1) 56 data bytes
64 bytes from fe80::211:22ff:feaa:bbcc: icmp_seq=1 ttl=64 time=0.072 ms
64 bytes from fe80::200:aaff:fe33:2211: icmp_seq=1 ttl=64 time=102 ms (DUP!)
64 bytes from fe80::bcd:efff:fea1:b2c3: icmp_seq=1 ttl=64 time=103 ms (DUP!)
64 bytes from fe80::211:22ff:feaa:bbcc: icmp_seq=2 ttl=64 time=0.079 ms
...
~~~
## IPv6 地址配置
在IPv4中,有两种方法可用于在网络接口上配置地址。可以由管理员手动在接口上配置网络地址,也可以使用 DHCP 通过网络进行动态配置。IPv6 也支持手动配置以及两种同种动态配置方法,其中一种便是 DHCPv6。
#### 静态寻址
与 IPv4 一样,可以随意选择静态 IPv6 地址的接口 ID。在 IPv4 中,网络上有两个地址无法使用:子网中最低的地址和子网中最高的地址。在 IPv6 中,以下接口 ID 是保留的,无法用于主机上的普通网络地址。
* 由链接上的所有路由器使用的全零标识符 0000:0000:0000:0000(“子网路由任意广播”)。(对于 2001:db8::/64 网络,这可能是地址 2001:db8::。)
* 标识符 fdff:ffff:ffff:ff80 到 fdff:ffff:ffff:ffff。
#### DHCPv6 配置
由于没有广播地址,DHCPv6 的工作原理与适用于 IPv4 的 DHCP 略有不同。基本上,主机将 DHCPv6 请求从其本地链接地址发送到 ff02::1:2 上的端口 547/UDP,即全 dhcp 服务器本地链接多播组。然后 DHCPv6 服务器通常向客户端的本地链接地址上的端口 564/UDP 发送一个包含相应信息的回复。
RHEL 7 中的 dhcp 软件包提供了针对 DHCPv6 服务器的支持。
### SLAAC配置
除了 DHCPv6 之外,IPv6 也支持另外一个动态配置方法,称为无状态地址自动配置(SLAAC)。使用 SLAAC,主机通常使用本地链接 fe80::/64 地址来调出其接口。主机随后向 ff02::2(即,全路由器本地链接多组播)发送一个“路由器请求”。本地链接上的 IPv6 路由器以网络前缀以及其他可能的信息来响应主机的本地链接地址。主机随后将该网络前缀与其通常构建的接口 ID(构建方式与本地链接地址相同)配合使用。路由器定时发送多播更新(“路由器转发”)以确认或更新其提供的信息。
EHEL 7 中的 radvd 软件包允许基于 RHEL 的 IPv6 路由器通过路由器播发来提供 SLAAC。
### 重要
配置为通过 DHCP 获取 IPv4 地址的典型 RHEL 7 计算机通常还配置为使用 SLAAC 来获取 IPv6 地址。当网络中添加了 IPv6 路由器时,这可能导致计算机意外获取 IPv6 地址。
部分 IPv6 部署将 SLAAC 与 DHCPv6 组合,SLAAC 仅用于提供网络地址信息。而 DHCPv6 仅用于提供其他信息(如,要配置的 DNS 服务器和搜索域)。
## 参考
ping、radvd 和 dhcpd man page
所选的 IETF RFC 参考:
RFC 2460:Internet 协议 V6(IPv6)规范
http://tools.ietf.org/html/rfc2460
RFC 4291:IPv6寻址架构
http://tools.ietf.org/html/rfc4291
RFC 5952:IPv6 地址文本表示法建议
http://tools.ietf.org/html/rfc5952
RFC 4862:IPv6 无状态地址自动配置
http://tools.ietf.org/html/rfc4862
RFC 3315:适用于 IPv6 的动态主机配置协议(DHCPv6)
http://tools.ietf.org/html/rfc3315
RFC 3736:适用于 IPv6 的无状态动态主机配置信息(DHCP)服务
http://tools.ietf.org/html/rfc3736
RFC 4193:唯一本地 IPv6 单播地址
http://tools.ietf.org/html/rfc4193