GZIP与DEFLATE压缩的优势是什么?

时间:2011-08-30 13:13:27

标签: asp.net html optimization http-headers

我在asp.NET 4(C#)中有一个网站。

我正在努力寻找一种更好地优化网站带宽的方法。

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

检查bing.com和google.com的标题,似乎他们都发送了GZIP编码的数据。

假设我读到的是真的,我在这种情况下错过了GZIP的优势。所以我怀疑应该有一个很好的理由来选择GZIP来解决。

我的问题:

  • 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");
        }
    }

2 个答案:

答案 0 :(得分:24)

Gzip更可靠,因为它是deflate加上一些标题和一个校验和。换句话说,gzip是deflate,额外的标头和校验和。使用adler32检查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

答案 1 :(得分:0)

另一个答案大多是错误的。两者都有校验和和相同的压缩内容。它们仅在页眉/页脚和使用的校验和上有所不同。

<头>
gzip 放气
标题大小 10 字节 2 字节
页脚大小 4 字节 0
校验和 CRC32 阿德勒-32
压缩算法 放气 放气
规格 RFC1952 RFC1950

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

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