检查 HTTP 调用是否被 gzip

pis*_*hio 4 networking compression tcpdump

假设我有一个应用程序服务器 (Linux) 在端口 80 上运行,我如何确保(我猜是使用 tcpdump)所有传入的请求都被 gzipped 并且所有响应也被 gzip 压缩?此外,由于服务器本身调用另一台服务器(Windows),我如何检查与该另一台服务器之间的传出和传入包(如果它们被压缩,我的意思是)?谢谢

mr.*_*tic 5

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

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

HTTP 回复应Content-Encoding:包含包含gzipdeflate使用压缩时的标头。

注意事项:

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

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

%>s %B %I %O %D %{instream}n/%{outstream}n/%{ratio}n%% %{Content-Type}o
Run Code Online (Sandbox Code Playgroud)

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

我曾经httpry观察过 HTTP 请求,但它在这里不太适用,因为遗憾的是它缺少检查和记录响应标头的功能(它也不重新组装数据包或 HTTP 流)。

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