IP協(xié)議提供不可靠無(wú)連接的數(shù)據(jù)報(bào)傳輸服務(wù),IP層提供的服務(wù)是通過(guò)IP層對(duì)數(shù)據(jù)報(bào)的封裝與拆封來(lái)實(shí)現(xiàn)的。IP數(shù)據(jù)報(bào)的格式分為報(bào)頭區(qū)和數(shù)據(jù)區(qū)兩大部分,其中報(bào)頭區(qū)是為了正確傳輸高層數(shù)據(jù)而加的各種控制信息,數(shù)據(jù)區(qū)包括高層協(xié)議需要傳輸?shù)臄?shù)據(jù)。
IP數(shù)據(jù)報(bào)的格式如下:

注意,上圖表示的數(shù)據(jù),最高位在左邊,記為0位;最低位在右邊,記為31位。在網(wǎng)絡(luò)中傳輸數(shù)據(jù)時(shí),先傳輸07位,其次是815位,然后傳輸1623位,最后傳輸2431位。由于TCP/IP協(xié)議頭部中所有的二進(jìn)制數(shù)在網(wǎng)絡(luò)中傳輸時(shí)都要求以這種順序進(jìn)行,因此把它稱為網(wǎng)絡(luò)字節(jié)順序。在實(shí)際編程中,以其他形式存儲(chǔ)的二進(jìn)制數(shù)必須在傳輸數(shù)據(jù)前使用網(wǎng)絡(luò)編程API相應(yīng)的函數(shù)把頭部轉(zhuǎn)換成網(wǎng)絡(luò)字節(jié)順序。
IP數(shù)據(jù)報(bào)各字段功能如下:
1)版本號(hào):占用4位二進(jìn)制數(shù),表示該IP數(shù)據(jù)報(bào)使用的IP協(xié)議版本。目前Internet中使用的主要是TCP/IP協(xié)議族中版本號(hào)為4的IP協(xié)議。
2)頭長(zhǎng)度:占用4位二進(jìn)制位,此域指出整個(gè)報(bào)頭的長(zhǎng)度(包括選項(xiàng)),該長(zhǎng)度是以32位二進(jìn)制數(shù)為一個(gè)計(jì)數(shù)單位的,接收端通過(guò)此域可以計(jì)算出報(bào)頭在何處結(jié)束及從何處開(kāi)始讀數(shù)據(jù)。普通IP數(shù)據(jù)報(bào)(沒(méi)有任何選項(xiàng))該字段的值是5(即20個(gè)字節(jié)的長(zhǎng)度)。
3)服務(wù)類型(TOS、type of service):占用8位二進(jìn)制位,用于規(guī)定本數(shù)據(jù)報(bào)的處理方式。服務(wù)類型字段的8位分成了5個(gè)子域:

(1)—優(yōu)先權(quán)(0-7)數(shù)越大,表示該數(shù)據(jù)報(bào)優(yōu)先權(quán)越高。網(wǎng)絡(luò)中路由器可以使用優(yōu)先權(quán)進(jìn)行擁塞控制,如當(dāng)網(wǎng)絡(luò)發(fā)生擁塞時(shí)可以根據(jù)數(shù)據(jù)報(bào)的優(yōu)先權(quán)來(lái)決定數(shù)據(jù)報(bào)的取舍。
(2)—短延遲位D(Delay):該位置1時(shí),數(shù)據(jù)報(bào)請(qǐng)求以短延遲信道傳輸,0表示正常延時(shí)。
(3)—高吞吐量位T(Throughput):該位置1時(shí),數(shù)據(jù)報(bào)請(qǐng)求以高吞吐量信道傳輸,0表示普通。
(4)—高可靠位R(Reliability):該位置1時(shí),數(shù)據(jù)報(bào)請(qǐng)求以高可靠性信道傳輸,0表示普通。
(5)—保留位。
目前在Internet中使用的TCP/IP協(xié)議大多數(shù)情況下網(wǎng)絡(luò)并未對(duì)TOS進(jìn)行處理,但在實(shí)際編程時(shí),有專門的函數(shù)來(lái)設(shè)置該字段的各域。一些重要的網(wǎng)際應(yīng)用協(xié)議中都設(shè)置了建議使用的TOS值:

從上表可以看出,對(duì)于與用戶直接交互的應(yīng)用,一般使用短延時(shí);對(duì)于有大量數(shù)據(jù)需要進(jìn)行傳輸?shù)膽?yīng)用,一般選用高吞吐量;對(duì)于數(shù)據(jù)報(bào)要傳輸控制信息的應(yīng)用,一般選用高可靠性。在數(shù)據(jù)報(bào)的生存期內(nèi)不支持TOS的,TOS字段就設(shè)置為0x00。
4)總長(zhǎng)度:占用16位二進(jìn)制位,總長(zhǎng)度字段是指整個(gè)IP數(shù)據(jù)報(bào)的長(zhǎng)度(報(bào)頭區(qū)+數(shù)據(jù)區(qū)),以字節(jié)為單位。利用頭部長(zhǎng)度字段和總長(zhǎng)度字段就可以計(jì)算出IP數(shù)據(jù)報(bào)中數(shù)據(jù)內(nèi)容的起始位置和長(zhǎng)度。由于該字段長(zhǎng)度為16位二進(jìn)制數(shù),因此理論上IP數(shù)據(jù)報(bào)最長(zhǎng)可達(dá)65536個(gè)字節(jié)(事實(shí)上受物理網(wǎng)絡(luò)的限制,要比這個(gè)數(shù)值小很多)。
5)生存時(shí)間(TTL,time to live):占用8位二進(jìn)制位,它指定了數(shù)據(jù)報(bào)可以在網(wǎng)絡(luò)中傳輸?shù)淖铋L(zhǎng)時(shí)間。實(shí)際應(yīng)用中把生存時(shí)間字段設(shè)置成了數(shù)據(jù)報(bào)可以經(jīng)過(guò)的最大路由器數(shù)。TTL的初始值由源主機(jī)設(shè)置(通常為32、64、128或256),一旦經(jīng)過(guò)一個(gè)處理它的路由器,它的值就減1。當(dāng)該字段為0時(shí),數(shù)據(jù)報(bào)就丟棄,并發(fā)送ICMP報(bào)文通知源主機(jī),因此可以防止進(jìn)入一個(gè)循環(huán)回路時(shí),數(shù)據(jù)報(bào)無(wú)休止地傳輸下去。
6)上層協(xié)議標(biāo)識(shí):占用8位二進(jìn)制位,IP協(xié)議可以承載各種上層協(xié)議,目標(biāo)端根據(jù)協(xié)議標(biāo)識(shí)就可以把收到的IP數(shù)據(jù)報(bào)送到TCP或UDP等處理此報(bào)文的上層協(xié)議了。
常用網(wǎng)際協(xié)議編號(hào):

7)校驗(yàn)和:占用16位二進(jìn)制數(shù),用于協(xié)議頭數(shù)據(jù)有效性的校驗(yàn),可以保證IP報(bào)頭區(qū)在傳輸時(shí)的正確性和完整性。頭部檢驗(yàn)和字段是根據(jù)IP協(xié)議頭計(jì)算出的檢驗(yàn)和,它不對(duì)頭部后面的數(shù)據(jù)進(jìn)行計(jì)算。
原理:發(fā)送端首先將檢驗(yàn)和字段置0,然后對(duì)頭部中每16位二進(jìn)制數(shù)進(jìn)行反碼求和的運(yùn)算,并將結(jié)果存在校驗(yàn)和字段中。 由于接收方在計(jì)算過(guò)程中包含了發(fā)送方放在頭部的校驗(yàn)和,因此,如果頭部在傳輸過(guò)程中沒(méi)有發(fā)生任何差錯(cuò),那么接收方計(jì)算的結(jié)果應(yīng)該是全1。
8)源地址:占用32位二進(jìn)制數(shù),表示發(fā)送端IP地址。
9)目的地址:占用32位二進(jìn)制數(shù),表述目的端IP地址。
======================IP數(shù)據(jù)報(bào)分片和重組======================
最大傳輸單元:
IP數(shù)據(jù)報(bào)在互聯(lián)網(wǎng)上傳輸時(shí),可能要經(jīng)過(guò)多個(gè)物理網(wǎng)絡(luò)才能從源端傳輸?shù)侥康亩恕2煌木W(wǎng)絡(luò)由于鏈路層和介質(zhì)的物理特性不同,因此在進(jìn)行數(shù)據(jù)傳輸時(shí),對(duì)數(shù)據(jù)幀的最大長(zhǎng)度都有一個(gè)限制,這個(gè)限制值即最大傳輸單元MTU(Maximum Transmission Unit).
同一個(gè)網(wǎng)絡(luò)上的兩臺(tái)主機(jī)之間通信時(shí),該網(wǎng)絡(luò)的MTU值是確定的,不存在分片問(wèn)題。分片問(wèn)題一般只存在于具有不同MTU值的互聯(lián)網(wǎng)中。由于現(xiàn)在互聯(lián)網(wǎng)主要使用路由器進(jìn)行網(wǎng)絡(luò)連接,因此分片工作通常由路由器負(fù)責(zé)。
當(dāng)兩臺(tái)主機(jī)之間的通信要通過(guò)多個(gè)具有不同MTU值的網(wǎng)絡(luò)時(shí),MTU的瓶頸是通信路徑上最小的MTU值,它被稱為路徑MTU。由于路由選擇不一定是對(duì)稱的(從A到B的路由可能與從B到A的路由不同),因此,路徑MTU在兩個(gè)方向上不一定是一致的,下表是幾種常用網(wǎng)絡(luò)的MTU值:

分片:
把一個(gè)數(shù)據(jù)報(bào)為了適合網(wǎng)絡(luò)傳輸而分成多個(gè)數(shù)據(jù)報(bào)的過(guò)程稱為分片,被分片后的各個(gè)IP數(shù)據(jù)報(bào)可能經(jīng)過(guò)不同的路徑到達(dá)目標(biāo)主機(jī)。
一個(gè)IP數(shù)據(jù)報(bào)在傳輸過(guò)程中可能被分片,也可能不被分片。如果被分片,分片后的IP數(shù)據(jù)報(bào)和原來(lái)沒(méi)有分片的IP數(shù)據(jù)報(bào)結(jié)構(gòu)是相同的,即也是由IP頭部和IP數(shù)據(jù)區(qū)兩個(gè)部分組成:

分片后的IP數(shù)據(jù)報(bào),數(shù)據(jù)區(qū)是原IP數(shù)據(jù)報(bào)數(shù)據(jù)區(qū)的一個(gè)連續(xù)部分,頭部是原IP數(shù)據(jù)報(bào)頭部的復(fù)制,但與原來(lái)未分片的IP數(shù)據(jù)報(bào)頭部有兩點(diǎn)主要不同:標(biāo)志和片偏移:
(1)—標(biāo)志:在IP數(shù)據(jù)報(bào)頭部有一個(gè)叫“標(biāo)志”的字段,用3位二進(jìn)制數(shù)表示:

