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