IPv6 編址
從IPv4到IPv6最顯著的變化就是網絡位址的長度。RFC 2373 和RFC 2374定義的IPv6位址,就像下面章節所描述的,有128位長;IPv6位址的表達形式一般采用32個十六進制數。
IPv6中可能的位址有2128 ≈ 3.4×1038個。也可以想象為1632個因為32位位址每位可以取16個不同的值(參考組合數學)。
在很多場合,IPv6位址由兩個邏輯部分組成:一個64位的網絡字首和一個64位的主機位址,主機位址通常根據實體位址自動生成,叫做EUI-64(或者64-位擴充唯一辨別)
IPv6位址表示
IPv6位址為128位元長度,但通常寫做8組每組四個十六進制的形式。例如:
2001:0db8:85a3:08d3:1319:8a2e:0370:7344
是一個合法的IPv6位址。
如果四個數字都是零,可以被省略。例如:
2001:0db8:85a3:0000:1319:8a2e:0370:7344
等同于
2001:0db8:85a3::1319:8a2e:0370:7344
遵從這些規則,如果因為省略而出現了兩個以上的冒号的話,可以壓縮為一個,但這種零壓縮在位址中隻能出現一次。是以:
2001:0DB8:0000:0000:0000:0000:1428:57ab
2001:0DB8:0000:0000:0000::1428:57ab
2001:0DB8:0:0:0:0:1428:57ab
2001:0DB8:0::0:1428:57ab
2001:0DB8::1428:57ab
都是合法的位址,并且他們是等價的。但
2001::25de::cade
是非法的。(因為這樣會使得搞不清楚每個壓縮中有幾個全零的分組)
同時前導的零可以省略,是以:
2001:0DB8:02de::0e13
等于
2001:DB8:2de::e13
如果這個位址實際上是IPv4的位址,後32位元可以用10進制數表示;是以:
ffff:192.168.89.9 等價于::ffff:c0a8:5909,但不等價于::192.168.89.9 和::c0a8:5909。
ffff:1.2.3.4格式叫做IPv4映射位址,是不建議使用的。而::1.2.3.4格式叫做IPv4一緻位址。
IPv4 位址可以很容易的轉化為IPv6格式。舉例來說,如果IPv4的一個位址為135.75.43.52(十六進制為0x874B2B34),它可以被轉化為 0000:0000:0000:0000:0000:0000:874B:2B34或者::874B:2B34。同時,還可以使用混合符号(IPv4- compatible address),則位址可以為::135.75.43.52。
IPv6 位址的分類
IPv6 位址可分為三種:[1]
* 單點傳播(unicast)位址
單點傳播位址标示一個網絡接口。協定會把送往位址的封包投送給其接口。 IPv6 的單點傳播位址可以有一個代表特殊位址名字的範疇,如 link-local 位址和唯一區域位址(ULA,unique local address)。
* 任播(anycast)位址
任播位址用于指定給一群接口,通常這些接口屬于不同的節點。若封包被送到一個任播位址時,則會被轉送到成員中的其中之一。通常會根據路由協定,選擇 "最近" 的成員。任播位址通常無法輕易分别:它們擁有和正常單點傳播位址一樣的結構,隻是會在路由協定中将多個節點加入網絡中。
* 多點傳播(multicast)位址
多點傳播位址也被指定到一群不同的接口,送到多點傳播位址的封包會被傳送到所有的位址。多點傳播位址由皆為一的位元組起始,亦即:它們的前置為 FF00::/8 。其第二個位元組的最後四個位元用以标明 "範疇" 。
一般有 node-local(0x1)、link-local(0x2)、site-local(0x5)、organization-local(0x8)和 global(0xE)。多點傳播位址中的最低 112 位元會組成多點傳播群組識别碼,不過因為傳統方法是從MAC 位址産生,故隻有群組識别碼中的最低 32 位元有使用。定義過的群組識别碼有用于所有節點的多點傳播位址 0x1 和用于所有路由器的 0x2。
另一個多點傳播群組的位址為 "solicited-node 多點傳播位址",是由前置 FF02::1:FF00:0/104 和剩餘的群組識别碼(最低 24 位元)所組成。這些位址允許經由鄰居發現協定(NDP,Neighbor Discovery Protocol)來解譯連結層位址,因而不用幹擾到在區網内的所有節點。
特殊位址
IANA 維護官方的(英文)IPv6 位址空間清單。全域的單點傳播位址的指定可在 RIR's 或 中找到(英文)GRH DFP pages。
IPv6 中有些位址是有特殊意涵的:
未指定位址
* ::/128 - 所有位元皆為零的位址稱作未指定位址。這個位址不可指定給某個網絡接口,并且隻有在主機尚未知道其來源 IP 時,才會用于軟體中。路由器不可轉送包含未指定位址的封包。
Link local 位址
* ::1/128 - 是一種單點傳播繞回位址。如果一個應用程式将封包送到此位址, IPv6 堆棧會轉送這些封包繞回到同樣的虛拟接口(相當于 IPv4 中的 127.0.0.1)。
* fe80::/10 - 這些 link-local 位址指明,這些位址隻在區域連線中是合法的,這有點類似于 IPv4 中的 169.254.0.0/16 。
唯一區域位域
* fc00::/7 - 唯一區域位址(ULA,unique local address)隻可在一群網站中繞送。這定義在 RFC 4193 中,是用來取代 site-local 位域。這位址包含一個 40 位元的僞随機數,以減少當網站合并或封包誤傳到網絡時碰撞的風險。這些位址除了隻能用于區域外,還具備全域性的範疇,這點違反了唯一區域位域所取代的 site-local 位址的定義。
多點傳播位址
* ff00::/8 -這個前置表明定義在 "IP Version 6 Addressing Architecture"(RFC 4291)中的多點傳播位址[2]。其中,有些位址已用于指定特殊協定,如ff0X::101 将到達所有區域的 NTP 伺服器(RFC 2375)。
Solicited-node 多點傳播位址
* ff02::1:FFXX:XXXX - XX:XXXX 為相對應的單點傳播或任播位址中的三個最低的位元組。
IPv4 轉譯位址
* ::ffff:0:0/96 - 用于IPv4映射位址(參見以下的 Transition mechanisms)。
* 2001::/32 - 用于 Teredo tunneling 。
* 2002::/16 - 用于 6to4 。
ORCHID
* 2001:10::/28 - ORCHID (Overlay Routable Cryptographic Hash Identifiers) (RFC 4843)。這些是不可繞送的 IPv6 位址,用于加密雜湊識别。
檔案
* 2001:db8::/32 - 這前置用于檔案(RFC 3849)。這些位址應用于 IPV6 位址的範例中,或描述網絡架構。
遭舍棄或删除的用法
* ::/96 - 這個前置曾用于IPv4 相容位址,現已删除。
* fec0::/10 - 這個 site-local 前置指明這位址隻在組織内合法。它已在 2004 年九月的 RFC3879 中拾,并且新系統不應該支援這類型的位址。
IPv6 封包
IPv6封包由兩個主要部分組成:頭部和負載。
標頭是包的前40位元組并且包含有源和目的位址,協定版本,通信類别(8位元,包優先級),流标記(20位元,QoS服務品質控制),負載長度(16位),下一個頭部(用于向後相容性),和跳段數限制(8位元,生存時間,相當于IPv4中的TTL)。後面是負載,至少1280位元組長,或者在可變MTU(最大傳輸單元)大小環境中這個值為1500位元組。負載在标準模式下最大可為65535位元組,或者在擴充標頭的"jumbo payload"選項進行設定。
IPv6曾有兩個有着細微差别的版本;在RFC 1883中定義的原始版本(現在廢棄)和RFC 2460中描述的現在提議的标準版本。兩者主要在通信類别這個選項上有所不同,它的位數由4位變為了8位。其他的差別都是微不足道的。
分段(Fragmentation)隻在IPv6的主機中被處理。在IPv6中,可選項都被從标準頭部中移出并在協定字段中指定,類似于IPv4的協定字段功能。
IPv6和域名系統
IPv6位址在域名系統中為執行正向解析表示為AAAA記錄(所謂4A記錄)(類似的IPv4表示為A記錄A records);反向解析在ip6.arpa(原先ip6.int)下進行,在這裡位址空間為半位元組16進制數字格式。這種模式在RFC 3596給與了定義。
AAAA模式是IPv6結構設計時的兩種提議之一。另外一種正向解析為A6記錄并且有一些其他的創新像二進制串标簽和DNAME記錄等。RFC 2874和它的一些引用中定義了這種模式。
AAAA模式隻是IPv6域名系統的簡單概括,A6模式使域名系統中檢查更全面,也是以更複雜:
* A6記錄允許一個IPv6位址在分散于多個記錄中,或許在不同的區域;舉例來說,這就在原則上允許網絡的快速重編号。
* 使用域名系統記錄委派位址被DNAME記錄(類似于現有的CNAME,不過是重命名整棵樹)所取代。
* 一種新的叫做比特标簽的類型被引入,主要用于反向解析。
2002年8月的RFC 3363中對AAAA模式給與了有效的标準化(在RFC 3364有着對于兩種模式優缺點的更深入的讨論)
轉換機制
在 IPv6 完全取代 IPv4 前,需要一些轉換機制[3]使得隻支援 IPv6 的主機可以連絡 IPv4 服務,并且允許孤立的 IPv6 主機及網絡可以借由 IPv4 設施連絡 IPv6 網際網路。
在 IPv6 主機和路由器與 IPv4 系統共存的時期時,RFC2893 和 RFC2185 定義了轉換機制。這些技術,有時一起稱作簡單網際網路轉換(SIT,Simple Internet Transition)。[4] 包含:
* 運作于主機和路由器之間的雙堆棧 IP 實作
* 将 IPv4 嵌入 IPv6 位址
* IPv6 立于 IPv4 之上的隧道機制
* IPv4/IPv6 報頭轉換
雙堆棧
将 IPv6 視為一種 IPv4 的延伸,以共享程式碼的方式去實作網絡堆棧,其可以同時支援 IPv4 和 IPv6 ,如此是相對較為容易的。如此的實作稱為雙堆棧,并且,一個實作雙堆棧的主機稱為雙堆棧主機。這步驟描述于 RFC 4213 。
目前大部分 IPv6 的實作使用雙堆棧。一些早期實驗性實作使用獨立的 IPv4 和 IPv6 堆棧。
穿隧
為了連通 IPv6 網際網路,一個孤立主機或網絡需要使用現存 IPv4 的基礎設施來攜帶 IPv6 封包。這可由将 IPv6 封包裝入 IPv4 封包的穿隧協定來完成,實際上就是将 IPv4 當成 IPv6 的連結層。
IP 協定号碼的 41 号用來标示将 IPv6 資料訊框直接裝入 IPv4 封包。IPv6 亦能将入 UDP 封包,如為了跨過一些會阻擋協定 41 交通的路由器或 NAT 裝置。其它流行的封裝機制則有AYIYA和GRE。
自動穿隧
自動穿隧指路由設施自動決定隧道端點的技術。RFC 3056 建議使用6to4穿隧技術來自動穿隧,其會使用 41 協定來封裝。[5] 隧道端點是由遠端知名的 IPv4 任播位址所決定,并在本地端嵌入 IPv4 位址資訊到 IPv6 中。現今 6to4 是廣泛布署的。
Teredo 是使用 UDP 封裝的穿隧技術,據稱可跨越多個 NAT 裝置。 [6] Teredo 并非廣泛用于布署的,但一個實驗性版本的 Teredo 已安裝于 Windows XP SP2 IPv6 堆棧中。IPv6,包含 6to4 穿隧和 Teredo 穿隧,在 Windows Vista 中預設是啟動的。[7]許多 Unix 系統隻支援原生的 6to4,但 Teredo 可由如 Miredoo 的第三方軟體來提供。
ISATAP[8] 借由将 IPv4 位址對應到 IPv6 的 link-local 位址,進而将 IPv4 網絡視為一種虛拟的 IPv6 區域連線。不像 6to4 和 Teredo 是站點間的穿隧機制, ISATAP 是一種站點内機制,意味着它是用來設計提供在一個組織内節點之間的 IPv6 連接配接性。
組态穿隧 (6in4)
在組态穿隧中,如6in4穿隧,隧道端點是要明确組态過的,可以是借由管理者手動或作業系統的組态機制,或者借由如 tunnel broker 等的自動服務。[9]組态穿隧通常比自動穿隧更容易去除錯,故建議用于大型且良好管理的網絡。
組态穿隧在 IPv4 隧道上,使用網際協定中号碼的 41 号。
用于隻支援 IPv6 主機的代理和轉譯
在區域網路際網絡注冊管理機構耗盡所有可使用的 IPv4 位址後,非常有可能新加入網際網路的主機隻具有 IPv6 連接配接能力。對這些須要向後相容以能存取 IPv4 資源的用戶端,須要布署合适的轉換機制。
一種轉換技術是使用雙堆棧的應用層代理,如網頁代理伺服器。
一些對于應用程式無法得知但在其低層使用類 NAT 轉換技術也曾被提出。但因為一般應用層協定所要求的能力其應用太廣,其中大部分都被認定在實際上太不可靠,并且被認為應删除。