1. 程式人生 > >IPV4資料報頭部格式

IPV4資料報頭部格式

IPV4 資料報頭部格式

摘自:《深入理解計算機網路》 王達著 機械工業出版社

圖解

前言

傳送端的網路層在收到它的上一層——傳輸層發來的資料段時,需要通過網路層協議將其封裝成資料報,也就是加上網路層IP協議(在此僅以IP協議為例進行介紹)頭部。IP協議頭部主要是源和目的網路的IP地址,以便可以資料分段傳輸到目的網路中。然後資料包向下傳輸,到了資料鏈路層後又要封裝成資料幀。
與在資料幀格式中包括幀頭和資料部分類似,一個IP資料報也包括報頭和資料這兩個部分,如上圖所示。其中資料部分就是來自傳輸層的完整資料段,而報頭部分是為了正確傳輸資料報而增加的網路層IPV4/IPV6協議資訊。

格式

版本(Version)

版本欄位指定了IP資料報中使用的IP協議版本,佔四位。如過協議是IPV4,則值為0100。

頭部長度(Header Length)

頭部長度欄位指示IP資料報頭部的總長度,IP資料報頭部的總長度以4位元組為單位,該欄位佔4位。當報頭中無選項欄位時,報頭的總長度為5,也就是5×4=20位元組(此時,報頭長度的值為0101)。這就是說IP資料報頭部固定部分長度為20位元組。當IP頭部長度為1111時,頭部的固定長度為15×4=60位元組。但報頭長度必須是32位(四位元組)的整數倍,如果不是,需要在選項欄位的填充(PAD)欄位中補0湊齊。

區分服務(Differentialted Services)

最開始IP資料報的這個欄位為優先順序和服務型別欄位,又稱為服務型別(ToS)欄位,用於表示資料報的優先順序和服務型別,佔八位。它包括一個3位長度的優先順序、4位長度的標誌位。標誌位分別是D(Delay延遲)、T(Throughput吞吐量)、R(Reliability可靠性)和C(Cost開銷),分別表示延遲、吞吐量、可靠性和開銷值,用來獲得更好的服務。最高1位未用。
1998年IETF在RFC2474中把IP資料報中ToS欄位改名為服務欄位,同樣為8位,前6位構成DSCP(Different Services Code Point,區分服務碼點),是IP優先順序和服務型別欄位的組合,定義了0~63共64個優先順序。最後兩位未使用。無論是哪種版本,該欄位只有在使用區分服務時才起作用,如果沒有區分服務,則該欄位值為0。

總長度(Total Length)

總長度欄位標識整個IP資料報的總長度,包括報頭和資料部分,整個IP資料報的總長度以位元組為單位,該欄位佔16位。由此可得出,IPv4資料報的最大長度為2161位元組即65535位元組(64KB)。
說明:在網路層下面的每一種資料鏈路層都有自己的格式,其中包括表示資料欄位的最大長度,這稱為最大傳送單元(Maximum Transfer Unit,MTU)。當一個數據報封裝成鏈路層的幀時,此資料報的總長度(包括報頭和資料部分)一定不能超過下面的資料鏈路層的MTU值

標識(Identification)

標識欄位用於表示IP資料報的識別符號,佔16位,每個IP資料報有一個唯一的識別符號。IP軟體在儲存器中維持一個計數器,每產生一個數據報,計數器就加1,並將此值賦給整個標識欄位。但整個標識並不是序號,因為IP是無連線服務,資料報不存在按序接受的問題。當資料報由於長度超過下面資料鏈路層的MTU(最大傳輸單元)值而必須分段的時候,這個識別符號的值就被複制到所有的資料報分段的標識欄位中。相同的標識欄位的值分段後的各資料報分段最後能正確地組裝成原來的資料報。

標誌(Flags)

標誌欄位用以指出該IP資料報後面是否還有分段,也就是這個欄位時分段標誌,佔3位。目前只有前兩位有意義:最低以為記為MF(More Fragment),如果MF=1,則表示後面還有分段,如果MF=0表示這已是某個資料報的最後一個分段;中間一位記為DF(Don’t Fragment),當DF=1時表示不允許分段,DF=0表示允許分段;最高1位沒有使用。

段偏移(Fragment Offset)

段偏移欄位用以指出該分段在資料報中的相對位置,也就是說,相對於使用者資料欄位的起點,該分段從何處開始,佔13位。若有分段,段偏移以8位元組為偏移單位,即每個分段的長度一定是8位元組(64位)的整數倍。第一個分段偏移值就是0 0000 0000 0000,如果第一個分段一共是64位元組,則0 0000 0000 1001,相當於10進位制數的9,因為從第9個“8位元組”資料塊開始的。如果沒有分段,則該欄位值為0。

