程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> .net下基於winpcap實現的網絡分析程序(二)

.net下基於winpcap實現的網絡分析程序(二)

編輯:.NET實例教程
這次的重點放在數據的解析上面。具體的winpcap的操作嘛,因為官方的手冊已經很好很強大了,我就不廢話了。只在這裡留個鏈接好了,大家可以自行去看。

中文的手冊:

現在呢,假設我們已經抓取到了一個數據包。數據包解析還涉及到了大數小數的問題。為了方便,這裡就不詳細區分了,僅僅以比較常見的格式來描述了,並且還是IPv4的。

通過winpcap得到的數據包,0到5位這6個byte是目的MAC地址,6到11這6個byte是源Mac地址。接著的12、13兩位是以太網類型。到這裡說到的總共14位是ip數據包頭,不算在數據包的裡面。

再接下來的第14位,前面4個bit,也就是高位的4個bit,表示版本號,後面的4個bit表示數據包頭的長度。這個長度是有一個計算公式的,實際的長度要拿這個數乘以4。15位是服務類型,16、17兩位表示數據包頭的總長度,這個總長度,就是用winpcap獲得的數據包長度減去14。減去的14,就是上面說的數據包頭,它不計算在數據包長度裡面。

接著18、19位是ID,20、21位是flags和offset,22是ttl。23很有用,它是協議包類型,表示此包是tcp或者udp或者igmp等等。24、25兩位是“數據包的頭的crc碼”,它的計算范圍是從15位開始的數據包頭長度個數的數據的crc。具體的計算方法網上雖然很容易找到,但是也經常有錯誤的。我這裡就再說一次。

計算的時候,用32位的整形來累計結果。數據要兩位兩位的取,第一位做為高位,第二位做為低位,組成一個16位的整數,然後把這些整數相加。如果長度是奇數,那……放心好了,因為前面說過了,長度要乘以4的,所以肯定是偶數啦,呵呵。
代碼如下:
long sum = 0;
for(int i = 0;i < headlen;i+=2)
{
sum+= (data[i + 14]<<8) + data[i+15];
}

然後把累加好的和的高16位加到低16位上。
代碼如下:
sum = (sum>>16) + (sum&0xffff);
最後再把高16位加到低16位上,這樣做主要是為了防止上面一步出現了進位,導致sum超過0xffff。
代碼如下:
sum+=(sum>>16);
現在就可以進行crc檢測了,代碼如下:
if ((short)(~sum) == 0)
return true;
else return false;
剛才扯得多了些,下面繼續說其他位的意義。
26、27、28、29表示源IP地址,4位分別表示IP地址的4段。30、31、32、33表示目的IP地址。再往後,如果包頭部分還沒結束,就是option的內容了。不過看起來,那樣的數據包似乎很少見的。也許我說的不對,還希望大家指出來。

為了說著方便,我就假定沒有後面的option內容了。其實如果真沒有的話,頭的長度就固定是20了,也就不需要再標示頭的長度了。

剛才說的那個crc計算,就是截至到這裡的。

這次就寫這些了。下次把TCP和UDP一起說掉(其實是我只解析了這兩個協議,呵呵。)
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved