網絡層的分組為數據報,數據報為首部和數據兩部分組成,如下圖所示。
首部的長度是以4個字節為單位,長度可以是20-60字節,這跟首部的HLEN字段有關。
版本:
這個4位字段定義了IP協議的版本,目前主流的版本是4。
首部長度:
這個4位字段定義了數據報首部的長度,以4字節的字為單位。
當首部沒有選項時,首部長度位20字節;當這個字段值位最大值F時,首部長度最大為60字節。
服務類型:
在最初這個字段有一部分用於定義數據報的優先級,剩下的一部分定義了服務類型。IETF已經改變了這個8位字段的解釋,現在定義了一組區分服務。
碼點 | 未使用 |
在這種解釋種,前6位構成了碼點(codepoint),最后兩位未使用。
X | X | X | 0 | 0 | 0 |
當碼點字段最右邊為0時,對最左邊的解釋為優先級:
這個優先級定義了一些在出現一些問題時數據報的優先級,即當路由器需要丟棄一些數據時,優先級低的將會被首先丟棄。
X | X | X | X | X | 0 |
因特網指派的服務
X | X | X | X | 1 | 1 |
本地指派的服務
X | X | X | X | 0 | 1 |
臨時的或實驗的服務
當碼點字段最右邊的3位不全為0時,這6位定義了54種服務,低延時,高吞吐量等等。
總長度:
這個16位字段定義了數據報總長度,其以字節為單位。故IPv4數據報總長度上限值位65536字節。
注:為什么需要這個字段?在許多情況下,我們確實不需要這個字段值。但是有些情況下,封裝在一個幀里的並不僅僅是數據報,還可能附加了一些填充。比如,以太網協議對幀的數據有最大值(1500字節)和最小值(46字節)的限制,當數據小於46字節時,數據將含有填充數據。
標識(identification):
這個16位字段標志了從源主機發出的一個數據報,這樣就確定了數據報的唯一性。這樣使得數據報被分片后,在到達終點時終點能根據標識號將同一個數據報的分片重新組裝成一個數據報。
標志(flag):
D | M |
第一位保留(未用),第二位為“不分片(do not fragment)”,第三位位“還有分片(more fragment)”。
D為1時,不能對數據進行分片;為0可以進行分片。
M為1時,標識還有分片;為0表示最后一個分片。
分片偏移:
這個13位字段表示的是分片在整個數據報中的相對位置。這是數據在原始數據報中的偏移量,以8字節位單位。
注:分片本身還可能進行分片,這種情況下,分片偏移值永遠是相對於原始數據報的。
生存時間:
這個8位字段用來控制數據報所經過的最大跳數(路由器),每經過一個路由器,這個字段數值都減1,減1后變位0時,路由器就丟棄這個數據報。
協議:
這個8位字段定義了使用IPv4服務的高層協議,如TCP,UDP,ICMP,IGMP,OSPF等的數據都將被封裝到IP數據報中。這個字段指明數據報必須交付給哪個最終目的協議。
注:1表示ICMP,2表示IGMP,6表示TCP,17表示UDP,89表示OSPF
檢驗和:
檢驗IP數據報首部。
源地址:
定義了源點的IP地址,這個字段始終保持不變。
目的地址:
定義了終點的IP地址,這個字段始終保持不變。