IP數據報
這篇文章我們一起來學習下IP數據報的格式。
如下圖所示:

一個IP數據報由首部和數據兩部分組成,首部的前一部分是固定長度,共20字節,是所有IP數據報必須具有的。在首部的固定部分的后面,是一些可選字段,其長度是可變的。下面看下各字段的含義:
- 版本
占4位,指IP協議的版本。通信雙方使用的IP協議的版本必須一致。目前廣泛使用的IP協議版本號為4(即IPv4) - 首部長度
占4位,可表示的最大十進制數值是15。請注意,首部長度字段所表示數的單位是32位,即4字節,也就是說,如果首部長度為0101(十進制為5),那么首部長度則占20個字節。因為IP首部的固定長度是20字節,因為這一字段的最小值為0101。當這一字段達到最大值1111(十進制為15)時,就表示首部長度為60字節。如果IP分組首部的長度不是4字節的整數倍時,必須利用最后的填充字段加以填充,因此,IP數據報的數據部分永遠在4字節的整數倍時開始,這樣在實現IP協議時較為方便。 - 區分服務
占8位,用來獲得更好的服務。只有在使用區分服務時,這個字段才起作用,在一般的情況下都不使用這個字段。 - 總長度
總長度是指首部與數據之和的長度,單位為字節,這一字段為16位,因此數據報的最大長度為2^16 - 1,即65535字節。我們知道,在IP層下面的每一種數據鏈路層協議都規定了一個數據幀中的數據字段的最大長度MTU。當一個IP數據報封裝成鏈路層的幀時,此數據報的總長度一定不能超過下面的數據鏈路層所規定的MTU值,就必須把過長的數據報進行分片處理。
雖然使用盡可能長的IP數據報會使傳輸效率得到提高,但數據報短些也有好處。每一個IP數據報越短,路由器轉發的速度就越快。為此,IP協議規定,在互聯網中所有的主機和路由器,必須能夠接受長度不超過576字節的數據報。這是假定上層交下來的數據長度有512字節(合理的長度),加上最長的IP首部60字節,加上4字節的富余量,就得到576字節。當主機需要發送長度超過576字節的數據報時,應當先了解一下,目的主機能否接受所要發送的數據報長度。否則,就要進行分片。
在進行分片時,數據報首部中的“總長度”字段是指分片后的每一個分片的首部長度與該分片的數據長度的總和。 - 標識
占16位。IP軟件在存儲器中維持一個計數器,每產生一個數據報,計數器就加1,並將此值賦給此字段。但這個標識並不是序號,因為IP是無連接服務,數據報不存在按序接收的問題。當數據報由於長度超過網絡的MTU而必須分片時,這個標識字段的值就被復制到所有的數據報片的標識字段中。相同的標識字段的值使分片后的各數據報片最后能正確的重裝成為原來的數據。 - 標志
占3位,但目前只有兩位有意義:- 最低位記為MF(More Fragment),MF = 1 表示后面還有分片的數據報,MF = 0 表示這已是若干數據報片中的最后一個
- 中間一位記為DF(Don't Fragment),意思是不能分片。只有當DF = 0 時才允許分片
- 片偏移
占13位。片偏移指出:較長的分組在分片后,某片在原分組中的相對位置。也就是說,相對於用戶數據字段的起點,該片從何處開始。片偏移以8個字節為偏移單位,即每個分片的長度一定是8字節的整數倍。舉個例子:
一數據報的總長度為3820字節,其數據部分為3800字節長(使用固定首部),需要分片為長度不超過1420字節的數據報片。因固定首部長度為20字節,因此每個數據報片的數據部分長度不能超過1400字節。於是分為3個數據報片,其數據部分的長度分別為1400,1400,1000字節。原始數據報首部被復制為各數據報片的首部,但必須修改有關字段的值,如下圖所示:

下表是本例中數據報首部與分片有關的字段中的數值,其中標識字段的值是任意給定的,具有相同標識的數據報片在目的站就可無誤的重裝成原來的數據報。

現在假定數據報片2經過某個網絡時還需要再進行分片,即划分為數據報片2-1(數據800字節),2-2(數據600字節)。那么這兩個數據報片的總長度、標識、MF、DF和片偏移分別為:820,12345,1,0,175;620,12345,1,0,275
- 生存時間
占8位,生存時間字段常用的英文縮寫是TTL(Time To Live),表明這是數據報在網絡中的壽命。由發出數據報的源點設置這個字段。其目的是防止無法交付的數據報無限制的在互聯網中兜圈子(從路由器R1轉發到R2,再轉發到R3,然后又轉發到R1),因此白白消耗網絡資源。最初的設計是以秒作為TTL值單位的。每經過一個路由器,就把TTL減去數據報在路由器上所消耗的時間。若數據報在路由器消耗的時間小於1s,就把TTL值減1。當TTL值減為0時,就丟棄這個數據報。
隨着技術的進步,路由器處理數據報所需的時間不斷在縮短,一般都遠遠小於1s,后來就把TTL字段的功能改為“跳數限制”。路由器在每次轉發數據報之前就把TTL值減1.若TTL值減小到0,就丟棄這個數據報,不再轉發。因此,現在TTL的單位不再是秒,而是跳數。TTL的意義是指明數據報在互聯網中至多可經過多少個路由器,顯然最大值是255。若把TTL的初始值設置為1,就表示這個數據報只能在本局域網中傳送,因為一旦傳送到局域網上的某個路由器,在被轉發之前TTL值就減小到0,因而就會被路由器丟棄。 - 協議
占8位,協議字段指出此數據報攜帶的數據是使用何種協議,以便使目的主機的IP層知道應將數據部分上交給哪個協議進行處理。常用的一些協議和相應的協議字段值如下:

- 首部檢驗和
占16位。這個字段只檢驗數據報的首部,但不包括數據部分。這是因為數據報每經過一個路由器,路由器都要重新計算一下首部檢驗和,不檢驗數據部分可減少計算的工作量。 - 源地址
占32位 - 目的地址
占32位
IP數據報首部的可變部分
IP數據報首部的可變部分就是一個選項字段。選項字段用來支持排錯、測量以及安全等措施,內容很豐富。此字段的長度可變,從一個字節到40個字節不等,取決於所選擇的項目。某些選項項目只需要一個字節,它只包括一個字節的選項代碼。而有些選項需要多個字節,這些選項一個個拼接起來,中間不需要有分隔符,最后用全0的填充字段補齊成為4字節的整數倍。
增加首部的可變部分是為了增加IP數據報的功能,但這同時也使得IP數據報的首部長度成為可變的。這就增加了每一個路由器處理數據報的開銷。實際上這些選項很少被使用,很多路由器都不考慮IP首部的選項字段,因此新的IP版本IPv6就把IP數據報的首部長度做成固定的。
