检查 HTTP 调用是否经过 gzip 压缩

检查 HTTP 调用是否经过 gzip 压缩

假设我有一个在端口 80 上运行的应用服务器 (Linux),我如何确保(我想是使用 tcpdump)所有传入请求和响应都经过 gzip 压缩?此外,由于服务器本身会调用另一台服务器 (Windows),我如何检查往返于该另一台服务器的传出和传入包(我的意思是,如果它们经过压缩)?谢谢

答案1

tcpdump单独使用网络层并不是一个好方法,从技术上讲,您可以通过检查数据包来确定答案,但这不是最好的网络层。第一个问题是您需要处理可变的 HTTP 标头,第二个问题是,对于 HTTP/1.1 和持久连接,您必须检查每个回复数据包,或重新组装每个请求/响应。

HTTP要求很少压缩Accept-Encoding:。不过,检查请求标头中是否存在“gzip”或“deflate”可能会很有用。

当使用压缩时,HTTP 回复应该有一个Content-Encoding:包含gzip或 的标头。deflate

注意事项:

  • 由于大量浏览器错误,许多 Web 服务器都会有一个默认的 User-Agent 列表,不会为其启用压缩
  • 很可能存在一组默认的文件/URL 模式或 MIME 内容类型,因此通常不会压缩 PDF 和图像
  • 小文件可能无法压缩

在 Apache 中,记录压缩使用情况的一种方法是mod_deflate使用DeflateFilter注释然后修改您的日志记录指令,我通常在自定义中至少使用以下内容LogFormat

%>s %B %I %O %D %{instream}n/%{outstream}n/%{ratio}n%% %{Content-Type}o

记录输入和输出的总大小、压缩细节和 MIME 类型。

我用过httpry来监视 HTTP 请求,但它在这里不太管用,因为它缺少检查和记录的功能回复标头(它也不会重新组合数据包或 HTTP 流)。

应该提供所需详细信息的两个程序是justsnifferxplico(请注意,虽然我从未使用过它们,因为它们的依赖关系使得编译起来有点棘手,但如果您可以为您的操作系统获取二进制包,那么您应该没问题)。

答案2

您可以检查 HTTP 连接的标头。如果标头包含字段,则Content-Encoding: gzip内容会被 gzip 压缩(另请参阅维基百科W3C HTTP 协议)。

答案3

尝试使用 ngrep ---

理想情况下,您会知道 Web 服务器正在通信的 IP 地址,否则您将需要捕获大多数内容,以便找到请求和响应。

https://stackoverflow.com/questions/9241391/how-to-capture-all-the-http-packets-using-tcpdump

相关内容