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 压缩内容?