降低压缩浏览器的兼容性和优于GZIP的优势


91

2012年2月10日更新:

zOompf在这里就此主题完成了一些非常深入的研究。它胜过以下任何发现。


2010年9月11日更新:

为此在这里创建了一个测试平台




一些背景信息的GZIP和DEFLATE(zlib)的HTTP 1.1定义:

“'Gzip'是gzip格式,'deflate'是zlib格式。为了避免与原始deflate压缩数据格式混淆,他们可能应该调用第二个'zlib'。HTTP1.1 RFC 2616正确指向在RFC 1950中针对“放气”传输编码的zlib规范中,有服务器和浏览器的报告错误地按照RFC 1951中的放气规范产生或期望原始放气数据,尤其是Microsoft产品。使用zlib格式进行传输编码将是更有效的方法(实际上,正是 zlib格式设计用于),由于HTTP 1.1作者不幸选择了名称,因此使用'gzip'传输编码可能更可靠。”(来源:http : //www.gzip.org/zlib/zlib_faq.html

所以,我的问题是:如果我不使用zlib包装程序(或gzip)发送RAW压缩数据,是否有任何现代浏览器(例如IE6及更高版本,FF,Chrome,Safari等)无法理解原始压缩数据压缩数据(假设HTTP请求标头“ Accept-Encoding”包含“ deflate”)?

压缩数据将总是比GZIP小几个字节。

如果所有这些浏览器都能成功解码数据,那么发送RAW deflate而不是zlib有什么不利之处?



2010年9月11日更新:

为此在这里创建了一个测试平台


1
与zlib.net相比,您是否愿意扩展System.IO.Compression.DeflateStream为何糟糕的原因?Google并没有向我展示很多相关的内容,只是有人提到它“没有特别好的压缩率”。
乔尔·穆勒

是的,.net的gzip和deflate方法的压缩率似乎都没有达到应有的水平。但是,我还没有在两者之间做任何速度基准测试(zlib.net与本机.net)。
大卫·默多克

您为什么不只记录测试用例的结果?
Gumbo

1
我一直在System.IO.Compression库中闲逛,它似乎使用了静态/预定义的树-因此未针对特定流优化压缩。应该是最快的方法,但绝对会产生较差的压缩率。
布雷迪·莫里茨

2
@JoelMueller这可能会解释:virtualdub.org/blog/pivot/entry.php?
id=335

Answers:


37

更新:浏览器已放弃对原始deflate的支持。zOompf在这里就此主题完成了一些非常深入的研究不幸的是,原始放气似乎并不安全。


检查http://www.vervestudios.co/projects/compression-tests/results以获取更多结果。

以下是经过测试的浏览器:

/*  Browser                       DEFLATE      ZLIB     */
    XP Internet Explorer 6        PASS         FAIL
    XP Internet Explorer 7        PASS         FAIL
    XP Internet Explorer 8        PASS         FAIL
    Vista Internet Explorer 8     PASS         FAIL
    XP Firefox 3.6.*              PASS         PASS
    XP Firefox 3.5.3              PASS         PASS
    XP Firefox 3.0.14             PASS         PASS
    Win 7 Firefox 3.6.*           PASS         PASS
    Vista Firefox 3.6.*           PASS         PASS
    Vista Firefox 3.5.3           PASS         PASS
    XP Safari 3                   PASS         PASS
    XP Safari 4                   PASS         PASS     
    XP Chrome 3.0.195.27          PASS         PASS
    XP Opera 9                    PASS         PASS
    XP Opera 10                   PASS         PASS
    XP Sea Monkey 1.1.8           PASS         PASS
    Android 1.6 Browser (v4)*     N/A          N/A
    OS-X Safari 4                 PASS         PASS
    OS X Chrome 7.0.517.44        PASS         PASS
    OS X Opera 10.63              PASS         PASS
    iPhone 3.1 Safari             PASS         PASS

* Android发送HTTP请求标头“ Accept-Encoding:gzip”。放气是不允许的。


我得出的结论是,我们始终可以发送原始的 DEFLATE(当HTTP请求标头“ Accept-Encoding”包含“ deflate”时),浏览器将能够正确解释编码后的数据。有人可以证明这是错误的吗?

注意:.NET的DEFLATE的本机实现(System.IO.Compression.DeflateStream)是原始的DEFLATE。它也很烂。请使用zlib.net满足所有.NET 缩小需求。


1
您能更具体地使用zlib.net进行放气吗?它与上面的图表如何匹配,上面的图表说原始放气有效,但zlib在某些XP IE情况下不起作用?
David Eison 2011年

:Android支持自放气API 9.见压缩developer.android.com/reference/java/util/zip/...以获取更多信息
斯图尔特·布莱克勒

1
@DavidMurdoch测试唯一的理智结果似乎从未使用deflatevervestudios.co/projects/compression-tests/results我认为应该对这个答案进行编辑以反映这一点
Sam Saffron

是的,我同意。现在更新。
大卫·默多克


1

是不是AddOutputFilterByType DEFLATE默认情况下使用mod_deflate由gzip发送?


1
嗨,保罗,我觉得我在和一个名人聊天……您无处不在。:-)无论如何,AddOutputFilertByType DEFLATE默认情况下gzip压缩响应而不是缩小响应(据我所知)。Gzipdeflate+ 10字节的标头+ 8字节的页脚-这意味着Gzip总是大于deflate...所以我们为什么要使用gzip?(有关组成gzip的详细信息,请参见en.wikipedia.org/wiki/Gzip#File_format)。话虽如此,我不确定如何将其设置deflate为Apache中的首选压缩方法。
大卫·默多克

-1

据我所知,是的-您几乎可以“总是发送原始的DEFLATE,一切都会好起来的”……不是“总是”,而是大多数情况。如果没有,这就是浏览器的问题。


我正在尝试寻找原始放气失败的情况。根据规范,它应该在所有浏览器中都失败。
大卫·默多克

原料deflate(即不zlib的,根本没有标题)只能在工作IE7,如果encoding:gzip和(仅适用于Chrome V24测试)encoding:deflate
Scotty.NET
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.