什么是HTTP的BPF?

时间:2010-05-05 16:47:37

标签: c packet-capture

可以看到here的定义。

候选答案可能是tcp and dst port 80,但tcp and dst port 80可以保证HTTP流量并包含所有HTTP流量吗?

似乎没有,因为可以通过以这种方式指定80以外的其他端口来访问某些站点:

http://domain.name:8080

所以我的问题是:HTTP的确切 BPF 是什么?

更新

是否有实现来验证数据包是否已成为c中的HTTP?

4 个答案:

答案 0 :(得分:4)

  • 最简单的过滤器:tcp and dst port 80
  • 许多端口(包括SSL):tcp and (dst port 80 or dst port 8080 or dst port 443)
  • 例如,如果您只想要HTTP GET数据包,并且不介意您只获取每个GET的第一个数据包而您认为GET数据包中没有TCP选项,则可以过滤TCP以及TCP有效负载(HTTP)以“GET”开头,不带引号:tcp and tcp[20:4] = 0x47455420
  • 如果你认为可以有TCP选项(我很确定它对非SYN数据包不常见),你可以做一个更复杂的过滤器,它实际上使用TCP头并检查TCP头长度(而不是假设它是20):tcp and tcp[(tcp[12] >> 4) * 4 : 4] = 0x47455420
  • 所有这些过滤器的组合看起来都是这样(尽管由于GET已加密,SSL在此处无法正常工作):tcp and (dst port 80 or dst port 8080 or dst port 443) and tcp[(tcp[12] >> 4) * 4 : 4] = 0x47455420
  • 以类似的方式,您可以通过过滤此方法开头的字节来过滤任何HTTP请求方法。如果您还需要SYN和SYN-ACK数据包,可以通过使用按位运算过滤TCP标志来添加它们。
  • 不幸的是,过滤所有HTTP流量非常困难,因为请求或响应中不在第一个中的数据包很难过滤 - 任何TCP有效负载都可以是HTTP请求或响应的一部分。如果您想要所有HTTP流量,您可能应该仅依靠端口。

答案 1 :(得分:3)

HTTP没有准确的BPF,因为HTTP不是链路层协议。执行此操作的最佳方法是选择可能是HTTP的任何流量,然后在应用程序中验证该流量。您必须将TCP段拼接在一起,因为来自流中间的特定TCP段中的数据不表示应用层协议。

答案 2 :(得分:2)

BPF不是有状态数据包过滤器,因此BPF无法检测到非标准HTTP端口上的任何流量。 BPF过滤器位于传输层,而不是应用程序层,因此它只关心TCP / IP,而不是TCP / IP数据包中封装的应用程序数据。您最好的办法是过滤常见的HTTP端口80,8000和8080.如果您想要考虑HTTPS,还需要443。

答案 3 :(得分:0)

Wireshark在解码数据包方面做得不错,并在适当的时候标记HTTP。