为什么对Apache提供的文本文件使用deflate而不是gzip?


215

这两种方法对由LAMP服务器提供服务的html,css和javascript文件都具有什么优势。有更好的选择吗?

服务器使用Json向地图应用程序提供信息,因此大量的小文件。

另请参见选择gzip而不是deflate进行http压缩是否会对性能产生影响?


切换了已接受的答案...当前共识是对gzip的二比一
Ken

1
mod_deflate用于Apache 2,mod_gzip用于Apache 1.3。
SPRBRN

Answers:


315

为什么对Apache提供的文本文件使用deflate而不是gzip?

简单的答案是


RFC 2616将deflate定义为:

deflate RFC 1950中定义的“ zlib”格式与RFC 1951中描述的“ deflate”压缩机制结合使用

zlib格式在RFC 1950中定义为:

     0   1
     +---+---+
     |CMF|FLG|   (more-->)
     +---+---+

       0   1   2   3
     +---+---+---+---+
     |     DICTID    |   (more-->)
     +---+---+---+---+

     +=====================+---+---+---+---+
     |...compressed data...|    ADLER32    |
     +=====================+---+---+---+---+

因此,有几个标头和一个ADLER32校验和

RFC 2616将gzip定义为:

gzip由文件压缩程序“ gzip”(GNU zip)产生的编码格式,如RFC 1952 [25]中所述。此格式是具有32位CRC的Lempel-Ziv编码(LZ77)。

RFC 1952将压缩数据定义为:

该格式目前使用DEFLATE压缩方法,但可以轻松扩展为使用其他压缩方法。

CRC-32 比ADLER32慢

与相同长度的循环冗余校验相比,它以可靠性换取速度(优先选择后者)。

所以...我们有2种压缩机制,它们使用相同的算法进行压缩,但使用不同的头和校验和算法。

现在,底层的TCP数据包已经相当可靠了,所以这里的问题不是GZIP使用的Adler 32 vs CRC-32


事实证明,多年来许多浏览器都实施了不正确的放气算法。与其期望RFC 1950中没有zlib标头,他们只是期望压缩的有效载荷。同样,各种Web服务器也犯了相同的错误。

因此,多年来,浏览器开始实现模糊逻辑 deflate实现,他们尝试使用zlib标头和adler校验和,如果失败,则尝试使用有效负载。

这样的复杂逻辑的结果是它经常被破坏。Verve Studio有一个由用户提供的测试部分,用于显示情况有多严重。

例如:deflate在Safari 4.0中可用,但在Safari 5.1中已损坏,它在IE上也始终存在问题。


因此,最好的办法是完全避免放气,较小的速度提升(由于adler 32)不值得破坏有效载荷。


是否应该有将adler32与gzip结合在一起的新标准?
Pacerier

1
@Sam Saffron,这是否意味着如果Web浏览器不在图片中,我可以在gzip上使用deflate?例如,如果我要将压缩文件上传到我的FTP服务器。
Xegara '16

1
另一个非常小的区别是zlib包装器是6个字节,而gzip是18个字节。因此,对于非常小的数据包,发送少12个字节可能会有好处。但是结论并没有改变,这是由于Microsoft误解了IIS服务器上交付的内容“放气”,从而使每个人都陷入困境,因此使用gzip格式会更容易。
马克·阿德勒

但是,如果使用TCP传输有效负载,怎么可能破坏它呢?TCP的整个思想是传输不间断的有效负载。
user1095108 '18

这个答案的日期是2012年。那么,现代浏览器是否仍会因deflate算法的实现不正确而遭受苦难,还是现在可以安全使用它?答案的这一部分是否仍是最新的?
ihebiheb

172

GZip只是放气,加上校验和和页眉/页脚。不过,据所知,放气速度更快

gzip vs放气图


13
更不用说zlib不支持扩展了,即使支持,SSE 4.2中的CRC32指令也使用多项式1EDC6F41,而gzip格式使用了多项式EDB88320-有效地是完全不同的算法。
杰克·劳埃德

7
而且由于deflate更快,所以为什么要使用gzip?
大卫·默多克

