Unix libpcap,有效负载偏移量66,但大小(头)和#x2B;落锤=62
我将周日的时间花在理解libpcap的数据包嗅探上,我已经能够阅读数据包和元数据了。当我通过嗅探一些数据包来检查代码时,我发现我肯定在某个地方出错了 当我嗅到我父亲的网页时,我得到了整个服务器的响应。从200开始,直到。。。但在每个数据包的开头有4个字节不是ASCII。在下面的代码中,当我将for循环更改为(i=0)时,4个字节也会被打印出来。当我将其保留为(i=4)时,有效负载将从接收到的第一个ASCII字符开始完美显示 我现在的问题是,我是否计算数据偏移量错误?有没有我没有设置的旗帜?我忘了计算tcp选项了吗 我还认为这可能与填充物有关。TCP标准规定TCP头长度应该是32的倍数。但是32-20=12。。这是3个字节的差异 例如,计算结果会是这样吗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字符开始完美显示 我现在的问题是,我是否计算数据偏移量错误?有没有我没有设置的旗帜?我忘了
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
- 假设您已经实际捕获了所需的所有数据。(即,您应验证长度不超过收割台->封口长度)