Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix libpcap,有效负载偏移量66,但大小(头)和#x2B;落锤=62_Unix_Tcp_Network Programming_Libpcap_Packet Sniffers - Fatal编程技术网

Unix libpcap,有效负载偏移量66,但大小(头)和#x2B;落锤=62

Unix libpcap,有效负载偏移量66,但大小(头)和#x2B;落锤=62,unix,tcp,network-programming,libpcap,packet-sniffers,Unix,Tcp,Network Programming,Libpcap,Packet Sniffers,我将周日的时间花在理解libpcap的数据包嗅探上,我已经能够阅读数据包和元数据了。当我通过嗅探一些数据包来检查代码时,我发现我肯定在某个地方出错了 当我嗅到我父亲的网页时,我得到了整个服务器的响应。从200开始,直到。。。但在每个数据包的开头有4个字节不是ASCII。在下面的代码中,当我将for循环更改为(i=0)时,4个字节也会被打印出来。当我将其保留为(i=4)时,有效负载将从接收到的第一个ASCII字符开始完美显示 我现在的问题是,我是否计算数据偏移量错误?有没有我没有设置的旗帜?我忘了

我将周日的时间花在理解libpcap的数据包嗅探上,我已经能够阅读数据包和元数据了。当我通过嗅探一些数据包来检查代码时,我发现我肯定在某个地方出错了

当我嗅到我父亲的网页时,我得到了整个服务器的响应。从200开始,直到。。。但在每个数据包的开头有4个字节不是ASCII。在下面的代码中,当我将for循环更改为(i=0)时,4个字节也会被打印出来。当我将其保留为(i=4)时,有效负载将从接收到的第一个ASCII字符开始完美显示

我现在的问题是,我是否计算数据偏移量错误?有没有我没有设置的旗帜?我忘了计算tcp选项了吗

我还认为这可能与填充物有关。TCP标准规定TCP头长度应该是32的倍数。但是32-20=12。。这是3个字节的差异

例如,计算结果会是这样吗

TCP_HDR_SIZE = 32
sizeof(struct tcphdr) = 20
tcp->doff = 8    

sizeof(struct tcphdr) + tcp->doff = 28
TCP_HDR_SIZE - 28 = 4    <--- the 4 bytes i am looking for??? Maybe options? 

这似乎不正确

data_offset = sizeof(struct ether_header) + ip_len + sizeof(struct tcphdr) + tcp->doff
tcp->doff已经包含tcp头,并且是4字节的倍数。所以你想要

 data_offset = sizeof(struct ether_header) + ip_len + tcp->doff * 4;
仅使用sizeof(struct tcphdr)不会考虑可能出现的任何TCP选项

请注意,您的代码假设了一整批:

  • 假定没有以太网vlan
  • 假设IP数据包位于以太网之上(而非arp或stp)
  • 假设TCP高于IP
  • 假设您已经实际捕获了所需的所有数据。(即,您应验证长度不超过收割台->封口长度)

    • 这似乎不正确

      data_offset = sizeof(struct ether_header) + ip_len + sizeof(struct tcphdr) + tcp->doff
      
      tcp->doff已经包含tcp头,并且是4字节的倍数。所以你想要

       data_offset = sizeof(struct ether_header) + ip_len + tcp->doff * 4;
      
      仅使用sizeof(struct tcphdr)不会考虑可能出现的任何TCP选项

      请注意,您的代码假设了一整批:

      • 假定没有以太网vlan
      • 假设IP数据包位于以太网之上(而非arp或stp)
      • 假设TCP高于IP
      • 假设您已经实际捕获了所需的所有数据。(即,您应验证长度不超过收割台->封口长度)

      嘿,非常感谢你的回答。是的,我的代码非常基本:-)我刚开始学习所有这些东西。嘿,非常感谢你的回答。是的,我的代码非常基本:-)我刚开始学习所有这些东西。。