ipv4的報文格式


IPV4 數據報頭部格式

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

圖解

 

圖片來自:http://blog.163.com/qhj4433210@126/blog/static/165975282201592251248584/

 

 

 

圖片來自:http://blog.163.com/qhj4433210@126/blog/static/165975282201592251248584/

 

前言

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

格式

版本(Version)

版本字段指定了IP數據報中使用的IP協議版本,占四位。如過協議是IPV4,則值為0100。

頭部長度(Header Length)

頭部長度字段指示IP數據報頭部的總長度,IP數據報頭部的總長度以4字節為單位,該字段占4位。當報頭中無選項字段時,報頭的總長度為5,也就是5×4=205×4=20字節(此時,報頭長度的值為0101)。這就是說IP數據報頭部固定部分長度為20字節。當IP頭部長度為1111時,頭部的固定長度為15×4=6015×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數據報的最大長度為2161216−1字節即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=25528−1=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位的整數倍,這時需要后面的填充字段湊齊。如果恰好是整數倍,則不需要填充字段。

 

 

原文鏈接:IPV4數據報頭部格式_changsoon-CSDN博客_ipv4數據報格式


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM