2

我正在使用 pcap 来捕获我想为其解析有效负载的 TCP 数据包。我的策略如下:

  1. 获取以太网标头并检查它是否具有类型ETHERTYPE_IP(IP 数据包)
  2. 检查IP包是否有协议IPPROTO_TCP(TCP包)
  3. 检查有效载荷大小 > 0 (size = ntohs(ip_header->total_length - ip->header_length*4 - sizeof(struct tcp_header))

  4. 解析有效载荷(获取主机 url)

我还没有开始解析有效载荷,因为我得到了差异。下面是使用 filter 捕获的 10 个 TCP 数据包的有效负载的打印输出"host = www.google.com"

数据包编号:3:TCP 数据包:源端口:80 目标端口:58723 数据包中没有数据

数据包编号:4:TCP 数据包:源端口:58723 目标端口:80 数据包中没有数据

数据包编号:5:TCP 数据包:源端口:58723 目标端口:80负载: GET / HTTP/1.1 主机:www.google.com 用户代理:Mozilla/5.0(Macintosh;U;Intel Mac OS X 10_6_5;en- us) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4 Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8 ,image/png, / ;q=0.5 Accept-Language: en-us Accept-Encoding: gzip, deflate Cookie: THICNT=25; SID=DQAAAKIAAAB2ktMrEftADifGm05WkZmlHQsiy1Z2v-连接:保持活动

数据包编号:6:TCP 数据包:源端口:80 目标端口:58723 数据包中没有数据

数据包编号:7:TCP 数据包:源端口:80 目标端口:58723有效负载: \272نu\243\255\375\375}\336H\221\227\206\312~\322\317N\236\255A\343 #\226\370֤\245[\327`\306ըnE\263\204\313\356\3268 )p\344\301_Y\255\267\240\222x\364

数据包编号:8:TCP 数据包:源端口:58723 目标端口:80 数据包中没有数据

数据包号:9:TCP 数据包:源端口:80 目标端口:58723有效负载: HTTP/1.1 200 OK 日期:星期一,2010 年 11 月 29 日 10:11:36 GMT 过期:-1 缓存控制:私有,max-age= 0 内容类型:文本/html;charset=UTF-8 内容编码:gzip 服务器:gws 内容长度:8806 X-XSS-Protection:1;模式=块 \213

为什么有效载荷和端口存在差异?理想情况下,我只想解析像数据包 5 这样的数据包。如何忽略像 7 和 9 这样的数据包?

4

3 回答 3

6

只有通过分析内容。IP 或 TCP 标头中没有可以标记“HTTP 请求”数据包的内容。即使“连接中的第一个数据包”也不起作用,因为存在持久连接。

此外,要完全确定捕获所有 URI,您需要重新组装 TCP 流并解析 HTTP 请求:URI 可以拆分为两个或多个数据包。

于 2010-11-29T11:45:06.133 回答
3

与 IP 标头一样,TCP 标头也是可变长度的。你没有考虑到这一点。与其盲目地sizeof(struct tcp_header))从总数据包大小中减去,您需要在 IP 数据中定位 TCP 标头,然后使用其长度字段(需要乘以 4,就像 IP 标头长度字段一样)来知道实际在哪里数据有效载荷位于。

于 2010-11-29T22:05:32.540 回答
2

您的大小计算不正确 - 您不能在网络主机顺序中进行减法,您必须先将每个字段转换为主机字节顺序:

size = ntohs(ip_header->total_length) - ntohs(ip->header_length) * 4 - sizeof(struct tcp_header))

但是,正如Remy Lebeau所指出的,您实际上需要检查offsetTCP 标头中的字段以了解有效负载的开始位置。

数据包 5 和数据包 7 的区别在于前者是客户端到服务器的,而后者是从服务器到客户端的响应。这就是端口被切换的原因——源地址和目标地址也将被切换。

如果您只想查看来自客户端的数据包,请检查源地址是否等于客户端的地址。

于 2010-11-30T01:57:17.060 回答