40
好吧,这个答案原来是不正确的...请参阅:zoompf.com/blog/2012/02/lose-the-wait-http-compression ...特别是客户端有两种“解释”压缩,无标题的方式/ checksumless并带有zlib标头。在浏览器中正确放气的实现是不好的。应避免放气。
Sam Saffron'3

4
@sam另外,我只是重新运行基准测试,并且在现代Intel芯片上,我得到gzip 1441/692和deflate 1286/531。第二个数字是解压缩,第一个是压缩。所以放气仍然较快,做你的基准否则显示?(我同意,由于其他原因,它可能没有用,但答案是正确的,放气更快。)
Jeff Atwood 2012年

6
@JeffAtwood但问题不是更快吗?
肯(Ken)

16

您实际上可能无法选择deflate作为选项。与您可能期望的相反,mod_deflate不是使用deflate,而是使用gzip。因此,尽管大多数观点都是有效的,但对大多数人来说可能并不重要。


4

我认为deflate和gzip之间没有什么大的区别,因为gzip基本上只是包裹在deflate中的标头(请参阅RFC 1951和1952)。


3

主要原因是deflate的编码速度比gzip快,并且在繁忙的服务器上可能会有所作为。对于静态页面,这是一个不同的问题,因为它们可以轻松地进行一次预压缩。


大概是使用gzip,在获取,存储和压缩所有数据之前,您无法开始传输标头吗?(因为您需要校验和才能创建标头)
OJW 2009年

8
在gzip格式中,校验和位于文件的末尾,特别是使人们可以在处理过程中开始编写deflate块而不必承担所有麻烦。
杰克·劳埃德

2

mod_deflate需要较少的服务器资源,尽管就压缩量而言您可能会付出一点代价。

如果要提供许多小文件,建议您对压缩和未压缩的解决方案进行基准测试和负载测试-您可能会发现在某些情况下启用压缩不会节省成本。


对于想知道的人,使用deflate可以将我的文本文件从30KB扩展到10KB-因此文件必须比该文件还要小,以免产生任何节省。我猜不到1KB或类似的东西。
hextech

0

gzip和deflate的解压缩应该没有任何区别。Gzip压缩了几十个字节的标头,包括校验和。校验和是压缩速度较慢的原因。但是,当您预压缩大量文件时,您希望这些校验和作为文件系统中的完整性检查。另外,您可以利用命令行工具来获取文件的统计信息。对于我们的网站,我们正在预压缩大量静态数据(整个打开目录,13,000个游戏,数百万个关键字的自动完成等),并且Alexa的排名比所有网站都快95%。 传真搜索。但是,我们确实使用了本地专有的Web服务器。Apache / mod_deflate只是没有削减。将这些文件压缩到文件系统中后,您不仅会以最小的文件系统块大小来破坏文件,而且会在网络服务器可能不太在意的文件系统中管理文件时产生所有不必要的开销。您需要考虑的是磁盘总空间和访问/解压缩时间,其次要是能够对这些数据进行预压缩。占用空间很重要,因为即使磁盘空间很便宜,您也要尽可能多地放入缓存中。


GZip可能会检查解压缩时的校验和,因此会降低解压缩的速度差异。
Seun Osewa 09年

-1

在已安装Apache2并且已安装deflate模块的Ubuntu(默认情况下)上,您可以通过两个简单的步骤启用deflate gzip压缩:

a2enmod deflate
/etc/init.d/apache2 force-reload

而你走了!我发现通过我的adsl连接投放的网页加载速度更快。

编辑:根据@GertvandenBerg的评论,这将启用gzip压缩,而不是缩小。


6
除了启用gzip之外,因为mod_deflate只能混淆地实现gzip压缩...
Gert van den Berg 2014年

@GertvandenBerg我已经更新了我的答案,但备案,gzip的放气,只是额外的头和校验
艾丹

@aiden yep,但是校验和对性能有影响...(而且原始放气不符合标准)
Gert van den Berg

-4

如果我没记错的话

  • gzip将压缩比压缩更多
  • 放气更有效

2
gzip是带有标头的deflate。HTTP 1.1 deflate实际上是zlib(这也是deflate的包装)
David Murdoch
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.