我在asp.NET 4(C#)中有一个网站。
我正在努力寻找一种更好地优化网站带宽的方法。
我读了很多文章说DEFLATE比GZIP更快更小,因为GZIP(基于DEFLATE)增加了一些额外的数据。
检查bing.com和google.com的标题,似乎他们都发送了GZIP编码的数据。
假设我读到的是真的,我在这种情况下错过了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");
}
}
答案 0 :(得分:24)
Gzip更可靠,因为它是deflate加上一些标题和一个校验和。换句话说,gzip是deflate,额外的标头和校验和。使用adler32检查Deflate,adler32也是gzip的一部分。因为gzip有效负载是DEFLATE压缩的有效负载。
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)
另一个答案大多是错误的。两者都有校验和和相同的压缩内容。它们仅在页眉/页脚和使用的校验和上有所不同。
从历史上看,“放气”是有问题的,因为早期的 Microsoft IIS 服务器会发送原始放气数据而不是 zlib 数据(请参阅 https://stackoverflow.com/a/9186091/1218408)。为了解决这个问题,通常只使用 gzip。
Deflate 的速度非常快,因为 CRC32 通常比 Adler-32 的计算速度更快,但大部分时间都花在了实际压缩数据上,而不是计算校验和上。