2010-03-16 63 views
5

我必須做一個嗅探器作爲安全課程的任務。我正在使用C和pcap庫。我得到了一切正常工作(因爲我從互聯網上獲得了一個代碼並對其進行了更改)。但是我對代碼有一些疑問。IP頭的分解

u_int ip_len = (ih->ver_ihl & 0xf) * 4; 

ihip_header類型,並且其目前指向到數據包的IP報頭。
ver_ihl給出IP的版本。
我想不通的是:& 0xf) * 4;

+0

+1爲誠實和徹底:) – 2010-03-16 06:58:31

回答

3

&是按位和運營商,在這種情況下你安定ver_ihl與0xf它具有清熱比至少signifcant其他所有位的效果4

0xff & 0x0f = 0x0f

ver_ihl定義爲前4位=版本+第4位=因特網標題長度。和操作本身會移除離開長度數據的版本數據。

按位和ANDS的相應位的操作數:因此* 4匝ip_len成字節的標頭中

計數響應於您的評論的長度記錄爲32位字計數。當你和0的任何東西都變成0,任何1的東西都保持不變。

0xf =爲0x0F =二進制0000 1111

所以,當你和任何前4位均設置爲0爲0x0F(因爲你是安定他們反對0),最後4位保持在其他操作(就像你和他們對抗一樣)。這是一種稱爲位掩碼的常用技術。

http://en.wikipedia.org/wiki/Bitwise_operation#AND

+0

我明白了(ver_ihl包含版本(4位)+互聯網標題長度(4位)),但我仍然沒有得到這個操作如何刪除版本數據。當你和0xf在一起時,這是否意味着你僅僅握拳了4位? – scatman 2010-03-16 07:22:49

0

的ver_ihl字段包含兩個4位整數,填充作爲低和高四位。長度被指定爲32位字的數量。所以,如果你有一個版本4的IP幀,有20個字節的頭,你就應該有69. ver_ihl字段值然後,你有這樣的:

01000101 
& 00001111 
    -------- 
    00000101 

所以,是的,「& 0xf 「掩蓋了低4位。

1

RFC 791定義的IPv4讀:

的互聯網報頭的內容概括如下:

0     1     2     3 
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
|Version| IHL |Type of Service|   Total Length   | 
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 

前8個的IP報頭的比特的組合版本和國際人道法領域。

IHL:4個比特

因特網頭長度是internet頭部的在32個 位字的長度,並因此指向數據的開頭。請注意, 正確標題的最小值爲5。

你有什麼代碼正在做的是取出頭8位,然後剔除IHL部分,然後將其轉換爲字節數。由0xF按位AND將隔離IHL字段,並乘以4,因爲在32位字中有4個字節。