不分片DF(Do not Fragment)標(biāo)志如果被置1,則數(shù)據(jù)報(bào)在傳輸過(guò)程中不能被分片,如網(wǎng)絡(luò)連通性測(cè)試命令ping就可以用-F參數(shù)設(shè)置為在數(shù)據(jù)傳輸時(shí)不分片,但這樣當(dāng)數(shù)據(jù)不能通過(guò)MTU較小的網(wǎng)絡(luò)時(shí),將產(chǎn)生數(shù)據(jù)不可達(dá)的錯(cuò)誤。
片未完MF(More Fragment)標(biāo)志如果被置1,說(shuō)明該數(shù)據(jù)報(bào)不是分片后的最后一個(gè)數(shù)據(jù)報(bào),最后一個(gè)數(shù)據(jù)報(bào)的該位被置0。
(2)—片偏移:IP數(shù)據(jù)報(bào)被分片后,各片數(shù)據(jù)區(qū)在原來(lái)IP數(shù)據(jù)區(qū)中的位置用13位片偏移來(lái)表示。上圖中分片1的偏移為0;分片2的偏移為600;分片3的偏移為1200實(shí)際在IP地址中,由于偏移是以8個(gè)字節(jié)為單位進(jìn)行計(jì)算的,因而在IP數(shù)據(jù)報(bào)中分片1的偏移是0;分片2的偏移是75;分片3的偏移是150。
重組:
當(dāng)分了片的IP數(shù)據(jù)報(bào)到達(dá)最終目標(biāo)主機(jī)時(shí),目標(biāo)主機(jī)對(duì)各分片進(jìn)行組裝,恢復(fù)成源主機(jī)發(fā)送時(shí)的IP數(shù)據(jù)報(bào),這個(gè)過(guò)程叫做IP數(shù)據(jù)報(bào)的重組。
在IP數(shù)據(jù)報(bào)頭部中,標(biāo)識(shí)用16位二進(jìn)制數(shù)表示,它唯一地標(biāo)識(shí)主機(jī)發(fā)送的每一份數(shù)據(jù)報(bào)。在一個(gè)數(shù)據(jù)報(bào)被分片時(shí),每個(gè)分片僅把數(shù)據(jù)報(bào)“標(biāo)識(shí)”字段的值原樣復(fù)制一份,所以一個(gè)數(shù)據(jù)報(bào)的所有分片具有相同的標(biāo)識(shí)。
目標(biāo)端主機(jī)重組數(shù)據(jù)報(bào)的原理是:
(1)—根據(jù)“標(biāo)識(shí)”字段可以確定收到的分片屬于原來(lái)哪個(gè)IP數(shù)據(jù)報(bào);
(2)—根據(jù)“標(biāo)志”字段的“片未完MF”子字段可以確定分片是不是最后一個(gè)分片;
(3)—根據(jù)“偏移量”字段可以確定分片在原數(shù)據(jù)報(bào)中的位置。
========================IP數(shù)據(jù)報(bào)選項(xiàng)========================
IP數(shù)據(jù)報(bào)“選項(xiàng)”主要有兩大功能:
1)用來(lái)實(shí)現(xiàn)對(duì)數(shù)據(jù)報(bào)傳輸過(guò)程中的控制,如規(guī)定數(shù)據(jù)報(bào)要經(jīng)過(guò)的路由;
2)進(jìn)行網(wǎng)絡(luò)測(cè)試,如一個(gè)數(shù)據(jù)報(bào)傳輸過(guò)程中經(jīng)過(guò)了哪些路由器。
IP“選項(xiàng)“域共分為四大類,每類分為若干個(gè)選項(xiàng),每個(gè)選項(xiàng)有確定的編號(hào):

IP數(shù)據(jù)報(bào)“選項(xiàng)”由三個(gè)部分組成:選項(xiàng)碼、選項(xiàng)長(zhǎng)度和選項(xiàng)數(shù)據(jù)。選項(xiàng)碼和選項(xiàng)長(zhǎng)度各占一個(gè)字節(jié),中,選項(xiàng)長(zhǎng)度用于確定整個(gè)選項(xiàng)部分的長(zhǎng)度;選項(xiàng)碼又分為復(fù)制、選項(xiàng)類和選項(xiàng)號(hào):

復(fù)制:占一位,用來(lái)控制一個(gè)帶有選項(xiàng)的IP數(shù)據(jù)報(bào)被分片后對(duì)選項(xiàng)的處理方式。該位置1時(shí)將選項(xiàng)復(fù)制到所有分片中;置0時(shí)將選項(xiàng)僅復(fù)制到第一個(gè)分片中。
選項(xiàng)類和選項(xiàng)號(hào)用于確定該選項(xiàng)是哪類選項(xiàng)中的哪個(gè)選項(xiàng),其實(shí)就是確定該選項(xiàng)的功能。
1)源路由選擇:是指IP數(shù)據(jù)報(bào)在互聯(lián)網(wǎng)中傳輸時(shí),所經(jīng)過(guò)的路由是由發(fā)出IP數(shù)據(jù)報(bào)的源主機(jī)指定的,以區(qū)別于數(shù)據(jù)報(bào)在互聯(lián)網(wǎng)中傳輸時(shí)由路由器的IP層自動(dòng)尋徑所得到的路由。
通過(guò)設(shè)置源路由選擇選項(xiàng),可以測(cè)試網(wǎng)絡(luò)中指定路由的連通性,以使數(shù)據(jù)報(bào)繞開(kāi)出錯(cuò)的網(wǎng)絡(luò),也可用于測(cè)試特定網(wǎng)絡(luò)的吞吐量。源路由選擇可分為兩類:嚴(yán)格源路由選擇和寬松源路由選擇。
(1)—嚴(yán)格源路由選擇有發(fā)送端規(guī)定IP數(shù)據(jù)報(bào)必須經(jīng)過(guò)的路徑上的每一個(gè)路由器,相鄰路由器之間不得有中間路由器,并且所經(jīng)過(guò)的路由器的順序不可更改。如果一個(gè)路由器發(fā)送源路由所指定的下一個(gè)路由器不在其直接連接的網(wǎng)絡(luò)上,那么它就返回一個(gè)“源路由失敗”的ICMP差錯(cuò)報(bào)文。嚴(yán)格源路由選擇選項(xiàng)格式如下:

