【发布时间】:2011-05-17 05:10:14
【问题描述】:
我正在使用 pcap 来捕获我想要解析其有效负载的 TCP 数据包。我的策略如下:
- 获取以太网标头并检查其类型是否为
ETHERTYPE_IP(IP 数据包) - 检查IP包是否有协议
IPPROTO_TCP(TCP包) 检查负载大小 > 0
(size = ntohs(ip_header->total_length - ip->header_length*4 - sizeof(struct tcp_header))。解析payload(获取主机url)
我还没有开始解析有效负载,因为我遇到了差异。下面是使用过滤器"host = www.google.com" 捕获的 10 个 TCP 数据包的有效负载的打印输出。
数据包编号:3:TCP 数据包:源端口:80 目标端口:58723 数据包中没有数据
数据包号:4:TCP 数据包:源端口:58723 目标端口:80 数据包中没有数据
数据包编号:5:TCP 数据包:源端口:58723 目标端口:80 有效负载: 获取/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 接受:application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,/;q=0.5 接受语言:en-us 接受编码:gzip,放气 饼干: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 正常 日期:2010 年 11 月 29 日星期一 10:11:36 GMT 过期:-1 缓存控制:私有,max-age=0 内容类型:文本/html;字符集=UTF-8 内容编码:gzip 服务器:gws 内容长度:8806 X-XSS-防护:1;模式=块 \213
为什么负载和端口存在差异?理想情况下,我只想解析数据包 5 之类的数据包。如何忽略数据包 7 和 9?
【问题讨论】:
-
不清楚您要过滤数据包的哪一部分。我假设它是源端口或目标端口。
-
我想获取主机地址。我发现通过使用目标端口 80 过滤数据包,我设法“清除”了不需要的数据包,但是当有人访问非标准端口上的 url 时会发生什么?
-
例如 ssh & ssl 加密数据。这些数据包看起来像您不想要的数据包。 FWIW 的大量流量可能是这样的。使用正则表达式 (regex.h) 选择数据包 - regcomp、regexec 等。查找具有可读字符块的数据包。
标签: c++ c tcp pcap packet-sniffers