6

定义可以在这里看到。

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

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

http://domain.name:8080

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

更新

是否有一种实现来验证数据包是否c已经是 HTTP 数据包?

4

4 回答 4

5
  • 最简单的过滤器: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
  • 所有这些过滤器的组合看起来像这样(尽管 SSL 在这里不会真正起作用,因为 GET 是加密的):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 流量,您可能应该只依赖端口。
于 2010-05-05T20:11:49.073 回答
3

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

于 2010-05-05T16:53:53.697 回答
2

BPF 不是有状态的数据包过滤器,因此任何在非标准 HTTP 端口上的流量都不会被 BPF 检测到。BPF 在传输层而不是应用层过滤,所以它只关心 TCP/IP,而不是封装在 TCP/IP 数据包中的应用程序数据。最好的办法是过滤常见的 HTTP 端口 80、8000 和 8080。如果还想考虑 HTTPS,也可以使用 443。

于 2010-05-05T16:53:26.903 回答
0

Wireshark does a decent job of decoding packets and labeling them HTTP where appropriate.

于 2011-04-11T19:47:54.940 回答