1. 程式人生 > 實用技巧 >IP 資料報首部分析

IP 資料報首部分析

來來來, 爺們. 不是一直說紙上得來終覺淺麼. 今咱就抓個數據報具體看一看真實網路中的 IP 報首部.

操作方法很簡單, 使用wireshark進行抓包. 抓包後隨便找個包看一下就行, 畢竟所有通訊的包都需要經過網路層.(同時, wireshark會對協議的相關資訊給出標識, 更方便我們檢視)

其中資料鏈路層的首部資訊在整個資料的最前面, 其後跟著的是網路層, 傳輸層, 最後剩下的是傳輸的資料內容. 這個很好理解, 資料從上到下, 每過一層, 都會新增對應的頭部資訊, 先過傳輸層就先加上咯.

咱們今兒個主要就看看 IP 協議的首部內容. 走著...

要檢視指定欄位在其中的位置, 左鍵點選一下, 資料內容就會高亮了. 好貼心哦.

簡單介紹一下各個欄位的意思:

  • 協議版本號(4b): 標識當前 IP 協議的版本號.
  • 首部長度(4b): 標識首部長度. 單位是/4B. 也就是首部最長15*4=60B
  • 區分服務(8b):
  • 總長度(16b): 首部+資料的長度. 因為 TCP 的首部是在傳輸層加上的, 所以傳輸層的首部也會被認為是資料的一部分. IP 層可傳輸的資料長度為 65535-60=65475B
  • 標識(16b): 當資料包被分組時, 用於標識不同的分組. 方便接收方對資料包進行重組
  • 標誌(3b): 用於一些特殊標誌
  • 片偏移量(13b): 當資料包超出長度後, 會分組傳輸. 此欄位標識資料的偏移量. 單位是/8B
  • 生存時間(8b): 資料包在網路中的壽命, 經過 n 跳之後就不再轉發了
  • 協議(8b): 標識當前包的資料部分協議
  • 校驗和(8b): 用於校驗在網路傳輸中是否失真. 僅校驗首部
  • 源地址(32b): 資料包的源IP地址
  • 目標地址(32b): 資料包的目標 IP 地址
  • 可選內容: 一些其他的可選欄位

對於網路層協議來說, 每增加一個欄位, 都會影響整體的傳輸速度. 所以當初設計協議的時候, 定是經過了一再斟酌, 最終才保留了這些不可獲取的欄位.

協議版本號

標識當前協議的版本, 目前主要用來區分 IPV4和 IPV6.

若此欄位缺失, 則無法區分不同版本 IP 協議

首部長度

因為協議的首部存在可選欄位, 所以需要新增欄位用來指明首部的長度. 以4B 為一個單位應該也是經過多次探討的了. 當首部為20b 時, 則沒有使用可選欄位.

若此欄位缺失, 無法正確識別協議首部結尾.

區分服務

標識此資料包在傳輸過程中的一些要求服務.

  • 1-3位: 標識資料包重要性. 在網路分組傳輸種, 較為重要的包會優先傳輸. 如一個語音通話的資料包, 和一個檔案下載的資料包, 明顯前者更為優先.
  • 4位: 0(正常延遲), 1(想要較低的延遲)
  • 5位: 1(想要高流量)
  • 6位: 1(要高可靠性)
  • 7位: 也是擁塞控制相關的.
  • 8位: 1(網路擁塞預警)

總長度

用於對識別當前資料報的結尾.

標識

因為資料在網路層會被分片, 所以增加標識分片所在分組.

若此欄位缺失, 則無法對資料包進行正確重組.

標誌

  • 第一位: 保留
  • 第二位: 0(可以分段), 1(不能分段)
  • 第三位: 0(當前是最後一個分段), 1(後面還有更多的分段)

偏移量

當接收方接收到多個數據分段時, 進行重組的依據. 該欄位佔13b, 單位是8B. 也就是說 IP 協議傳輸資料超過: (2^14-1)*8=131064B≈123kb. 不過一個網路層的包也不會這麼大.

而網路層對資料包進行分段是依據 MTU 計算的. MTU 則是其自動協商, 取鏈路最小值.

若此欄位缺失, 則接收方無法對資料包進行正確重組.

生存時間

就是你在使用ping命令時, 現實的ttl. 此值每經過一次轉發, 就會減一. 當減到0的時候, 該資料包就被丟棄了.

若此欄位缺失, 當出現在網路中不存在的目標, 導致資料包在網路中迴圈傳輸時永遠都不會消失. 而這樣的資料一多, 則整個網路都會變得擁堵.

協議

標明資料部分的協議, 用於正確識別資料包上層協議, 並將資料正確轉交給指定程序.

搜一下: IP 協議號, 隨便開啟一個可以看到所有的協議.

若此欄位缺失, 則網路層無法將資料正確上交.

校驗和

接收方校驗在物理傳輸過程中, 協議首部是否存在損壞. 資料部分不做檢查.

若此欄位缺失, 則接收方無法缺失接收的資料與傳送的資料是否一致.

源地址

用於標識資料包的源地址.

目標地址

用於標識資料包的目標地址.

可選內容

方便後面對協議的擴充. 現在已有的如:

  • 記錄路徑: 每個路由器都記下其IP 地址
  • 記錄時間戳: 每個路由都記下其IP 與時間
  • 等等

感覺可選內容在使用中很少用到, 我抓了各種包, 暫時還沒有碰到過有使用的.


協議在設計的時候真的是省吃儉用啊, 平常開發時用到的資料都是以位元組為單位的, 人家網路層協議是以位為單位使用的.

後面再看TCP首部的時候, 也可以如此檢視其在傳輸過程種的真正模樣.

爺們, 希望你看到這裡了...