2010-03-16 61 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个字节。