【问题标题】:Decomposition of an IP headerIP头的分解
【发布时间】:2011-01-27 23:56:01
【问题描述】:

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

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

ihip_header 类型,它当前指向数据包中的 IP 标头。
ver_ihl 给出 IP 的版本。
我不知道是什么:& 0xf) * 4;

【问题讨论】:

  • 诚实和彻底的 +1 :)

标签: c network-programming ip pcap


【解决方案1】:

& 是按位与运算符,在这种情况下,您将 ver_ihl 与 0xf 进行与运算,其作用是清除除最不重要的 4 以外的所有位

0xff & 0x0f = 0x0f

ver_ihl 定义为前 4 位 = 版本 + 后 4 = Internet 标头长度。 and 操作删除版本数据,保留长度数据。长度记录为 32 位字的计数,因此 *4 将 ip_len 转换为标头中的字节数

回应您的评论:

按位与操作数中的相应位相乘。当你和任何带有 0 的东西变成 0 并且任何带有 1 的东西保持不变。

0xf = 0x0f = 二进制 0000 1111

因此,当您和 0x0f 使用任何东西时,前 4 位设置为 0(因为您将它们与 0 相加),最后 4 位保持在另一个操作数中(因为您将它们与 1 相加)。这是一种称为位掩码的常用技术。

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

【讨论】:

  • 我明白了(ver_ihl 包含版本(4 位)+ Internet 标头长度(4 位)),但我仍然不明白此操作如何删除版本数据。当您与 0xf 进行与运算时,这是否意味着您的与运算只有第 4 位?
【解决方案2】:

从定义 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 Header Length 是 Internet 标头的长度,以 32 为单位 位字,因此指向数据的开头。注意 正确标题的最小值是 5。

您所拥有的代码正在执行的操作是获取前 8 位,然后切掉 IHL 部分,然后将其转换为字节数。 0xF 的位与将隔离 IHL 字段,并且乘以 4 是因为 32 位字中有 4 个字节。

【讨论】:

    【解决方案3】:

    ver_ihl 字段包含两个 4 位整数,打包为低 nybble 和高 nybble。长度指定为 32 位字的数量。因此,如果您有一个带有 20 字节标头的第 4 版 IP 帧,那么您的 ver_ihl 字段值为 69。那么您将拥有:

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

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

    【讨论】:

      猜你喜欢
      • 2017-12-06
      • 1970-01-01
      • 2014-06-06
      • 2015-11-02
      • 1970-01-01
      • 2015-05-09
      • 1970-01-01
      • 1970-01-01
      • 2014-03-09
      相关资源
      最近更新 更多