GZIP相对于DEFLATE压缩有什么优势?

54

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

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

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

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

假设我所读的是真的,在这种情况下我错过了使用GZIP的优势。因此,我怀疑应该有一个很好的理由选择GZIP而不是DEFLATE。

我的问题:

  • GZIP是否具有我不知道的任何优势?
  • 为什么主要搜索引擎使用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");
        }
    }

请参见https://dev59.com/zXRC5IYBdhLWcg3wK9yV。 - Sebastian Paaske Tørholm
感谢Paul的修订。 - GibboK
除了这个答案:https://dev59.com/zXRC5IYBdhLWcg3wK9yV#9856879,其他所有答案都是错误/不完整的。 - Pacerier
2个回答

54

Gzip比较可靠,因为它是deflate加上一些头部和校验和。换句话说,gzip就是deflate再加上额外的头部和校验和。Deflate使用adler32进行检查,这也是gzip的一部分。因为gzip的有效负载是DEFLATE压缩的有效负载。

Deflate信息

Gzip信息

一个 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更兼容浏览器? - GibboK
4
GZip 可以使浏览器检查错误,而 deflate 则不能。 - Peter
8
这是错误的,deflate会使用adler32检查错误。 - Pacerier
3
@Pacerier 你是对的,DEFLATE负载通过校验和进行检查。 - Peter

24
另一个答案大部分是错误的。在HTTP头中,Content-Encoding的值为“deflate”实际上指的是ZLIB,这是一个使用错名的术语。因此,两者都具有校验和和相同的压缩内容。它们只有在头/尾文件以及所使用的校验和方面存在差异。
gzip "deflate" (zlib)
头大小 10字节 2字节
尾大小 4字节 0
校验和 CRC32 Adler-32
压缩算法 DEFLATE DEFLATE
规范 RFC1952 RFC1950
历史上,“deflate”存在问题,因为早期的Microsoft IIS服务器会发送原始的deflate数据而不是zlib数据(参见https://dev59.com/t2ox5IYBdhLWcg3wf0Xl#9186091)。为了解决这个问题,通常使用gzip。
Adler-32计算速度通常比CRC32快一点,因此Deflate略微更快,但大部分时间都花费在实际压缩数据上,而不是计算校验和。

你是不是想说 Adler-32 比 CRC32 稍微快一点? - david_adler
1
我认为你把DEFLATE和ZLIB搞混了。ZLIB是RFC1950,也是你提到的参考文献,大部分符合你的描述。而DEFLATE则是RFC1951。 - Phil P
1
@PhilP 我没有这样做。我使用“deflate”这个词,因为它是HTTP规范中“Content-Encoding”标头的糟糕命名值。你说得对,它实际上是ZLIB,这就是我与Microsoft IIS服务器讨论的问题所在。我编辑了答案来强调这一点。 - ZachB

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