1。緒論
IP 第 6 版 (IPv6) 是繼 IP 第 4 版 (IPv4) [RFC-791] 以後,網際網路通訊協定 (IP)的一個新版本。由 IPv4 到IPv6的改變主要集中在以下幾個方面: 地址容量的擴充
IPv6把 IP 位址的大小從 32 位增至 128 位,可以支援更多的地址層次,更大數量的節點,以及更簡單的地址自動設定。組播路由的可縮放性改進為給組播地址增加一個"範圍"欄位。又定義了一個叫做"anycast"的新的地址類型,用於把包發送給一組節點中的任意一個。 首部格式的簡化
一些 IPv4 首部欄位被刪除或者成為可選欄位,減少了一般情況下包的處理開銷以及IPv6首部佔用的頻寬。 支援擴充和選項的改進
IP 首部選項編碼方式的修改導致更加高效的傳輸,在選項長度方面更少的限制,以及將來引入新的選項時更強的適應性。 資料流標籤的能力
加入一個新的能力,使得那些寄件者要求特殊處理的屬於特別的傳輸"流"的包能夠貼上"標籤",比如非預設品質的服務或者"即時"服務。 認證和保密的能力
為支援認證,資料完整性以及(可選的)資料保密的擴充都在IPv6中說明。本文描述IPv6基本首部以及最初定義的IPv6 擴充首部和選項。還將討論包的大小問題,資料流標籤和傳輸類別的文法,以及IPv6對上層協議的影響。IPv6 地址的格式和文法在其它文章中單獨說明。IPv6版的 ICMP 是所有IPv6應用都需要包含的。
2。術語
節點 - 應用IPv6的一個裝置。
路由器 - 傳送不是發給自己的IPv6包的節點. [參見下面的說明]
主機 - 任何非路由器節點. [參見下面的說明]
上層 - 直接在IPv6上層的協議層。典型的例子是傳輸協議如 TCP 和 UDP,控制協議如 ICMP,路由協議如 OSPF,以及網路層或在IPv6裡被開鑿了通道 (也就是封裝在IPv6裡) 的低層協議,比如 IPX,AppleTalk或IPv6自身。
鏈路 - 一個通訊裝置或者媒體。通過它節點可以與鏈路層,也就是直接在IPv6下面的那一層進行通訊。典型的例子是乙太網路(簡單的或者橋接器的),PPP 串連,X.25,框架轉送,或者ATM網路以及網路層(或更高層)的"通道"。比如說通過 IPv4 或者IPv6本身的通道。
鄰居 - 連在同一個鏈路上的節點。
介面 - 節點與鏈路的串連。
地址 -IPv6層中一個介面或者一組介面的標識符。
包 -IPv6首部加上有效資料。
鏈路 MTU - 傳輸單元最大值。也就是以八位組為單位的能在鏈路中傳輸的包的最大大小。
路徑 MTU - 源節點到目的節點之間的路徑中所有鏈路的最小鏈路 MTU。
注意: 儘管不常見,但這是可能的: 就是一個裝置具有多個介面,用來傳輸從它的某些(不是全部)介面傳來的,不以自身為目的節點的包,並且拋棄那些從其他介面傳來的,不以自身為目的節點的包。當這樣的裝置通過前一種介面接收包或者與其鄰居聯絡時,它必須遵循協議中有關路由器的要求。當它通過後一種介面接收包或者與其鄰居聯絡時,它必須遵循協議中有關宿主機的要求。
3.IPv6首部格式
版本 |
4 位Internet協議版本號碼=6。 |
傳輸類別 |
8 位傳輸類別欄位。 |
資料流標籤 |
20位元據流標籤。 |
有效資料長度 |
16 位不帶正負號的整數,IPv6有效資料長度。也就是以八位組為單位,在這個包中IPv6首部後面的其餘部分的長度。(注意,擴充首部將被認為是有效資料的一部分,計算在長度裡) |
下一個首部 |
8 位選取器。標識緊接在IPv6首部後面的下一個首部的類型。使用與 IPv4 協議欄位相同的數值。 |
跳數限制 |
8 位不帶正負號的整數。在每個傳輸此包的節點處遞減1。如 果跳數限制減為零,就拋棄此包。 |
源地址 |
128 位包的製作者的地址。 |
目的地址 |
128 位包的預期接收者的地址 (如果存在路由首部的話,可能不是最終的接收者)。 |
4.IPv6擴充首部
在IPv6裡,可選的網路層資訊在一個獨立的首部編碼,放在包中IPv6首部與上層協議首部之間。有這樣幾個為數不多的擴充首部,每個首部由不同的"下一個首部"的值來標識。一個IPv6首部可以攜帶零個,一個或者更多的擴充首部,每個擴充首部由前一個首部中的"下一個首部"欄位標識。如下例所示:
除了一個特例,擴充首部不在包的傳送路徑中的任何節點檢測和處理,直到這個包到達目的地址欄位標識的那個節點(或者在組播的情況下,一組節點中的每一個)。在這裡,對IPv6 首部的"下一個首部"欄位的常規處理將是調用處理模組來處理第一個擴充首部,或者,如果不存在擴充首部,就處理上層首部。每個擴充首部的內容和語義決定是否處理下一個首部。因此,擴充首部必須嚴格按照它們在包中出現的次序來處理;這樣,接收者就不能搜尋整個包來尋找某個特定類型的首部,並且在處理所有前面的首部之前處理它。
上文所述的特例是指 Hop-by-Hop 選項首部。它攜帶了包的傳送路徑中的每個節點都必須檢測和處理的資訊,包括源節點和目的節點。Hop-by-Hop 選項首部如果存在,就必須緊跟在IPv6首部後面. IPv6首部中"下一個首部"欄位的值為零表示存在這個首部。如果一個首部的處理結果要求節點處理下一個首部,但是節點無法識別這個首部的"下一個首部"欄位值,那麼節點就應該拋棄這個包,並且給包的源節點發送一個ICMP "參數存在問題"的報文,ICMP 編碼值為 1 ("遇到無法識別的'下一個首部'類型")。ICMP 指標欄位包含那個無法識別的值在原包中的位移量。如果節點遇到IPv6首部以外的其他首部中的"下一個首部"欄位的值為零的情況,應做相同的處理。
為了後面的首部保持8個八位組對齊,每個擴充首部都是8個八位組的整數倍長。每個擴充首部的多八位組欄位都以它們的常態範圍對齊。也就是說,寬度為 n 個八位組的欄位放在距首部開始位置處 n 個八位組的整數倍的位置上,其中 n = 1,2, 4,或者 8。一個完整的IPv6實現應包含以下擴充首部的處理常式: Hop-by-Hop 選項首部 路由首部 (類型 0) 分區首部 目的地址首部 認證首部 封裝安全有效資料首部 (ESP 首部)
4.1 擴充首部的順序
當在同一個包中使用多於一個擴充首部時,建議以如下順序排列這些首部:
IPv6首部 |
Hop-by-Hop 選項首部 |
目的地址選項首部 (注 1) |
路由首部 |
分區首部 |
認證首部 (注 2) |
封裝安全有效資料首部 (注 2) |
目的地址選項首部 (注 3) |
上層協議首部 |
注 1: 由IPv6目的地址欄位及路由首部列出的後續地址中第一個出現的目的地址處理的選項。
注 2: 關於認證首部和封裝安全有效資料首部的相關順序的附加建議參見其它文獻。
注 3: 只由包的最終目的地址處理的選項。
除了目的地址選項首部最多出現兩次 (一次在路由首部前,一次在上層協議首部前)以外,每個擴充首部應當只出現一次。如果上層協議首部是另一個IPv6首部 (在使用通道技術或封裝在IPv6中的情況下),它後面可以有自己的擴充首部. 這些擴充首部以同樣的建議順序獨立排列。如果定義了其他的擴充首部,與上面列出的擴充首部相關的次序限制必須加以說明。除了 Hop-by-Hop 選項首部必須緊跟在IPv6首部後面以外,IPv6節點必須接受並且盡量處理任意順序的,以及在同一個包內出現任意多次的擴充首部。儘管如此,建議IPv6包的源節點遵守上面的建議順序,除非後續的協議規範修改這一順序。
4.2 選項
當前已定義的擴充首部中的兩個:Hop-by-Hop 選項首部和目的地址選項首部,攜帶不定數量的,以類型―長度―值(TLV)格式進行編碼的選項,其格式如下:
選項類型 |
8 位標識符,標識選項的類型。 |
選項資料長度 |
8 位不帶正負號的整數。以八位組為單位的選項資料欄位的長度。 |
選項資料 |
可變長度欄位。依選項類型而不同的資料。 |
首部中的選項必須嚴格按照它們在首部中出現的次序來處理;這樣,接收方就不能搜尋整個首部來尋找某個特定類型的選項,並且在處理所有前面的選項之前處理它。選項類型標識符以如下規則編碼: 其最高兩位指定了當IPv6節點無法識別這一選項類型時所必須的反應:
00 |
跳過這一選項,繼續處理首部。 |
01 |
拋棄這個包 |
10 |
拋棄這個包,並且不管包的目的地址是不是組播地址,都給包的源地址發送一個 ICMP "參數存在問題",編碼 2 的報文,指標指向無法識別的選項類型。 |
11 |
拋棄這個包,並且只有當包的目的地址不是組播地址時,才給包的源地址發送一個 ICMP "參數存在問題",編碼 2 的報文,指標指向無法識別的選項類型。 |
選項類型標識符的第三位指明了選項資料是否可以改變到最終目的地址的選路。若存在認證首部,在包計算或校正認證值時,可改變選路的選項的整個資料欄位都必須當作全零的八位組來處理。
0 - 選項資料不會改變選路
1 - 選項資料可能改變選路
上述的前三位應作為選項類型的一部分,而不能獨立於選項類型之外。這就是說,某一特定的選項是由全部 8 位的選項類型標識符標識的,而並不只是選項類型中的後面 5 位。Hop-by-Hop 選項首部和目的地址選項首部使用相同的選項類型編碼空間。儘管如此,某一特定類型的選項的規範可以限制其只用於兩者之一。有些選項可能具有明確的對齊要求,以保證選項資料欄位中的多八位組值能夠落在其常態範圍上。選項的對齊要求用符號 xn+y 來說明,表示選項類型必須出現在從首部開始位置處 x 個八位組的整數倍加上 y 個八位組的位置上。例如: 2n表示從首部開始處 2 個八位組的整數倍的位移量。8n+2 表示從首部開始處 8 個八位組的整數倍加上 2 個八位組的位移量。有兩種填充選項,用來在需要時對齊後續的選項,以及把整個首部填充成 8 個八位組的整數倍長。所有的IPv6實現都必須能夠識別這些填充選項。
填充1 選項 (對齊要求: 無)
填充1 選項是一種特殊情況 -- 它沒有長度欄位和數值欄位。填充1 選項用於在首部的選項區填充一個八位組。如果需要填充多於一個的八位組,那麼就應該使用下面要介紹的填充N 選項,而不是多個填充1 選項。
填充N 選項 (對齊要求: 無)
填充N 選項用於在首部的選項區填充兩個或兩個以上的八位組。對於 N 個八位組的填充,選項資料長度欄位應包含值 N-2,選項資料由 N-2 個零值八位組組成。
4.3 Hop-by-Hop 選項首部
Hop-by-Hop 選項首部用於傳送必須由包的傳送路徑中的每個節點檢測的可選資訊。Hop-by-Hop 選項首部由IPv6首部中"下一個首部"欄位值為 0 來標識,並且具有如下的格式:
下一個首部 |
8 位選取器。標識緊跟在Hop-by-Hop 選項首部後面的首部的類型。使用與 IPv4 協議欄位 相同的數值。 |
首部擴充長度 |
8 位不帶正負號的整數。以 8 個八位組為單位的 Hop-by-Hop選項首部的長度,不包括開始的 8 個八位組。 |
選項 |
可變長度欄位,其長度須使整個 Hop-by-Hop 選項首部的長度為 8 個八位組的整數倍。包含一個或多個 TLV 編碼的選項,如第 4.2 章中所述。 |
在本文中定義的僅有的 Hop-by-Hop 選項是填充1 及填充N 選項。
4.4 路由首部
路由首部用於IPv6源節點列出到包的目的節點的路徑中所應"訪問"的一個或多個中間節點。這一功能十分類似於 IPv4 的鬆散源地址和路由記錄選項。前面的首部中"下一個首部"欄位中的值為 43 表示下一個首部為路由首部。路由首部具有如下的格式:
下一個首部 |
8 位選取器。標識緊跟在路由首部後面的首部的類型。使用與 IPv4 協議欄位相同的數值。 |
首部擴充長度 |
8 位不帶正負號的整數。以 8 個八位組為單位的路由首部的長度,不包括開始的 8 個八位組。 |
路由類型 |
8 位的某種特定路由首部變數的標識符。 |
分段剩餘 |
8 位不帶正負號的整數。剩餘的路由分段的數量。也就是在到達最終的目的節點之前仍然應當訪問的,明確列出的中間節點的數量。 |
特定類型的資料 |
可變長度欄位。其格式由路由類型決定,其長度須使整個路由首部的長度為 8 個八位組的整數倍。 |
如果節點在處理收到的包的過程中遇到了含有無法識別的路由類型值的路由首部,節點應根據分段剩餘欄位中的值進行處理,如下所述:如果分段剩餘值是零,節點必須忽略路由首部,繼續處理包中的下一個首部,其類型由路由首部中的"下一個首部"欄位中的值來標識。如果分段剩餘值非零,節點必須拋棄這個包,並且給包的源地址發送一個 ICMP"參數存在問題",編碼 0 的報文,指標指向無法識別的路由類型。如果中間節點在處理路由首部之後,確定應將包傳送到一個鏈路 MTU 小於此包的大小的鏈路中去,那麼中間節點必須拋棄此包,並且給包的源地址發送一個 ICMP"包太大"的報文。
類型 0 的路由首部具有如下格式:
下一個首部 |
8 位選取器。標識緊跟在路由首部後面的首部的類型。使用與 IPv4 協議欄位相同的數值。 |
首部擴充長度 |
8 位不帶正負號的整數。以 8 個八位組為單位的路由首部的長度,不包括開始的 8 個八位組。對於類型 0 的路由首部,首部擴充長度等於首部中地址數量的兩倍。 |
路由類型 |
0 |
分段剩餘 |
8 位不帶正負號的整數。剩餘的路由分段的數量。也就是在到達最終的目的節點之前仍然應當訪問的,明確列出的中間節點的數量。 |
保留 |
32 位保留欄位。傳輸時初始化為零;接收時忽略。 |
地址[1..n] |
128 位地址向量,從 1 到 n 編號。 |
不允許組播地址出現在類型 0 的路由首部中,也不允許出現在攜帶類型 0 路由首部的包中的IPv6目的地址欄位中。直到包到達IPv6首部中的目的地址欄位所標識的那個節點才對路由首部進行檢測和處理。在這個節點調用路由首部處理模組,並且對於路由類型 0,執行下面的演算法:
if 分段剩餘 = 0 { 繼續處理包中的下一個首部,其類型由路由首部中"下一個首部"欄位所標識 } else if 首部擴充長度為奇數 { 給源地址發送一個 ICMP "參數存在問題",編碼 0 的報文,指標指向首部擴充長度欄位,並且拋棄此包 } else { 計算出n,也就是路由首部中的地址數量。方法是首部擴充長度除以 2 if 分段剩餘比 n 大 { 給源地址發送一個 ICMP "參數存在問題",編碼 0 的報文,指標指向分段剩餘欄位,並且拋棄此包 } else { 分段剩餘減一; 計算 i,也就是地址向量(地址清單)中要"訪問"的下一個地址,方法是 n 減分段剩餘 if 地址[i] 或者IPv6目的地址是組播地址 { 拋棄此包 } else { 交換IPv6目的地址和地址[i] ifIPv6跳數限制小於等於 1 { 給源地址發送一個 ICMP "逾時 - 傳輸超過跳數限制" 的報文,並且拋棄此包 } else { 跳數限制減一; 向IPv6模組重新提交此包,傳給新的目的節點 } } } }
作為上述演算法的一個例子,考慮這樣一種情況: 源節點 S 給目的節點 D 發送一個包,用路由首部來使這個包經過中間節點 I1,I2 和 I3。在傳送路徑的每段中, IPv6首部中的相關欄位值以及路由首部欄位值應為如下所述:
當包從 S 傳到 I1: |
源地址 = S 目的地址 = I1 |
首部擴充長度 = 6 |
分段剩餘 = 3 |
地址[1] = I2 |
地址[2] = I3 |
地址[3] = D |
當包從 I1 傳到 I2: |
源地址 = S 目的地址 = I2 |
首部擴充長度 = 6 |
分段剩餘 = 2 |
地址[1] = I1 |
地址[2] = I3 |
地址[3] = D |
當包從 I2 傳到 I3: |
源地址 = S 目的地址 = I3 |
首部擴充長度 = 6 |
|