生存時間(Time To Live)

生存時間欄位用來標識IP資料報在網路中傳輸的有效期,以秒來計數,佔8位。最初的設計是以秒為單位,沒經過一個路由器時,就在TTL(Time To Live)中減去資料報在路由器消耗掉的一段時間。若資料報在路由器消耗的時間小於1s,就把TTL值減1。TTL的建議值是32s,最長是281=255s。現在通常認為這個TTL是指資料報允許經過的路由器數,每經過一個路由器,則TTL減1,當TTL值為0時,就丟棄這個資料報。設定生存時間是為了防止資料報在網路中無限制地迴圈轉發。

協議(Protocol)

協議欄位用來標識此IP資料報在傳輸層所採用的協議型別(如TCP、UDP或ICMP等等),以便使目的主機的IP層直到應將資料部分上交給哪個處理過程,佔8位。如TCP的協議號是6,等於二進位制的0000 1010,UDP的協議號是17,等於二進位制的0001 0001。

校驗和(Checksum)

校驗和欄位用來檢驗IP資料報的報頭部分(不包過“資料”部分)在傳輸到接收端後是否發生了變化,佔16位。這是因為資料報每經過一個路由器,路由器都要重新計算一下報頭檢驗和(因為一些欄位,如生存時間、標識、段偏移等都可能發生變化),不檢驗資料部分可減少計算的工作量。

檢驗和的計算方法

利用校檢和欄位檢驗報頭部分資料正確性的基本原理是:現在傳送端校檢和欄位中填上一個特定的值,然後再接收端把包括校檢和欄位在內的報頭部分進行二進位制反碼求和,再取反,如果結果為0,則表示報頭部分在傳輸過程中沒有發生變化,否則表示在傳輸過程中出現了差錯。從以上可以看出,這裡最關鍵的是在傳送端計算出這個校檢和的值。步驟如下:
1. 把IP資料報報頭中的校檢和欄位置0。
2. 把頭部看成由16位(2位元組)位單位得數字組成,對每16位的二進位制反碼進行求和。如報頭長度不是16位的整數倍數,則用0填充到16位的整數倍數。若此時校驗和欄位值為0,可以不計,因為0的反碼仍為0。
3. 以上得到的結果就是我們要求的校驗和欄位值,系統自動將其填入IP資料報報頭的檢驗和欄位中。
4. 在接收端中,同樣按照以16位為單位,對IP資料報報頭部分進行二進位制反碼求和,再取反,如果結果為0,表示報頭部分在傳輸過程中沒有發生變化,否則表示發生了差錯。但要注意,此時因位校驗和欄位已不再是0了,而是等於除了檢驗和欄位外的其他欄位的反碼之和。現在在對校驗碼和欄位值取反求和,再與其他欄位的反碼之和(相當於原來“校驗和”欄位的值)相加,結果肯定是全為1,因為這兩個值互為反碼;再取反後,結果肯定為0。這就是校驗和的基本原理。

例子

假設有3個數(為了簡便,在此均用4位表示):2(0010)、3(0011)、C(代表校驗和欄位值),計算C,即求2和3的反碼之和,得到9(1001)。現在假設把這3個數(2,3,C)傳送到接收端。在接收端也要對這3個數進行反碼求和。因為2和3這兩個的反碼之和我們在計算C時已經計算過了,就是9(1001),現在只需要對C(校驗和欄位值)進行求反,得到6(0110)。把1001和0110相加,得到15(1111)。再取反,得到0(0000)。這就是這3個數在傳輸過程中沒有出現差錯的情況下得到的,這就是校驗和的校驗原理。

源地址/目的地址(Source Address/Destination Address)

源地址/目的地址這兩個欄位分別表示該IP資料報傳送者和接受者的IP地址,各佔32位。在這個資料報傳送過程中,無論經過什麼路由,無論如何分段,此兩欄位一直保持不變。

選項(Option)

選項欄位支援各種選項,提供擴充套件餘地。根據選項的不同,該欄位時可變長,從1位元組到40位元組。用來支援拍錯、測量以及安全等措施。作為選項,使用者可以使用,也可以不使用它們。但作為IP協議的組成部分,所有實現IP協議的裝置都必須能處理IP選項。在使用選項的過程中,如果造成了IP資料報的報頭不是32位的整數倍,這時需要後面的填充欄位湊齊。如果恰好是整數倍,則不需要填充欄位。