我正在使用pcap来捕获我想要解析有效负载的TCP数据包。我的策略如下:
ETHERTYPE_IP
(IP数据包)IPPROTO_TCP
(TCP数据包)检查有效负载大小> 0 (size = ntohs(ip_header->total_length - ip->header_length*4 - sizeof(struct tcp_header))
。
解析有效负载(抓住主机网址)
我还没有开始解析有效载荷,因为我遇到了差异。下面是使用过滤器"host = www.google.com"
打印出10个捕获的TCP数据包的有效负载。
数据包编号:3 :TCP数据包:源端口:80目标端口:58723 数据包中没有数据
数据包编号:4 :TCP数据包:源端口:58723目标端口:80 数据包中没有数据
数据包编号:5 :TCP数据包:源端口:58723目标端口:80 有效负载: GET / HTTP / 1.1 主持人:www.google.com User-Agent:Mozilla / 5.0(Macintosh; U; Intel Mac OS X 10_6_5; zh-CN)AppleWebKit / 533.19.4(KHTML,类似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 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好的 日期:星期一,2010年11月29日10:11:36 GMT 到期:-1 Cache-Control:private,max-age = 0 内容类型:text / html;字符集= UTF-8 内容编码:gzip 服务器:gws 内容长度:8806 X-XSS-Protection:1;模式=块 \ 213
为什么有效载荷和端口存在差异?理想情况下,我只想解析数据包5之类的数据包。如何忽略像7和9这样的数据包?
答案 0 :(得分:6)
仅通过分析内容。什么在IP或TCP标头中什么都不能标记“HTTP请求”数据包。即使“连接中的第一个数据包”也不起作用,因为存在持久连接。
此外,要完全确定捕获所有URI,您需要重新组装TCP流并解析HTTP请求:URI可以拆分为两个或更多数据包。
答案 1 :(得分:2)
与IP头一样,TCP头也是可变长度的。你没有考虑到这一点。您需要在IP数据中找到TCP标头,然后使用其长度字段(需要乘以4,就像IP标头长度字段那样),而不是盲目地从总数据包大小中减去sizeof(struct tcp_header))
。知道实际数据有效负载的位置。
答案 2 :(得分:2)
您的大小计算不正确 - 您无法在网络主机顺序中进行减法,您必须先将每个字段转换为主机字节顺序:
size = ntohs(ip_header->total_length) - ntohs(ip->header_length) * 4 - sizeof(struct tcp_header))
但是,正如Remy Lebeau指出的那样,您实际上需要检查TCP标头中的offset
字段以了解有效负载的起始位置。
数据包5和数据包7之间的区别在于前者是从客户端,到服务器,而后者是从服务器到服务器的响应客户。这就是端口切换的原因 - 源地址和目标地址也将被切换。
如果您只想查看来自客户端的数据包,请检查源地址是否等于客户端的地址。