为什么这个 SPDY SYN_STREAM 示例的标头似乎没有压缩?

4
我正在尝试使用SPDY协议,偶然发现了一个SPDY协议的样本(可通过“附件”链接下载)。
以下是我的操作步骤:
  1. 在Wireshark 1.12.2(或更新版本)中打开pcapng文件。
  2. 右键单击任何SSL/TLS frame,并转到协议首选项 -> RSA密钥列表...
  3. 点击new并输入IP地址0.0.0.0、端口443、协议spdy和此密钥文件路径。
  4. 右键单击任何SPDY帧,转到协议首选项 -> 取消压缩SPDY标头以关闭SPDY标头解压缩。
  5. 转到第45帧,在“SPDY: SYN_STREAM”层中观察,在突出显示“Header Block”之后,下面的十六进制转储变得可读。
根据SPDY规范,这应该是经过压缩的。为什么我能看到它?有没有一种方法可以禁用SPDY协议中的标头压缩?是否使用了不正确的Wireshark操作方式?
1个回答

2

关于规范

您提供的草案如下所述:

使用zlib压缩名称/值头块的全部内容。在连接的一个方向上,所有名称值对都有一个单独的zlib流。SPDY在每个压缩帧之间使用SYNC_FLUSH。

实现注意事项:压缩引擎可以调整为更注重速度或大小。优化大小会增加内存使用和CPU消耗。由于头块通常很小,实现者可能希望将压缩引擎的窗口大小从默认的15位(32KB窗口)减小到11位(2KB窗口)。确切的设置由压缩器选择,解压器将使用任何设置。

它并不强制使用任何压缩级别。实际上,您可以完全不使用压缩来使用zlib,这是zlib格式支持的:

级别0实际上根本不进行压缩,并且实际上会略微扩展数据以生成zlib格式(它不是输入的逐字节副本)。

关于示例

我联系了示例的作者。结果他在实验中使用了nginx。在他提供的文档中,nginx的配置如下:

 # SPDY
 server {
     listen       443 ssl spdy;
     server_name  localhost;
     ssl_certificate      cert.pem;
     ssl_certificate_key  key.pem;
     ssl_session_cache    shared:SSL:1m;
     ssl_session_timeout  5m;
     ssl_ciphers  DES-CBC3-SHA;
     ssl_prefer_server_ciphers  on;
     location / {
         root   html;
         index  index.html index.htm;
     }

然而,nginx文档指出头部压缩必须明确指定:
Syntax: spdy_headers_comp level;
Default : spdy_headers_comp 0;

Sets the header compression level. [...] The special value 0 turns off the header compression.

这意味着实验很可能没有启用头部压缩。

我的结论

  • 是的,你可以在SPDY中禁用头部压缩,但你必须保持zlib格式,并将压缩级别设置为0
  • 你正在正确地使用Wireshark。你使用的样本是以压缩级别0创建的。

嗯,谢谢,这听起来是有道理的,但零压缩不应该像任何其他压缩级别一样进行解压缩吗?我知道Wireshark可能存在某种错误,但我可以使用任何其他语言编写解压缩此零压缩格式的代码吗? - d33tah
看这里:https://gist.github.com/anonymous/ae61c49e2f65b54534b9 。无论如何,我更接近接受这个答案。 - d33tah
我成功地解压了它。以下是详细信息:http://reverseengineering.stackexchange.com/q/8616/4674 - d33tah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接