[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 個子網)。

## 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