選項(xiàng)碼字段為100 01001(0x89),即為0類9號(hào)選項(xiàng)。選項(xiàng)長(zhǎng)度最大為39,可存放9個(gè)IP地址。因?yàn)镮P頭部長(zhǎng)度字段只有4位二進(jìn)制數(shù),所以整個(gè)IP頭部最長(zhǎng)只能包括15(<24)個(gè)32位長(zhǎng)的字(即60個(gè)字節(jié))。由于IP頭部固定長(zhǎng)度為20字節(jié),選項(xiàng)碼、選項(xiàng)長(zhǎng)度和指針共用去3個(gè)字節(jié),因此剩下60-20-3=37個(gè)字節(jié)來(lái)存放IP地址清單,因而只能存放9個(gè)IP地址。
(2)—寬松源路由選擇:由發(fā)送方指明一個(gè)數(shù)據(jù)報(bào)經(jīng)過(guò)的IP地址清單,但是在數(shù)據(jù)報(bào)傳輸?shù)穆窂缴?,在選項(xiàng)中指定的兩個(gè)IP地址之間可以有其他IP地址的路由器。格式與嚴(yán)格的相同,只是選項(xiàng)碼字段值為0x83。
2)記錄路由:通過(guò)設(shè)置記錄路由選項(xiàng),IP數(shù)據(jù)報(bào)就可以記錄數(shù)據(jù)報(bào)從源主機(jī)傳輸?shù)侥繕?biāo)主機(jī)時(shí),所經(jīng)過(guò)路徑上的各個(gè)路由器的IP地址。記錄路由選項(xiàng)的數(shù)據(jù)格式和嚴(yán)格源路由選擇格式相同,但選項(xiàng)碼字段值為0x87,指針初值為4,指向存放第一個(gè)IP地址的位置。每個(gè)路由器的IP地址存入選項(xiàng)的數(shù)據(jù)區(qū)中,指針字段的值也隨著增加(從4開(kāi)始到8,12,16,最大到36),它始終指向下一個(gè)存放IP地址的位置。當(dāng)記錄了9個(gè)IP地址后,指針字段的值為40,表示數(shù)據(jù)區(qū)已滿。
3)記錄時(shí)間戳:就是IP數(shù)據(jù)報(bào)每經(jīng)過(guò)一個(gè)路由器都記下它的IP地址和時(shí)間。時(shí)間戳中的時(shí)間以ms為單位,時(shí)間戳取值一般為格林威治時(shí)間(UT,Universal Time)自午夜開(kāi)始計(jì)時(shí)的毫秒數(shù)時(shí)間戳選項(xiàng)格式如下:

時(shí)間戳選項(xiàng)的選項(xiàng)碼是0x44。選項(xiàng)長(zhǎng)度表示選項(xiàng)的總長(zhǎng)度(一般為36或40),指針指向下一個(gè)可用空間的指針(值為5、9、13等)。
“溢出OF”字段表示因時(shí)間戳選項(xiàng)數(shù)據(jù)區(qū)空間不夠而未能記錄下來(lái)的時(shí)間戳個(gè)數(shù);
“標(biāo)志FL”字段用于控制時(shí)間戳選項(xiàng)的格式,取值如下:

本文來(lái)自 believe209 的CSDN 博客 ,全文地址請(qǐng)點(diǎn)擊:https://blog.csdn.net/wangzhen209/article/details/74453548?utm_source=copy