轉_結合Wireshark捕獲分組深刻理解TCP/IP協議之IP協議

轉自: html

http://blog.chinaunix.net/uid-9112803-id-3213492.html 算法

摘要: 網絡

本文簡單介紹了網絡層理論知識,詳細講解了IP數據報各個字段,並從Wireshark俘獲分組中選取IP數據報進行分析,也闡述了分組和分片的區別。 ide


1、IPv4數據報 大數據

網絡層是處理端到端數據傳輸的最低層。網絡層關注如何將分組從源端沿着網絡路徑送達目的端,期間可能須要通過許多跳中間路由器。即提供轉發(數據從路由器那個接口出去)、選路(發送方與接收方間的路徑)、網絡創建(如ATM、幀中繼)。這裏以IPv4爲例,關於IPv6報文格式詳見博文《IPv4與IPv6數據報格式詳解》。 ui

圖1 IPv4數據報格式 .net

版本號(version) unix

不一樣的IP協議版本使用不一樣的數據報格式。 htm

首部長度(HL, Internet Head Length) blog

肯定IP數據報中數據部分實際從哪裏開始,包含可變數量的選項。若IP數據報沒有包含選項,則IP數據報首部長度爲20字節。

服務類型(TOS, Type Of Service)

更好地服務不一樣類型IP數據報(如實時數據報IP電話應用、非實時通訊流FTP),Cisco將TOS前3位標識不一樣服務等級,即優先級。

數據報長度(TL, Total Length)

IP數據報長度,即首部+數據。

分片:標識(identification)、標誌(flags)、段位移(Fragment Offset)

這3個字段跟IP分片有關,當目的主機從同一個源收到一批數據報時,須要肯定這些數據報是完整數據報仍是分片後的數據報,數據報首部標識字段解決這個問題,檢查數據報的標識號肯定哪些數據報真正是同一個較大數據報的片;如何判斷最後一個分片已收到,數據報首部標誌字段解決這個問題,將最後一片的標誌爲0,其餘標記爲1;如何順序重組這些片,這就須要記錄每一個片的在數據報有效淨荷的偏移量,這也肯定了片是否丟失。若丟失某些片,則丟棄這個不完整的數據報(不會交給傳輸層)。須要可靠傳輸怎麼辦呢,由傳輸層讓源重傳原始數據攝中的數據(如TCP)。

壽命(TTL, Time To Live)

每次數據報通過一臺路由器時,該字段的值減1,若TTL字段減爲0,則丟棄該數據報,從而確保數據報不會永遠在網絡循環

上層協議(Protocol)

該字段用於指明IP數據報的數據部分應該交給哪一個傳輸層協議(6爲TCP、17爲UDP)。

首部檢查和(Header Checksum)

只是對IP首部進行檢驗,對整個TCP/UDP報文段檢驗交由TCP/UDP完成。將首部中的每兩個字節看成一個數,用反碼運算對這些數求和,該和按1補碼值存放在檢查和字段。當路由器收到IP數據報時,計算其首部檢查和,與該字段值比較,若出錯則丟棄該數據報。

注:由於TTL字段及選項字段可能改變,因此每一個路由器上的檢查和都須從新計算並存放在原處。(檢查後,再更新)

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

選項(Options)

選項字段容許IP首部被擴展,由此致使數據報首部長度可變,故不能預先肯定數據字段從何開始,同時也使路由器處理一個IP數據報所需時間差別很大(有的要處理選項,有的不須要)。

數據(Data)

當使用TCP/UDP協議時,數據即爲傳輸層報文段(TCP/UDP)。數據字段也可承載其餘類型數據,如ICMP報文段。

2、實例解析

以請求百度首頁基本HTML爲例,因HTTP報文太大(3835字節),網絡層對其進行分片,共4片,以下圖(截自Wireshark俘獲的HTTP響應報文):

圖2 數據分片實例

整個HTTP報文傳輸示意圖以下:

