分解IP头

时间:2010-03-16 06:53:33

标签: c network-programming ip pcap

我必须做一个嗅探器作为安全课程的任务。我正在使用C和pcap库。我把一切都运行得很好(因为我从互联网上获得了代码并改变了它)。但我对代码有一些疑问。

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

ih的类型为ip_header,其当前指向数据包中的IP标头。
ver_ihl给出了IP的版本 我无法弄清楚是什么:& 0xf) * 4;

3 个答案:

答案 0 :(得分:3)

&安培;是按位和运算符,在这种情况下,你正在使用0xf和ver_ihl,它具有清除除了最不重要的4之外的所有位的效果

0xff& 0x0f = 0x0f

ver_ihl定义为前4位=版本+秒4 =互联网标题长度。和操作删除版本数据,留下长度数据本身。长度记录为32位字的计数,因此* 4将ip_len转换为标题中的字节数

回应你的评论:

按位并且和操作数中的相应位。当你和任何一个0都变为0而且任何一个都保持不变。

0xf = 0x0f =二进制0000 1111

所以,当你和0x0f有任何东西时,前4位被设置为0(因为你正在将它们与0对齐),而最后4位仍然与另一个操作数一样(因为你将它们与1对比)。这是一种称为位掩码的常用技术。

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

答案 1 :(得分:1)

从定义IPv4的RFC 791读取:

  

互联网标题内容摘要如下:

 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         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

IP头的前8位是版本和IHL字段的组合。

  

国际人道法:4位

     

Internet标头长度是32中互联网标头的长度     位字,因此指向数据的开头。注意     正确标题的最小值为5.

你所拥有的代码是在那里取前8位,然后切断IHL部分,然后将其转换为字节数。按位AND by 0xF将隔离IHL字段,乘以4则是因为32位字中有4个字节。

答案 2 :(得分:0)

ver_ihl字段包含两个4位整数,打包为低和高的nybble。长度指定为32位字的数量。因此,如果你有一个版本4的IP帧,有20个字节的标题,你的ver_ihl字段值为69.那么你就有了这个:

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

所以,是的,“& 0xf”屏蔽了低4位。