小编典典

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

all

对于 LAMP 服务器提供的 html、css 和 javascript 文件,这两种方法都有哪些优势。有更好的选择吗?

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


阅读 69

收藏
2022-06-20

共1个答案

小编典典

为什么对 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
标头,而是期望压缩的有效负载。同样,各种网络服务器也犯了同样的错误。

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

具有这样复杂逻辑的结果是它经常被破坏。Verve Studio
有一个用户贡献的测试部分,显示情况有多糟糕。

例如:deflate 在 Safari 4.0 中工作,但在 Safari 5.1 中被破坏,它在 IE 上也总是有问题。


所以,最好的办法是完全避免放气,轻微的速度提升(由于 adler 32)不值得冒有效载荷损坏的风险。

2022-06-20