原文链接:How are zlib, gzip and zip related? What do they have in common and how are they different?
译者注:水平有限,翻译不好的地方请指出。
译文
.zip
是一种归档格式,通常使用 Deflate 压缩方法。.gz
gzip 格式适用于单个文件,也使用 Deflate 压缩方法。通常 gzip 与 tar 结合使用,以制作压缩的归档格式 .tar.gz
。zlib 库提供 Deflate 压缩和解压缩代码供 zip、gzip、png(对 deflate 数据使用 zlib 包装器)和许多其他应用程序使用。
详细版:
ZIP 格式由 Phil Katz 开发为具有开放规范的开放格式,他的实现 PKZIP 是共享软件。它是一种归档格式,用于存储文件及其目录结构,其中每个文件都单独压缩。文件类型为 .zip
。可以选择对文件以及目录结构进行加密。
ZIP 格式支持多种压缩方法:
0 - The file is stored (no compression)
1 - The file is Shrunk
2 - The file is Reduced with compression factor 1
3 - The file is Reduced with compression factor 2
4 - The file is Reduced with compression factor 3
5 - The file is Reduced with compression factor 4
6 - The file is Imploded
7 - Reserved for Tokenizing compression algorithm
8 - The file is Deflated
9 - Enhanced Deflating using Deflate64(tm)
10 - PKWARE Data Compression Library Imploding (old IBM TERSE)
11 - Reserved by PKWARE
12 - File is compressed using BZIP2 algorithm
13 - Reserved by PKWARE
14 - LZMA
15 - Reserved by PKWARE
16 - IBM z/OS CMPSC Compression
17 - Reserved by PKWARE
18 - File is compressed using IBM TERSE (new)
19 - IBM LZ77 z Architecture
20 - deprecated (use method 93 for zstd)
93 - Zstandard (zstd) Compression
94 - MP3 Compression
95 - XZ Compression
96 - JPEG variant
97 - WavPack compressed data
98 - PPMd version I, Rev 1
99 - AE-x encryption marker (see APPENDIX E)
方法 1 到 7 是历史方法,未使用。方法 9 到 98 是相对较新增加的方法,使用量不一。在 ZIP 格式中真正广泛使用的唯一方法是方法 8,Deflate,而且在较小程度上,方法 0,它根本不是压缩。实际上,您遇到的每个 .zip
文件都将仅使用方法 8 和 0,可能只是方法 8。(方法 8 也有一种方法可以在没有压缩和相对较小的扩展的情况下有效地存储数据,并且方法 0 不能流式传输,而方法 8 可以。)
文件容器的 ISO/IEC 21320-1:2015 标准是一种受限制的 zip 格式,例如用于 Java 归档文件 (.jar)、Office Open XML 文件(Microsoft Office .docx、.xlsx、.pptx)、Office 文档格式文件(.odt、.ods、.odp)和 EPUB 文件 (.epub)。该标准将压缩方法限制为 0 和 8,以及其他约束,例如无加密或签名。
1990 年左右,Info-ZIP 小组编写了 zip
和 unzip
的可移植、免费、开源实用程序,支持使用 Deflate 格式进行压缩,以及该格式和早期格式的解压缩。这极大地扩大了 .zip
格式的使用。
在 90 年代初期,gzip 格式被开发为 Unix compress 实用程序的替代品,该实用程序源自 Info-ZIP 实用程序中的 Deflate 代码。Unix compress
旨在压缩单个文件或流,并在文件名后上附加 .Z
。compress
使用 LZW 压缩算法,该算法当时已获得专利,其免费使用存在专利持有人的争议。尽管 Deflate 的一些特定实现由 Phil Katz 申请了专利,但格式不是,因此可以编写不侵犯任何专利的 Deflate 实现。在过去的 20+ 年里,Deflate 实现从未受到过如此大的挑战。Unix gzip
实用程序旨在作为 compress
的直接替代品,实际上能够解压缩由compress
压缩的数据(假设您能够解析该句子)。gzip
会在文件名后附加一个 .gz
。gzip
使用 Deflate 压缩数据格式,该格式的压缩效果比 Unix compress
好得多,解压缩速度非常快,并添加了 CRC-32 作为数据的完整性检查。文件头的格式还允许存储比 compress
格式更多的信息,例如原始文件名和文件修改时间。
虽然 compress
只压缩单个文件,但通常使用 tar
实用程序将多个文件、其属性和目录结构的存档创建为单个 .tar
文件,然后使用 compress
对其进行压缩以创建 .tar.Z
文件。事实上,tar
实用程序曾经并且仍然可以选择同时进行压缩,而不必通过管道将 tar
的输出给到 compress
。这一切都延续到了 gzip 格式,并且 tar
有一个选项可以选择直接压缩为 .tar.gz
格式。tar.gz
格式的压缩效果优于 .zip
方法,因为 .tar
的压缩可以利用文件之间的冗余,尤其是许多小文件。.tar.gz
是 Unix 上最常用的归档格式,因为它具有非常高的可移植性,但也有更有效的压缩方法也在使用,因此您经常会看到 .tar.bz2
和 .tar.xz
归档文件。
与 .tar
不同,.zip
末尾有一个中央目录,该目录提供内容列表。该压缩和单独的压缩提供了对 .zip
文件中各个条目的随机访问。必须将 .tar
文件解压缩和从头到尾扫描,才能构建目录,这就是 .tar
文件的列出方式。
在 gzip 推出后不久,大约在 1990 年代中期,同样的专利纠纷对免费使用 .gif
图像格式提出了质疑,该格式在 Bulletin Board(BBS) 和万维网中非常广泛使用(在当时是新事物)。因此,一个小组创建了文件类型为 .png
的 PNG 无损压缩图像格式来取代 .gif
。该格式还使用 Deflate 格式进行压缩,该格式在图像数据的过滤器暴露更多冗余后应用。为了促进 PNG 格式的广泛使用,创建了两个免费的代码库—— libpng 和 zlib。libpng 处理 PNG 格式的所有功能特性,zlib 提供压缩和解压缩代码供 libpng 以及其他应用程序使用。zlib 改编自 gzip
代码。
所有提到的专利都已过期。
zlib 库支持 Deflate 压缩和解压缩,以及三种 deflate 流的封装方式。这些是完全没封装(“raw” deflate,即原始 deflate 数据流)、zlib 封装(用于 PNG 格式数据块)和 gzip 封装(以便为程序员提供给 gzip routines)。zlib 和 gzip 封装之间的主要区别在于 zlib 封装更紧凑,只需要 6 个字节,而 gzip 最少为 18 个字节,并且完整性检查 zlib 的 Adler-32 的运行速度比 gzip 使用的 CRC-32 更快。Raw deflate 被用于读取和写入 .zip
格式的程序,这是另一种封装 deflate 压缩数据的格式。
zlib 现在广泛用于数据传输和存储。例如,服务器和浏览器的大多数 HTTP 事务都使用 zlib 压缩和解压缩数据,特别是 HTTP 头部 Content-Encoding: deflate
表示封装在 zlib 数据格式内的 deflate 压缩方法。
对于相同的输入数据,deflate 的不同实现会导致不同的压缩输出,可选的压缩级别就证明了这一点,这些级别允许在压缩效果与 CPU 时间之间进行权衡。zlib 和 PKZIP 并不是 deflate 压缩和解压缩的唯一实现。7-Zip 归档实用程序和 Google 的 zopfli 库都能够使用比 zlib 多得多的 CPU 时间,以便在使用 deflate 格式时挤出最后几比特的可能性,与 zlib 的最高压缩级别相比,压缩大小减少了几个百分点。pigz 实用程序是 gzip 的并行实现,包括使用 zlib(压缩级别 1-9)或 zopfli(压缩级别 11)的选项,并通过将大文件的压缩拆分到多个处理器和内核上,在一定程度上减轻了使用 zopfli 的时间影响。
补充
Bulletin Board System (BBS) :互联网电子公告牌。早期互联网的一种形式,用户通过拨号连接到主机服务器进行通信、发布和获取信息。BBS 在 20 世纪 80 年代和 90 年代非常流行,是当时人们交流、分享文件和玩游戏的主要方式之一。每个 BBS 通常由个人或小团体维护,用户需要通过电话线拨号连接。(可以理解为早期的论坛)