【问题标题】: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");
        }
    }

【问题讨论】:

标签: asp.net html optimization http-headers


【解决方案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://stackoverflow.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 服务器讨论的问题。我编辑了答案以强调这一点。
猜你喜欢
  • 2010-12-07
  • 2013-05-05
  • 2016-07-04
  • 2011-03-13
  • 1970-01-01
  • 1970-01-01
  • 2011-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多