首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> .NET 實例教學

.NET 封裝 WinPcap 實現網路封包分析(二):IPv4 封包解析與校驗和計算

     編輯:.NET 實例教學

承接上篇,本文專注於從 WinPcap 取得原始封包後的解析邏輯,以 IPv4 為例,詳細說明表頭各欄位含義與標頭檢驗和(Header Checksum)的計算方法。

封包結構概覽

位移長度說明
0-56 bytes目的 MAC 位址
6-116 bytes來源 MAC 位址
12-132 bytes乙太網類型
141 byte版本 (高 4 bits) + 標頭長度 (低 4 bits,單位 4 bytes)
151 byte服務類型 (TOS)
16-172 bytes總長度 = 封包長度 - 14 (乙太網表頭)
18-192 bytes識別碼
20-212 bytesFlags + Fragment Offset
221 byteTTL
231 byte協定 (TCP=6, UDP=17, ICMP=1, IGMP=2...)
24-252 bytes標頭檢驗和
26-294 bytes來源 IP 位址
30-334 bytes目的 IP 位址
34+可選Options (較少見)

標頭檢驗和計算演算法

範圍:從位移 14 開始,長度為 IHL * 4 bytes。步驟:

  1. 以 16-bit 為單位累加(高位在前,低位在後)。
  2. 將溢位的高 16 bits 折回加到低 16 bits(可能需重複一次以處理連續進位)。
  3. 取一補數,結果應為 0xFFFF 即校驗通過。
long sum = 0;
for (int i = 0; i < headLen; i += 2) {
    sum += (data[i + 14] << 8) + data[i + 15];
}
sum = (sum >> 16) + (sum & 0xFFFF);
sum += (sum >> 16);  // 防止上一步產生新進位
bool valid = ((short)(~sum) == 0);

後續規劃

下一篇將一併講解 TCP 與 UDP 封包的解析邏輯(也是筆者目前實作支援的兩大傳輸層協定)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved