Deflate压缩浏览器兼容性及其相对于GZIP的优势

91

2012年2月10日更新:

zOompf对这个主题进行了非常深入的研究,此处有详细信息。该研究结果胜过以下任何发现。


2010年9月11日更新:

已经为此创建了一个测试平台此处


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

" 'Gzip'是gzip格式,而'deflate'是zlib格式。他们应该可能称第二个为“zlib”,以避免与原始紧缩的数据格式的混淆。虽然HTTP 1.1 RFC 2616正确地指向了RFC 1950中的zlib规范来传输编码'deflate',但有关错误生成或期望RFC 1951中deflate规范中的原始deflate压缩数据的服务器和浏览器的报告,尤其是Microsoft产品。因此,即使使用zlib格式的'deflate'传输编码会更高效 (事实上,这正是zlib格式的设计目的),但使用'gzip'传输编码可能更可靠,这是HTTP 1.1作者不幸选择名称的结果。" (来源: http://www.gzip.org/zlib/zlib_faq.html)

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

Deflate压缩数据一定比GZIP少几个字节。

如果所有这些浏览器都能成功解码数据,那么使用原始的Deflate而不是zlib存在哪些缺点?



更新于2010年9月11日:

已经为此创建了一个测试平台,请点击这里


1
您介意详细说明一下为什么System.IO.Compression.DeflateStream与zlib.net相比较差吗?谷歌没有显示出太多相关信息,除了一个人提到它“压缩比不是特别好”。 - Joel Mueller
@Gumbo:我该怎么做呢?没有办法知道页面在浏览器端是否正确呈现,对吧?我猜可能有一个 AJAX 解决方案;但即使如此,我也可能会遇到一些 XMLHttpRequest 无法正常工作的情况。 - David Murdoch
1
我一直在研究System.IO.Compression库,它似乎使用静态/预定义树-因此压缩并未针对特定流进行优化。这应该是最快的方法,但肯定会产生较差的压缩比率。 - Brady Moritz
我有压缩过的XML数据,如何在浏览器中查看它? - John
2
@JoelMueller 这可能会有所解释:http://www.virtualdub.org/blog/pivot/entry.php?id=335 - Nayuki
显示剩余4条评论
4个回答

37

更新:浏览器已经停止支持原始压缩。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。


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

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


1
你能更具体地说明如何使用zlib.net进行压缩吗?这与上面的图表相符吗?在某些XP IE情况下,原始deflate有效但zlib无效? - David Eison
Android自API 9开始支持deflate压缩。请参阅http://developer.android.com/reference/java/util/zip/DeflaterInputStream.html获取更多信息。 - Stuart Blackler
1
@DavidMurdoch 从你的测试中得出的唯一明智结论似乎是永远不要使用deflate,http://www.vervestudios.co/projects/compression-tests/results 我认为应该编辑这个答案以反映这一点。 - Sam Saffron

6

Android 1.6浏览器(v4)在您的页面上未通过zlib和deflate测试。我已将其添加到您的列表中。


谢谢!Android浏览器发送哪种内容编码? - David Murdoch
它发送了“Accept-Encoding: gzip”。 - Josef Pfleger

1

难道不是使用 mod_deflate 的 AddOutputFilterByType DEFLATE 默认发送gzip吗?


1
嘿,保罗,感觉像是在和名人交谈...你无处不在。 :-)无论如何,AddOutputFilertByType DEFLATE 默认情况下会对响应进行gzip压缩而不是deflate(据我所知)。 Gzipdeflate + 10字节头 + 8字节尾 - 这意味着 Gzipdeflate 总是更大...那么我们为什么要使用gzip呢? (请参见http://en.wikipedia.org/wiki/Gzip#File_format以了解gzip的构成)。话虽如此,我不确定如何设置Apache中的deflate作为首选压缩方法。 - David Murdoch

-1
据我所知,是的 - 基本上你“总是可以发送原始DEFLATE,一切都会没问题”……并非“总是”,但在大多数情况下是如此。如果不行,那就是浏览器的问题。

我正在尝试查找原始压缩失败的情况。根据规范,它应该在所有浏览器中失败。 - David Murdoch
原始的deflate(即没有任何头信息的zlib)只能在IE7中使用encoding:gzip,而在chrome中仅测试过encoding:deflate - Scotty.NET

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