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