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。在編程過程中如果要對協議進行解析,可以通過該字段區分。這也進一步說明了兩種協議的獨立性。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章