IP資料包格式詳解
IP協議提供不可靠無連線的資料包傳輸服務,IP層提供的服務是通過IP層對資料包的封裝與拆封來實現的。IP資料包的格式分為報頭區和資料區兩大部分,其中報頭區是為了正確傳輸高層資料而加的各種控制資訊,資料區包括高層協議需要傳輸的資料。
IP資料包的格式如下:
注意,上圖表示的資料,最高位在左邊,記為0位;最低位在右邊,記為31位。在網路中傳輸資料時,先傳輸0~7位,其次是8~15位,然後傳輸16~23位,最後傳輸24~31位。由於TCP/IP協議頭部中所有的二進位制數在網路中傳輸時都要求以這種順序進行,因此把它稱為網路位元組順序。在實際程式設計中,以其他形式儲存的二進位制數必須在傳輸資料前使用網路程式設計API相應的函式把頭部轉換成網路位元組順序。
IP資料包各欄位功能如下:
1)版本號:佔用4位二進位制數,表示該IP資料包使用的IP協議版本。目前Internet中使用的主要是TCP/IP協議族中版本號為4的IP協議。
2)頭長度:佔用4位二進位制位,此域指出整個報頭的長度(包括選項),該長度是以32位二進位制數為一個計數單位的,接收端通過此域可以計算出報頭在何處結束及從何處開始讀資料。普通IP資料包(沒有任何選項)該欄位的值是5(即20個位元組的長度)。
3)服務型別(TOS、type of service):佔用8位二進位制位,用於規定本資料包的處理方式。服務型別欄位的8位分成了5個子域:
(1)—優先權(0-7)數越大,表示該資料包優先權越高。網路中路由器可以使用優先權進行擁塞控制,如當網路發生擁塞時可以根據資料包的優先權來決定資料包的取捨。
(2)—短延遲位D(Delay):該位置1時,資料包請求以短延遲通道傳輸,0表示正常延時。
(3)—高吞吐量位T(Throughput):該位置1時,資料包請求以高吞吐量通道傳輸,0表示普通。
(4)—高可靠位R(Reliability):該位置1時,資料包請求以高可靠性通道傳輸,0表示普通。
(5)—保留位。
目前在Internet中使用的TCP/IP協議大多數情況下網路並未對TOS進行處理,但在實際程式設計時,有專門的函式來設定該欄位的各域。一些重要的網際應用協議中都設定了建議使用的TOS值:
從上表可以看出,對於與使用者直接互動的應用,一般使用短延時;對於有大量資料需要進行傳輸的應用,一般選用高吞吐量;對於資料包要傳輸控制資訊的應用,一般選用高可靠性。在資料包的生存期內不支援TOS的,TOS欄位就設定為0x00。
4)總長度:佔用16位二進位制位,總長度欄位是指整個IP資料包的長度(報頭區+資料區),以位元組為單位。利用頭部長度欄位和總長度欄位就可以計算出IP資料包中資料內容的起始位置和長度。由於該欄位長度為16位二進位制數,因此理論上IP資料包最長可達65536個位元組(事實上受物理網路的限制,要比這個數值小很多)。
5)生存時間(TTL,time to live):佔用8位二進位制位,它指定了資料包可以在網路中傳輸的最長時間。實際應用中把生存時間欄位設定成了資料包可以經過的最大路由器數。TTL的初始值由源主機設定(通常為32、64、128或256),一旦經過一個處理它的路由器,它的值就減1。當該欄位為0時,資料包就丟棄,併傳送ICMP報文通知源主機,因此可以防止進入一個迴圈迴路時,資料包無休止地傳輸下去。
6)上層協議標識:佔用8位二進位制位,IP協議可以承載各種上層協議,目標端根據協議標識就可以把收到的IP資料包送到TCP或UDP等處理此報文的上層協議了。
常用網際協議編號:
7)校驗和:佔用16位二進位制數,用於協議頭資料有效性的校驗,可以保證IP報頭區在傳輸時的正確性和完整性。頭部檢驗和欄位是根據IP協議頭計算出的檢驗和,它不對頭部後面的資料進行計算。
原理:傳送端首先將檢驗和欄位置0,然後對頭部中每16位二進位制數進行反碼求和的運算,並將結果存在校驗和欄位中。 由於接收方在計算過程中包含了傳送方放在頭部的校驗和,因此,如果頭部在傳輸過程中沒有發生任何差錯,那麼接收方計算的結果應該是全1。
8)源地址:佔用32位二進位制數,表示傳送端IP地址。
9)目的地址:佔用32位二進位制數,表述目的端IP地址。
======================IP資料包分片和重組======================
最大傳輸單元:
IP資料包在網際網路上傳輸時,可能要經過多個物理網路才能從源端傳輸到目的端。不同的網路由於鏈路層和介質的物理特性不同,因此在進行資料傳輸時,對資料幀的最大長度都有一個限制,這個限制值即最大傳輸單元MTU(Maximum Transmission Unit).
同一個網路上的兩臺主機之間通訊時,該網路的MTU值是確定的,不存在分片問題。分片問題一般只存在於具有不同MTU值的網際網路中。由於現在網際網路主要使用路由器進行網路連線,因此分片工作通常由路由器負責。
當兩臺主機之間的通訊要通過多個具有不同MTU值的網路時,MTU的瓶頸是通訊路徑上最小的MTU值,它被稱為路徑MTU。由於路由選擇不一定是對稱的(從A到B的路由可能與從B到A的路由不同),因此,路徑MTU在兩個方向上不一定是一致的,下表是幾種常用網路的MTU值:
分片:
把一個資料包為了適合網路傳輸而分成多個資料包的過程稱為分片,被分片後的各個IP資料包可能經過不同的路徑到達目標主機。
一個IP資料包在傳輸過程中可能被分片,也可能不被分片。如果被分片,分片後的IP資料包和原來沒有分片的IP資料包結構是相同的,即也是由IP頭部和IP資料區兩個部分組成:
分片後的IP資料包,資料區是原IP資料包資料區的一個連續部分,頭部是原IP資料包頭部的複製,但與原來未分片的IP資料包頭部有兩點主要不同:標誌和片偏移:
(1)—標誌:在IP資料包頭部有一個叫“標誌”的欄位,用3位二進位制數表示:
不分片DF(Do not Fragment)標誌如果被置1,則資料包在傳輸過程中不能被分片,如網路連通性測試命令ping就可以用-F引數設定為在資料傳輸時不分片,但這樣當資料不能通過MTU較小的網路時,將產生資料不可達的錯誤。
片未完MF(More Fragment)標誌如果被置1,說明該資料包不是分片後的最後一個資料包,最後一個資料包的該位被置0。
(2)—片偏移:IP資料包被分片後,各片資料區在原來IP資料區中的位置用13位片偏移來表示。上圖中分片1的偏移為0;分片2的偏移為600;分片3的偏移為1200實際在IP地址中,由於偏移是以8個位元組為單位進行計算的,因而在IP資料包中分片1的偏移是0;分片2的偏移是75;分片3的偏移是150。
重組:
當分了片的IP資料包到達最終目標主機時,目標主機對各分片進行組裝,恢復成源主機傳送時的IP資料包,這個過程叫做IP資料包的重組。
在IP資料包頭部中,標識用16位二進位制數表示,它唯一地標識主機傳送的每一份資料包。在一個資料包被分片時,每個分片僅把資料包“標識”欄位的值原樣複製一份,所以一個資料包的所有分片具有相同的標識。
目標端主機重組資料包的原理是:
(1)—根據“標識”欄位可以確定收到的分片屬於原來哪個IP資料包;
(2)—根據“標誌”欄位的“片未完MF”子欄位可以確定分片是不是最後一個分片;
(3)—根據“偏移量”欄位可以確定分片在原資料包中的位置。
========================IP資料包選項========================
IP資料包“選項”主要有兩大功能:
1)用來實現對資料包傳輸過程中的控制,如規定資料包要經過的路由;
2)進行網路測試,如一個資料包傳輸過程中經過了哪些路由器。
IP“選項“域共分為四大類,每類分為若干個選項,每個選項有確定的編號:
IP資料包“選項”由三個部分組成:選項碼、選項長度和選項資料。選項碼和選項長度各佔一個位元組,中,選項長度用於確定整個選項部分的長度;選項碼又分為複製、選項類和選項號:
複製:佔一位,用來控制一個帶有選項的IP資料包被分片後對選項的處理方式。該位置1時將選項複製到所有分片中;置0時將選項僅複製到第一個分片中。
選項類和選項號用於確定該選項是哪類選項中的哪個選項,其實就是確定該選項的功能。
1)源路由選擇:是指IP資料包在網際網路中傳輸時,所經過的路由是由發出IP資料包的源主機指定的,以區別於資料包在網際網路中傳輸時由路由器的IP層自動尋徑所得到的路由。
通過設定源路由選擇選項,可以測試網路中指定路由的連通性,以使資料包繞開出錯的網路,也可用於測試特定網路的吞吐量。源路由選擇可分為兩類:嚴格源路由選擇和寬鬆源路由選擇。
(1)—嚴格源路由選擇有傳送端規定IP資料包必須經過的路徑上的每一個路由器,相鄰路由器之間不得有中間路由器,並且所經過的路由器的順序不可更改。如果一個路由器傳送源路由所指定的下一個路由器不在其直接連線的網路上,那麼它就返回一個“源路由失敗”的ICMP差錯報文。嚴格源路由選擇選項格式如下:
選項碼欄位為100 01001(0x89),即為0類9號選項。選項長度最大為39,可存放9個IP地址。因為IP頭部長度欄位只有4位二進位制數,所以整個IP頭部最長只能包括15(<24)個32位長的字(即60個位元組)。由於IP頭部固定長度為20位元組,選項碼、選項長度和指標共用去3個位元組,因此剩下60-20-3=37個位元組來存放IP地址清單,因而只能存放9個IP地址。
(2)—寬鬆源路由選擇:由傳送方指明一個資料包經過的IP地址清單,但是在資料包傳輸的路徑上,在選項中指定的兩個IP地址之間可以有其他IP地址的路由器。格式與嚴格的相同,只是選項碼欄位值為0x83。
2)記錄路由:通過設定記錄路由選項,IP資料包就可以記錄資料包從源主機傳輸到目標主機時,所經過路徑上的各個路由器的IP地址。記錄路由選項的資料格式和嚴格源路由選擇格式相同,但選項碼欄位值為0x87,指標初值為4,指向存放第一個IP地址的位置。每個路由器的IP地址存入選項的資料區中,指標欄位的值也隨著增加(從4開始到8,12,16,最大到36),它始終指向下一個存放IP地址的位置。當記錄了9個IP地址後,指標欄位的值為40,表示資料區已滿。
3)記錄時間戳:就是IP資料包每經過一個路由器都記下它的IP地址和時間。時間戳中的時間以ms為單位,時間戳取值一般為格林威治時間(UT,Universal Time)自午夜開始計時的毫秒數時間戳選項格式如下:
時間戳選項的選項碼是0x44。選項長度表示選項的總長度(一般為36或40),指標指向下一個可用空間的指標(值為5、9、13等)。
“溢位OF”欄位表示因時間戳選項資料區空間不夠而未能記錄下來的時間戳個數;
“標誌FL”欄位用於控制時間戳選項的格式,取值如下:
相關文章
- 資料包格式
- IP 資料包
- 探索多種資料格式:JSON、YAML、XML、CSV等資料格式詳解與比較JSONYAMLXML
- IP資料包頭部資訊分析
- IP地址詳解
- 藍芽Beacon廣播資料包格式以及解析藍芽
- Class 檔案格式詳解
- 藍芽Beacon格式詳解藍芽
- fiddler隱藏掉不需要的資料包格式
- 閉包詳解一
- Golang Context 包詳解GolangContext
- JavaScript閉包詳解JavaScript
- git diff 輸出格式詳解Git
- Charles mock資料詳解Mock
- coco資料集詳解
- 詳解資料驅動
- 【TCP/IP】TCP詳解筆記TCP筆記
- 蝦皮商品詳情介面返回資料的json格式JSON
- 01揹包、完全揹包、多重揹包詳解
- Javascript—閉包詳解(3)JavaScript
- 詳解華為錢包
- Linux mv命令格式及功能詳解!Linux
- mysql中格式化日期詳解MySql
- PHP sprintf()格式化用法詳解PHP
- 壓縮包格式有哪些?壓縮包格式大全
- 詳解MySQL資料型別MySql資料型別
- HDFSDATANODE資料傳輸詳解
- OpenTSDB 資料儲存詳解
- MySQL 資料型別詳解MySQL 資料型別
- MySQL資料庫-鎖詳解MySql資料庫
- 資料結構:棧詳解資料結構
- 詳解 ZooKeeper 資料持久化持久化
- JavaScript——資料型別詳解JavaScript資料型別
- 硬核圖解TCP粘包 資料包:我只是犯了每個資料包都會犯的錯圖解TCP
- Django實現統一包裝介面返回值資料格式Django
- Go 語言閉包詳解Go
- 抓包概念大比較:資料包、資料包、分組
- 目標檔案和ELF格式詳解