假设我有一个在端口 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 流)。
应该提供所需详细信息的两个程序是justsniffer
和xplico
(请注意,虽然我从未使用过它们,因为它们的依赖关系使得编译起来有点棘手,但如果您可以为您的操作系统获取二进制包,那么您应该没问题)。
答案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