轉自: 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字節)。