定义可以在这里看到。
候选答案可能是tcp and dst port 80
,但可以tcp and dst port 80
保证它的HTTP
流量并包括所有 HTTP 流量吗?
似乎不是,因为可以通过这种方式指定除 80 以外的其他端口来访问某些站点:
http://domain.name:8080
所以我的问题是:确切的BPF是HTTP
什么?
更新
是否有一种实现来验证数据包是否c
已经是 HTTP 数据包?
定义可以在这里看到。
候选答案可能是tcp and dst port 80
,但可以tcp and dst port 80
保证它的HTTP
流量并包括所有 HTTP 流量吗?
似乎不是,因为可以通过这种方式指定除 80 以外的其他端口来访问某些站点:
http://domain.name:8080
所以我的问题是:确切的BPF是HTTP
什么?
更新
是否有一种实现来验证数据包是否c
已经是 HTTP 数据包?
tcp and dst port 80
tcp and (dst port 80 or dst port 8080 or dst port 443)
tcp and tcp[20:4] = 0x47455420
tcp and tcp[(tcp[12] >> 4) * 4 : 4] = 0x47455420
tcp and (dst port 80 or dst port 8080 or dst port 443) and tcp[(tcp[12] >> 4) * 4 : 4] = 0x47455420
HTTP 没有确切的 BPF,因为 HTTP 不是链路层协议。最好的方法是选择任何看起来可能是 HTTP 的流量,然后在您的应用程序中进行验证。为此,您必须将 TCP 段拼接在一起,因为来自流中间的特定 TCP 段中的数据并不表示应用层协议。
BPF 不是有状态的数据包过滤器,因此任何在非标准 HTTP 端口上的流量都不会被 BPF 检测到。BPF 在传输层而不是应用层过滤,所以它只关心 TCP/IP,而不是封装在 TCP/IP 数据包中的应用程序数据。最好的办法是过滤常见的 HTTP 端口 80、8000 和 8080。如果还想考虑 HTTPS,也可以使用 443。
Wireshark does a decent job of decoding packets and labeling them HTTP where appropriate.