1. 程式人生 > >ipv6和ipv4(1)

ipv6和ipv4(1)

20174年7月5日

參考資料:

《Linux高效能伺服器程式設計》       

linux-2.6.32原始碼

《TCP/IP詳解》(卷一)

         網路程式設計最重要的一個環節就是要理清TCP/IP傳輸協議棧。而協議棧的學習自然的少不了最關鍵的一個環節就是協議的分析。

首先是IPv4的首部資訊:

如果涉及到程式設計在linux下/usr/include/netinet/ip.h中對首部欄位有相關的定義。

         4位版本號(IPv4則值為4)

         4位首部長度(注意4位表示的最大值為15,而該欄位用4位元組表示一個字所有首部長度最大值為60這也說明了擴充套件部分【也就是選項部分】最大值為40個位元組)

         8位服務型別

         16位總長度:整個IP資料報長度,以位元組為單位。所以最大長度應該是65535位元組。由於MTU的限制,超過MTU的部分將會涉及到分片。針對分片後面也會有相關的介紹。

         16位標識:唯一的標識一個主機發送的資料報,需要註明的是這個數值由系統開始隨機分配,後面每傳送一個數據報其值都會加1.

         3位標誌:第一位保留,第二位DF表示禁止分片。如果該位設定則不能對資料包分片,如果資料包長度超過MTU則會直接丟棄併產生ICMP差錯報文。第三位MF表示更多分片除了最後一個數據報,其他分片都要置為1.

         13

位片偏移:分片相對原始IP資料報開始處的片偏移。(實際偏移值應該是左移三位*8取得,所以每個IP分片的資料長度必須是8的整數倍)

         8位生存時間。

         8位協議:區分上層協議

         16位首部校驗和

         32位源和目的IP地址。

         選項欄位為可邊長資訊部分,最多包含40個位元組,其中包括,記錄路由、時間戳、鬆散源路由選擇、嚴格源路由選擇。

IP模組的基本工作流程如下:(摘自部落格圖:http://book.51cto.com/art/201306/400253.htm)


         通過上圖可以清晰的理解和分析清楚IP模組的具體工作流程。而針對地址耗盡的問題提出了IPv6,下圖中貼出ipv6的首部報文格式:


         4位版本號:與ipv4 的版本號一樣,ipv6版本號的值為6

         12位通訊型別:指示資料流通訊型別或者優先順序和ipv4的TOS欄位類似

         20位流標籤:用於對連線的服務質量有一定要求的通訊,如語音、視訊等。

         16位淨荷長度:除ipv6首部以外所有資料部分和擴充套件頭部資料長度之和。

         8位下一個包頭:指出記下來的報頭型別

         8位跳數限制:類似於RTT值。

注意:擴充套件頭部沒有詳細說明,該部分內容可以查閱相關資料。

總結:

         與ipv4不同在於ipv6首部沒有選項欄位,而且首部長度固定為40個位元組(ipv4如果沒有選項欄位則首部固定長度為20位元組)而且ipv6和ipv4並沒有包含關係,兩者是兩種完全不同的協議。在作業系統中兩種協議也是各自獨立的執行。(這也是為什麼使用雙協議棧比較佔系統資源的原因)在乙太網幀的封裝中ipv4協議型別值為0X0800而ipv6的乙太網封裝則為0X86dd。在程式設計過程中如果要對協議進行解析,可以通過該欄位區分。這也進一步說明了兩種協議的獨立性。