圖3 HTTP報文傳輸實例示意圖

2.1 分片

IP數據報首部字段的標識(identification)、標誌(flags)、段位移(Fragment Offset) 用來處理分片。當目的主機從同一個源收到一批數據報時,須要肯定這些數據報是完整數據報仍是分片後的數據報,數據報首部標識字段解決這個問題,檢查數據報的標識號肯定哪些數據報真正是同一個較大數據報的片;如何判斷最後一個分片已收到,數據報首部標誌字段解決這個問題,將最後一片的標誌爲0,其餘標記爲1;如何順序重組這些片,這就須要記錄每一個片的在數據報有效淨荷的偏移量,這也肯定了片是否丟失。若丟失某些片,則丟棄這個不完整的數據報(不會交給傳輸層)。須要可靠傳輸怎麼辦呢,由傳輸層讓源重傳原始數據攝中的數據(如TCP)。

將該4個IP數據報(組成該完整的HTTP報文)的標識、標誌、段位移部分抽出來,以下圖所示:

圖4 HTTP響應報文的4個IP數據報

能夠看出,IP數據報並無分片,這是由於這些IP數據報封裝成幀並無超過MTU(以太網MTU爲1500字節)。蠻想找一個有分片的IP數據報分析下,惋惜俘獲的分組沒有:-(

不盡要問,當報文太大時,何時劃分報文呢?主要是在兩個地方:傳輸層TCP分組、網絡層IP分片。

(1)分組

TCP把應用程序交給它的報文分紅合適的小塊交給下面網絡層,要不要分取決於應用層報文是否大於MSS(想一想TCP鏈接創建時最大報文段MSS大小的協商,注MSS僅包含TCP報文段的淨荷數據,不包括TCP首部),怎麼分取決於特定的分組算法。本例將3836字節長度HTTP報文分紅:411+1440+1440+545。

(2)分片

IP數據報在發送方與目的地間傳輸可能選擇不一樣的路徑,路徑上的每段鏈路可能使用不一樣的鏈路層協議,協議可能具備不一樣的最大傳輸單(MTU,鏈路層數據報能承載的最大數據量)。當出鏈路的MTU比IP數據報的長度小時,須要將過大的IP數據報分片。IPv4數據報首部字段標識、標誌、偏移量解決這個問題。

值得注意的是,IP數據報分片在網絡層重組,重組好了,再交給傳輸層。TCP報文段在傳輸層重組,重組好了,再交給應用層。

2.2 IP數據報實例

接下來,取一個完整IP數據報分析(以第一個數據報爲例,即27),以下:

圖4 IP數據報實例

IP數據報首部沒有選項字段,長度爲20字節,數據報長度451=IP數據報首部長度20(沒有選項字段)+TCP首部長度20(沒有選項字段)+TCP報文段的數據字段411(實爲HTTP報文前411字節)。

 

dROSI_009_001ROSI_009_002ROSI_009_003ROSI_009_004ROSI_009_005ROSI_009_006ROSI_009_007ROSI_009_008ROSI_009_009ROSI_009_010ROSI_009_011ROSI_009_012ROSI_009_013ROSI_009_014ROSI_009_015ROSI_009_016ROSI_009_017ROSI_009_018ROSI_009_019ROSI_009_020

 

ROSI_009_021ROSI_009_022ROSI_009_023ROSI_009_024ROSI_009_025ROSI_009_026ROSI_009_027ROSI_009_028ROSI_009_029ROSI_009_030ROSI_009_031ROSI_009_032ROSI_009_033ROSI_009_034ROSI_009_035ROSI_009_036ROSI_009_037ROSI_009_038ROSI_009_039ROSI_009_040ROSI_009_041ROSI_009_042ROSI_009_043ROSI_009_044ROSI_009_045ROSI_009_046ROSI_009_047ROSI_009_048ROSI_009_049ROSI_009_050ROSI_009_051

相關文章
相關標籤/搜索