我們說因為有了IP協議(Internet Protocol,互聯網協議),因特網才得以迅速發展成為世界上最大的、開放的計算機通信網絡。任何廠家生産的計算機系統,隻要遵守 IP協議就可以與因特網互連互通。IP協議就是為計算機網絡相互連接進行通信而設計的協議,在因特網中,它是能使連接到網上的所有計算機網絡實現相互通信的一套規則,規定了計算機在因特網上進行通信時應當遵守的規則。本文通過分析IP協議報文的格式,能夠使大家明白為何IP協議能夠在複雜的網絡環境中将數據包發送到最終目的主機,從而實現主機與主機之間的通信。
IP報文格式
IP數據報的格式能夠說明IP協議都具有什麼功能,如下圖所示,一個IP數據報由首部和數據兩部分組成。首部的前一部分是固定長度,共20字節,是所有IP數據報必須具有的。在首部的固定部分的後面是一些可選字段,其長度是可變的,但對于首部的長度來說,最長是60個字節,所以可選字段最長為40個字節。
IP數據報首部的固定部分中的各字段說明如下:
(1) 版本:占4位,指IP協議的版本。不同版本的協議格式或語義可能不同,但是雙方通信使用的IP協議的版本必須一緻。目前廣泛使用的IP協議版本号為4,即IPv4,其字段值就為0100。
(2) 首部長度:占4位,可表示最大十進制數值是15。請注意,一個位對應的是4個字節。因為IP首部的固定長度是20字節,因此首部長度字段的最小值是5(即二進制表示的首部長度是0101)。而當這四個位都為1最大值為15的時候就表示此時達到了首部的最大長度,即60字節。需要注意的是當IP分組的首部長度不是4字節的整數倍時,必須利用最後的填充字段加以填充。因此IP數據報的數據部分永遠在4字節的整數倍時開始,這樣在實現IP協議時較為方便,通過首部長度可以知道數據部分是什麼時候開始的。
(3) 服務類型:占8位,指定特殊的報文處理方式,用來獲得更好的服務。在一般的情況下不使用這個字段,隻有在有QoS差分服務要求時這個字段才起作用,實現網絡流量優化。
QoS(Quality of Service,服務質量)是一種控制機制,它提供了針對不同用戶或者不同數據流采用相應不同的優先級,或者是根據應用程序的要求,保證數據流的性能達到一定的水準。
(4) 總長度:占16位,指首部和數據部分之和的長度,單位為字節。因此數據報的最大長度為2^16-1=65535字節。然而實際上傳送這樣長的數據報在現實中是極少遇到的。
由于在IP層下面的每一種數據鍊路層協議都規定了一個數據幀中的數據字段的最大長度,這稱為最大傳送單元MTU (Maximum Transfer Unit),當一個IP數據報封裝成鍊路層的幀時,此數據報的總長度(即首部加上數據部分)一定不能超過下面的數據鍊路層所規定的MTU值。例如,最常用的以太網就規定其MTU值是1500字節。若所傳送的IP數據報長度超過數據鍊路層的MTU值時,就必須把過長的數據報進行分片處理。在進行分片時,數據報首部中的“總長度”字段是指分片後的每一個分片的首部長度與該分片的數據長度的總和。
(5) 标識:占16位,通過标識來給已經分片的IP數據報進行分組,保證最後分片之後的各數據報片能正确地重裝成為原來的數據報。當數據報由于長度超過網絡的MTU而必須分片時,這個标識字段的值就被複制到所有的數據報片的标識字段中。相同的标識字段的值使分片後的各數據報片最後能正确地重裝成為原來的數據報。
(6) 标志:占3位。目前隻有兩位有意義,第一位一般是0;中間的一位記為DF(Don't Fragment),意思是不能分片,隻有DF值為0的時候才允許分片;最後的一位記為MF(More Fragment),表示後面還有無分片,當MF=1表示後面還有分片的數據報,當MF=0表示後面已無分片,這已是若幹數據報片中的最後一個。
(7) 片偏移:占13位,标識某個分片在分組中的位置。片偏移指出較長的分組在分片後,某片在原分組中的相對位置。也就是說,相對于用戶數據字段的起點,該片從何處開始。片偏移以8個字節為偏移單位,這就是說,每個分片的長度一定是8字節的整數倍。
數據分片舉例:
一數據報的總長度為3820字節,數據部分為3800字節(IP首部為固定20字節),需要分片傳輸。假設每片IP報文長度不超過1420字節。去掉固定首部長度20字節,每片報文數據部分長度不超過1400。于是分成3個數據報片,其數據部分長度分别為1400、1400、1000字節。原始數據報首部被複制為各數據報片的首部,隻需要改變有關字段的值。下圖給出分片後得出的結果。
下圖表是本例中數據報首部與分片有關的字段中的數值,其中标識字段的值是任意給定的(12345)。具有相同标識的數據報片在目的站就可無誤地重裝成原來的數據報。
(8) 生存時間:占8位,生存時間字段常用的英文縮寫是TTL(Time To Live),表明數據報在網絡中的壽命。TTL的意義是指明數據報在互聯網中至多可經過多少個路由器,因此其單位不是時間而是跳數。由發出數據報的源點設置這個字段,其目的是防止無法交付的數據報無限制地在互聯網中兜圈子(例如從路由器R1轉發到R2,再轉發到R3,然後又轉發到R1),因而白白消耗網絡資源。路由器在每次轉發數據報之前就把TTL值減1,由于隻有八個位,所以能夠在網絡中經過的路由器的最大數值是255,若TTL值減小到零,就丢棄這個數據報,不再轉發。
(9) 協議:占8位。協議字段指出此數據報攜帶的數據是使用何種協議,以便使目的主機的IP層知道應将數據部分上交給哪個協議進行處理。例如協議字段為6表示上交給上層TCP協議進行處理。
常見的協議号:
(10) 首部檢驗和:占16位。這個字段隻檢驗數據報的首部,不包括數據部分。在數據報傳輸過程中IP頭中的某些字段可能發生改變(如生存時間、标志、片偏移等都可能發生變化),所以檢驗和要在每一個經過的路由器中進行校驗和重新計算。利用二進制反碼求和來進行校驗,以此來決定是否丢棄數據報。若首部未發生任何變化,則此結果必為0,于是就保留這個數據報。否則即認為出差錯,并将此數據報丢棄。
(11) 源地址:占32位,源IP地址。标識IP數據報的源端地址。
(12) 目的地址:占32位,目的IP地址。标識IP數據報的目的地址。
IP數據報首部的可變部分
IP數據報首部的可變部分就是一個選項字段,一般很少使用。選項字段用來支持排錯、測量以及安全等措施,内容很豐富。此字段的長度可變,從1個字節到40個字節不等,取決于所選擇的項目。某些選項項目隻需要1個字節,它隻包括1個字節的選項代碼。而有些選項需要多個字節,這些選項一個個拼接起來,中間不需要有分隔符,最後用全0的填充字段補齊成為4字節的整數倍。
增加首部的可變部分是為了增加IP數據報的功能,但這同時也使得IP數據報的首部長度成為可變的。這就增加了每一個路由器處理數據報的開銷。實際上這些選項很少被使用。很多路由器都不考慮IP首部的可選字段,因此新的IP版本IPV6就把IP數據報的首部長度做成固定的。
Wireshark分析IP數據報頭之前我們已經通過Wireshark分析了以太網幀,詳見該文《以太網數據幀結構詳解并結合Wireshark工具深入分析》。現在我們進一步來分析一下通信過程中IP數據報頭情況。如下圖,可以看到該數據報是由主機192.168.1.107發往61.149.23.83的,點擊展開Internet Protocol Version 4。
結合上面IP報文格式的介紹,那麼現在我們對該IP數據報頭各字段情況可以看得一目了然。
1.Vesion:版本。其值為0100=4。
2.Header Length:首部長度。其值為0101=5,表示該IP首部為固定長度20 bytes。
3.Differentiated Services Field:區分服務字段。其值為0x00=0,表示沒有用到差分服務。
4.Total Length:總長度。可以看到該數據報的長度為83字節。
5.Identification:标識。其值為0x7be6=31718。
6.Flags:标志。其3位值都為0。
7.Fragment Offset:片偏移。其值為0。
8.Time to live:生存時間。其值為64。
9.Protocol:協議。其值為17,表示将數據部分交由上層UDP協議進行處理。
10.Header Checksum:首部檢驗和。
這裡顯示“validation disabled”(即禁止校驗),這是因為有時校驗和會由網卡計算,因此Wireshark抓到的本機發送的數據包的校驗和都是錯誤的,這樣檢驗校驗和根本沒有意義,所以Wireshark不自動做校驗和的校驗。
11.Source Address:源地址。這裡可以看到源IP地址為192.168.1.107。
12.Destination Address:目的地址。這裡可以看到目的IP地址為:61.149.23.83。
以上就是網絡傳輸中IP數據報文的相關内容并結合Wireshark工具加以分析,關于更多網絡知識可以加個關注,另外對Wireshark數據包分析感興趣的同學可以訂閱專欄内容~
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!