GZIP 与 DEFLATE 压缩相比有啥优势?

Posted

技术标签:

【中文标题】GZIP 与 DEFLATE 压缩相比有啥优势?【英文标题】:What is the advantage of GZIP vs DEFLATE compression?GZIP 与 DEFLATE 压缩相比有什么优势? 【发布时间】:2011-11-06 19:21:43 【问题描述】:

我有一个使用 asp.NET 4 (C#) 的网站。

我正在尝试找到一种方法来更好地优化我的网站的带宽。

我读过很多文章说 DEFLATE 比 GZIP 更快更小,因为 GZIP(基于 DEFLATE)添加了一些额外的数据。

检查 bing.com 和 google.com 的标头似乎它们都发送 GZIP 编码的数据。

假设我读到的是真的,我错过了 GZIP 在这种情况下的优势。所以我怀疑应该有充分的理由更喜欢 GZIP 而不是 DEFLATE。

我的问题:

我不知道 GZIP 是否比 DEFLATE 提供任何优势? 知道为什么主要搜索引擎使用 GZIP 吗?

这是我用来发送 DEFLATE 的代码(来自 Global.asax):

protected void Application_PreRequestHandlerExecute(object sender, EventArgs e)
    

        HttpApplication app = sender as HttpApplication;
        string acceptEncoding = app.Request.Headers["Accept-Encoding"];
        Stream prevUncompressedStream = app.Response.Filter;

        if (!(app.Context.CurrentHandler is Page ||
            app.Context.CurrentHandler.GetType().Name == "SyncSessionlessHandler") ||
            app.Request["HTTP_X_MICROSOFTAJAX"] != null)
            return;

        if (acceptEncoding == null || acceptEncoding.Length == 0)
            return;

        acceptEncoding = acceptEncoding.ToLower();

        if (acceptEncoding.Contains("deflate") || acceptEncoding == "*")
        
            // defalte
            app.Response.Filter = new DeflateStream(prevUncompressedStream,
                CompressionMode.Compress);
            app.Response.AppendHeader("Content-Encoding", "deflate");
        
        else if (acceptEncoding.Contains("gzip"))
        
            // gzip
            app.Response.Filter = new GZipStream(prevUncompressedStream,
                CompressionMode.Compress);
            app.Response.AppendHeader("Content-Encoding", "gzip");
        
    

【问题讨论】:

见***.com/questions/388595/… 感谢 Paul 的修改。 所有答案都是错误的/不完整的,除了这个:***.com/a/9856879/632951 【参考方案1】:

Gzip 更可靠,因为它是 deflate 加上一些标头和校验和。换句话说,gzip 是放气的,还有额外的标头和校验和。 Deflate 使用 adler32 检查,它也是 gzip 的一部分。因为 gzip 有效载荷是 DEFLATE 压缩的有效载荷。

Deflate info

Gzip info

一个 gzip 文件/流包含:

- a 10-byte header, containing a magic number, a version number and a time stamp
- optional extra headers, such as the original file name,
- a body, containing a DEFLATE-compressed payload
- an 8-byte footer, containing a CRC-32 checksum and the length of the original uncompressed data

【讨论】:

总结一下..你的意思是GZIP更兼容浏览器吗? GZip 将使浏览器能够检查错误,但不会放气 @peer 这是错误的,deflate 会使用 adler32 检查错误。 @Pacerier 你是对的,DEFLATE 有效负载由校验和检查。【参考方案2】:

另一个答案大多是错误的。 Content-Encoding HTTP 标头的“deflate”值是用词不当,实际上是指 ZLIB。鉴于此,两者都有校验和和相同的压缩内容。它们仅在页眉/页脚和使用的校验和方面有所不同。

gzip "deflate" (zlib)
Header size 10 bytes 2 bytes
Footer size 4 bytes 0
Checksum CRC32 Adler-32
Compression algorithm DEFLATE DEFLATE
Specification RFC1952 RFC1950

从历史上看,“deflate”是有问题的,因为早期的 Microsoft IIS 服务器会发送原始的 deflate 数据而不是 zlib 数据(请参阅 https://***.com/a/9186091/1218408)。为了解决这个问题,通常只使用 gzip。

Deflate 稍微快一点,因为 Adler-32 的计算速度通常比 CRC32 快,但大部分时间都花在实际压缩数据而不是计算校验和上。

【讨论】:

你不是说 adler-32 比 crc32 稍微快一点吗? 我认为您将 DEFLATE 与 ZLIB 混淆了。 ZLIB 是 RFC1950,您的参考,并且大部分与您的描述相符。 DEFLATE 是 RFC1951。 @PhilP 我没有。我使用了“deflate”这个词,因为这是 HTTP 规范中 Content-Encoding 标头的错误命名值。没错,它实际上是 ZLIB,这就是我与 Microsoft IIS 服务器讨论的问题。我编辑了答案以强调这一点。

以上是关于GZIP 与 DEFLATE 压缩相比有啥优势?的主要内容,如果未能解决你的问题,请参考以下文章

入驻企业 | 芯峰科技发布DEFLATE/GZIP压缩芯片IP,芯片设计进入高铁时代

使用 PHP ob_start() 与 Apache Deflate/Gzip 压缩内容?

无法启用压缩(deflate/gzip)

GZIP 与zip区别

选择 gzip 而不是 deflate 进行 http 压缩是不是会影响性能?

mod_deflate 与 mod_gzip