1. 程式人生 > >IPv6擴充套件頭部 (一) 擴充套件頭部格式、型別與擴充套件選項

IPv6擴充套件頭部 (一) 擴充套件頭部格式、型別與擴充套件選項

之前幾篇部落格介紹了IPv6的擴充套件頭部,包括分片頭部和路由頭部。接下來介紹一下IPv6擴充套件頭部以及擴充套件選項的內容,可能會有這樣的疑問,有了擴充套件頭部怎麼還需要擴充套件選項?擴充套件選項是幹嘛用的?本篇部落格就介紹相關內容。

IPv6擴充套件頭部

       在IPv6中,那些由IPv4選項提供的特殊功能,通過在IPv6頭部之後增加擴充套件頭部實現。IPv4路由和時間戳功能都採用這種方式,其它功能(例如分片和超大分組)很少在IPv6中使用(但仍需要),因此沒有為它們在IPv6頭部分配相應的位。基於這種設計,IPv6頭部固定為40位元組,擴充套件頭部僅在需要時新增。在選擇IPv6頭部為固定大小時,要求擴充套件頭部僅由終端主機處理(有一個例外)。IPv6設計者簡化了高效能路由器的設計和實現,這是因為IPv6路由器處理分組所需命令比IPv4簡單。實際上,分組處理效能受很多因素影響,包括協議複雜性、路由器硬體和軟體功能,以及流量負載等。

        擴充套件頭部和更高層協議(例如TCP/UDP) 頭部與IPv6頭部連結起來,形成級聯的頭部。如下圖:

IPv6頭部使用下一個頭部欄位形成一個鏈。鏈中的頭部可以是IPv6擴充套件頭部或傳輸層頭部。IPv6頭部出現在資料報的開頭,並且長度始終為40位元組。

IPv6 下一個頭部欄位值可能表示擴充套件頭部或其他協議頭部,在適當的情況下,它與IPv4協議欄位使用相同值。

通過上表可以看到,IPv6擴充套件頭部機制將一些功能(例如路由和分片)與選項加以區分。注意選項不是擴充套件頭部,選項接下來講。

除了"逐跳選項"的位置之外(它是強制性的), 擴充套件頭部的順序是建議性的,因此一個IPv6的實現必須按接收的順序處理擴充套件頭部。只有"目的地選項" 頭部可以使用兩次

。第一次是指出包含在IPv6頭部中的目的IPv6地址,第二次(位置8)是關於資料報的最終目的地。在某些情況下(例如使用路由頭部),當資料報被轉發到最終目的地時,IPv6頭部中的目的IP地址欄位將會改變。

IPv6選項

相對於IPv4,IPv6提供了一種更靈活和可擴充套件的方式,將擴充套件和選項相結合。由於IPv4頭部空間的限制(最大60位元組),那些來自IPv4的選項已停止使用。而IPv6可變長度的擴充套件頭部或編碼在特殊擴充套件頭部中的選項可以適應當前更大的Internet。如果選項存在,可放入逐跳選項(與一個數據報傳輸路徑上每個路由器相關)或目的地選項(僅與接收方相關)。逐跳選項(稱為HOPOPT)是唯一由分組經過的每個路由器處理的選項。逐跳選項和目的地選項編碼格式一樣。這些選項被編碼為型別 - 長度 - 值 (TLV) 集合,如下圖:

逐跳選項和目的地選項編碼為TLV集合。第一個位元組給出了選項型別,包括一些子欄位,在選項沒被識別時只是一個IPv6節點如何動作,以及在資料報轉發時選項資料是否改變。選項資料長度欄位給出了選項資料的位元組長度。

TLV 結構如上圖所示,它的長度為2位元組,後面是可變長度的資料位元組。第一位元組表示選項型別,其綜合那個包括3個子欄位。當5位的型別子欄位無法由選項識別時,第一個子欄位給出了一個IPv6節點嘗試執行的動作,如下圖:

       如果一個發往組播目的地的資料報中包含一個未知選項,那麼大量節點將生成返回源節點的流量。這可通過將動作子欄位設定為11來避免。動作子欄位的靈活性在開發新的選項是有用的。當選項資料可能在資料報轉發過程中改變時,改變位欄位(Chg)設定為1。一些已經定義的選項如下:

IPv6選項攜帶在逐跳(H)選項或者目的地(D)選項擴充套件頭部中,也就是其它擴充套件頭部不帶(例如分片頭部)。選項型別欄位包含來自“型別”列以及動作和改變子欄位中的二進位制值。“長度”列包含選項資料長度位元組中的值,填充1是唯一沒有該位元組的選項。

    看一下實際的報文加深一下映像,只看理論的話都快睡著了。

下面是一個帶逐跳選項擴充套件首部的ICMPv6報文,其中包含兩個選項,分別是路由器警告選項和填充N選項,關於這兩個選項的具體含義下面再介紹,首先關注一下他倆的結構,TLV結構, 型別 - 長度 - 值。其中型別選項又分為三個欄位,動作、Chg和型別子欄位。這個和上面介紹的表相一致。

接下來介紹一下具體的選項含義:

1. 填充1和填充N

        由於IPv6選項需要與8位元組的偏移量對齊,因此較小的選項用0填充到長度為8位元組。這裡由兩個填充選項,分別稱為填充1和填充N。填充1選項(型別0)是唯一缺少長度欄位和值欄位的選項。它僅有一個位元組長,取值為0。填充N選項(型別1)向頭部的選項區域填充2位元組或者更多位元組。對於n個填充位元組,選項資料長度欄位包含的值為(n - 2)。

下圖包含兩個填充1選項:

2. 路由器警告

       路由器警告選項指出資料報包含需要路由器處理的資訊。它與IPv4的路由器警告選項的目的相同。這個選項平時用到很少,我們只要知道有這個定義和它的樣子就好了。這個選項在上圖裡有,可以觀察一下。

3. IPv6超大有效載荷

      在某些TCP/IP網路中,例如哪些用於互聯超級計算機的網路,由於正常的64KB的IP資料報大小限制,在傳輸大量資料時會導致不必要的開銷。IPv6超大有效載荷選項指定了有效載荷大於65535位元組的IPv6資料報,稱為超大報文,這個選項無法由MTU小於64KB的鏈路連線的節點來實現。超大有效載荷選項提供了一個32位的欄位,用於攜帶有效載荷在65535-4294967295(4 GB)位元組之間的資料報。

      當一個用於傳輸的超大報文形成時,其正常IPv6固定首部中的負載長度欄位被設定為0.

選項就介紹這麼多,還有其它的一些選項,如隧道封裝限制、快速啟動等。用的時候很少,長這麼大還沒見過。所以先了解常用的,其它的選項等實際開發工作中遇到在慢慢處理。像我目前的IPv6工作中,基本上不會處理選項內容,當然這也和應用相關。

關於IPv6擴充套件頭部的內容:

參考資料:

1. 《TCP/IP詳解-卷一:協議》W.Richard Stevens。原書第二版。5.3節。