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擴展頭部的內容:
IPv6擴展頭部(三)路由擴展頭部:https://blog.csdn.net/fuyuande/article/details/81122628
IPv6擴展頭部(四)分片擴展頭部:https://blog.csdn.net/fuyuande/article/details/81145145
?
參考資料:
1. 《TCP/IP詳解-卷一:協議》W.Richard Stevens。原書第二版。5.3節。
=============================================================================================
Linux應用程序、內核、驅動、后臺開發交流討論群(745510310),感興趣的同學可以加群討論、交流、資料查找等,前進的道路上,你不是一個人奧^_^。
?
總結
以上是生活随笔為你收集整理的IPv6扩展头部 (一) 扩展头部格式、类型与扩展选项的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IPv6扩展头部 (四) 分片头部 Fr
- 下一篇: 关于BFD(双向转发检测)开发的总结