Làm thế nào là zlib, gzip và zip liên quan? Họ có điểm gì chung và họ khác nhau như thế nào?


948

Thuật toán nén được sử dụng trong zlib về cơ bản giống như trong thuật toán gzipzip . Là gì gzipzip ? Chúng khác nhau như thế nào và chúng giống nhau như thế nào?

Câu trả lời:


2476

Hình thức ngắn:

.ziplà một định dạng lưu trữ bằng cách sử dụng, thông thường, phương pháp nén Deflate . Các .gzđịnh dạng gzip là cho các tập tin duy nhất, cũng sử dụng phương pháp nén Deflate. Thông thường gzip được sử dụng kết hợp với tar để tạo định dạng lưu trữ nén , .tar.gz. Các thư viện zlib cung cấp Deflate nén và giải nén mã cho sử dụng bởi zip, gzip, png (trong đó sử dụng các wrapper zlib trên dữ liệu deflate), và nhiều ứng dụng khác.

Hình thức dài:

Các định dạng ZIP được phát triển bởi Phil Katz là một định dạng mở với một đặc điểm kỹ thuật mở, nơi thực hiện của mình, PKZIP, là phần mềm chia sẻ. Nó là một định dạng lưu trữ lưu trữ các tệp và cấu trúc thư mục của chúng, trong đó mỗi tệp được nén riêng lẻ. Loại tập tin là .zip. Các tập tin, cũng như cấu trúc thư mục, có thể tùy chọn được mã hóa.

Định dạng ZIP hỗ trợ một số phương thức nén:

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 (EFS)
15 - Reserved by PKWARE
16 - Reserved by PKWARE
17 - Reserved by PKWARE
18 - File is compressed using IBM TERSE (new)
19 - IBM LZ77 z Architecture (PFS)
97 - WavPack compressed data
98 - PPMd version I, Rev 1

Phương pháp 1 đến 7 là lịch sử và không được sử dụng. Phương pháp 9 đến 98 là những bổ sung tương đối gần đây và với số lượng nhỏ sử dụng khác nhau. Phương pháp duy nhất trong việc sử dụng thực sự rộng rãi ở định dạng ZIP là phương thức 8, Deflate và ở một mức độ nhỏ hơn là phương thức 0, hoàn toàn không nén. Hầu như mọi .ziptệp mà bạn gặp phải trong tự nhiên sẽ chỉ sử dụng các phương thức 8 và 0, có thể chỉ là phương thức 8. (Phương thức 8 cũng có một phương tiện để lưu trữ dữ liệu một cách hiệu quả mà không cần nén và mở rộng tương đối, và Phương thức 0 không thể được truyền phát trong khi Phương thức 8 có thể.)

Các tiêu chuẩn ISO / IEC 21.320-1: 2015 tiêu chuẩn cho container tập tin là một định dạng zip hạn chế, chẳng hạn như sử dụng trong Java lưu trữ file (.jar), các file Office Open XML (Microsoft Office .docx, .xlsx, .pptx), Office Document Định dạng tệp (.odt, .ods, .odp) và tệp EPUB (.epub). Tiêu chuẩn đó giới hạn các phương thức nén thành 0 và 8, cũng như các ràng buộc khác như không mã hóa hoặc chữ ký.

Khoảng năm 1990, nhóm Info-ZIP đã viết các triển khai zipunziptiện ích nguồn mở, miễn phí, di động , hỗ trợ nén với định dạng Deflate và giải nén các định dạng đó và các định dạng trước đó. Điều này mở rộng đáng kể việc sử dụng .zipđịnh dạng.

Vào đầu những năm 90, định dạng gzip đã được phát triển để thay thế cho tiện ích Unixcompress , xuất phát từ mã Deflate trong các tiện ích Info-ZIP. Unix compressđược thiết kế để nén một tệp hoặc luồng, gắn thêm .Ztên tệp. compresssử dụng thuật toán nén LZW , vào thời điểm đó là bằng sáng chế và việc sử dụng miễn phí đã bị tranh chấp bởi các chủ sở hữu bằng sáng chế. Mặc dù một số triển khai cụ thể của Deflate đã được Phil Katz cấp bằng sáng chế, nhưng định dạng này thì không, và do đó, có thể viết một triển khai Deflate không vi phạm bất kỳ bằng sáng chế nào. Việc thực hiện đó đã không bị thách thức như vậy trong hơn 20 năm qua. gzipTiện ích Unix được dự định là một sự thay thế thả vào chocompressvà trên thực tế có thể giải compressnén dữ liệu được nén (giả sử rằng bạn có thể phân tích câu đó). gzipnối thêm một .gztên tập tin. gzipsử dụng định dạng dữ liệu nén Deflate, nén tốt hơn một chút so với Unix compress, có khả năng giải nén rất nhanh và thêm CRC-32 làm kiểm tra tính toàn vẹn cho dữ liệu. Định dạng tiêu đề cũng cho phép lưu trữ nhiều thông tin hơn compressđịnh dạng cho phép, chẳng hạn như tên tệp gốc và thời gian sửa đổi tệp.

Mặc dù compresschỉ nén một tệp duy nhất, nhưng thông thường sử dụng tartiện ích để tạo tệp lưu trữ tệp, thuộc tính và cấu trúc thư mục của chúng thành một .tartệp duy nhất và sau đó nén tệp đó compressđể tạo .tar.Ztệp. Trong thực tế, tartiện ích đã và vẫn còn có một tùy chọn để thực hiện nén cùng lúc, thay vì phải ống đầu ra của tarđể compress. Tất cả điều này được chuyển sang định dạng gzip và tarcó tùy chọn nén trực tiếp sang .tar.gzđịnh dạng. Các tar.gzđịnh dạng nén tốt hơn so với .zipcách tiếp cận, kể từ khi nén của một .tarthể tận dụng dư thừa trên các tập tin, đặc biệt là nhiều tập tin nhỏ. .tar.gzlà định dạng lưu trữ phổ biến nhất được sử dụng trên Unix do tính di động rất cao, nhưng cũng có các phương pháp nén hiệu quả hơn, vì vậy bạn sẽ thường thấy .tar.bz2.tar.xzlưu trữ.

Không giống như .tar, .zipcó một thư mục trung tâm ở cuối, cung cấp một danh sách các nội dung. Điều đó và nén riêng biệt cung cấp quyền truy cập ngẫu nhiên vào các mục riêng lẻ trong một .ziptệp. Một .tartệp sẽ phải được giải nén và quét từ đầu đến cuối để xây dựng một thư mục, đó là cách một .tartệp được liệt kê.

Ngay sau khi giới thiệu gzip, vào khoảng giữa những năm 1990, tranh chấp bằng sáng chế tương tự đã đặt ra câu hỏi về việc sử dụng .gifđịnh dạng hình ảnh miễn phí , được sử dụng rất rộng rãi trên bảng tin và World Wide Web (một điều mới vào thời điểm đó). Vì vậy, một nhóm nhỏ đã tạo định dạng hình ảnh nén không mất PNG, với loại tệp .png, để thay thế .gif. Định dạng đó cũng sử dụng định dạng Deflate để nén, được áp dụng sau khi các bộ lọc trên dữ liệu hình ảnh lộ ra nhiều sự dư thừa. Để thúc đẩy sử dụng rộng rãi định dạng PNG, hai thư viện mã miễn phí đã được tạo. libpngzlib. libpng đã xử lý tất cả các tính năng của định dạng PNG và zlib đã cung cấp mã nén và giải nén để libpng sử dụng, cũng như cho các ứng dụng khác. zlib đã được điều chỉnh từ gzipmã.

Tất cả các bằng sáng chế được đề cập đã hết hạn.

Thư viện zlib hỗ trợ nén và giải nén Deflate, và ba loại gói xung quanh các luồng phát tán. Đó là: không có gói nào cả (khử "thô"), gói zlib , được sử dụng trong các khối dữ liệu định dạng PNG và gói gzip, để cung cấp các thường trình gzip cho lập trình viên. Sự khác biệt chính giữa gói zlib và gzip là gói zlib nhỏ gọn hơn, sáu byte so với tối thiểu 18 byte cho gzip và kiểm tra tính toàn vẹn, Adler-32, chạy nhanh hơn CRC-32 mà gzip sử dụng. Định dạng thô được sử dụng bởi các chương trình đọc và ghi .zipđịnh dạng, đây là định dạng khác bao quanh dữ liệu nén.

zlib hiện đang được sử dụng rộng rãi để truyền và lưu trữ dữ liệu. Ví dụ: hầu hết các giao dịch HTTP của máy chủ và trình duyệt đều nén và giải nén dữ liệu bằng zlib, cụ thể tiêu đề HTTP Content-Encoding: deflatecó nghĩa là phương pháp nén khử băng được bọc bên trong định dạng dữ liệu zlib .

Việc triển khai giảm phát khác nhau có thể dẫn đến đầu ra nén khác nhau cho cùng một dữ liệu đầu vào, bằng chứng là sự tồn tại của các mức nén có thể lựa chọn cho phép đánh đổi hiệu quả nén trong thời gian CPU. zlib và PKZIP không phải là triển khai duy nhất của nén và giải nén. Cả tiện ích lưu trữ 7-Zipthư viện zopfli của Google đều có khả năng sử dụng thời gian CPU nhiều hơn zlib để vắt kiệt vài bit cuối cùng có thể khi sử dụng định dạng khử, giảm kích thước nén xuống vài phần trăm so với mức cao nhất của zlib mức nén. Các tiện ích pigz, một triển khai song song của gzip, bao gồm tùy chọn sử dụng zlib (mức nén 1-9) hoặc zopfli (mức nén 11) và phần nào giảm thiểu tác động thời gian của việc sử dụng zopfli bằng cách chia nén các tệp lớn trên nhiều bộ xử lý và lõi.


113
Bài đăng này được đóng gói với rất nhiều lịch sử và thông tin mà tôi cảm thấy như một số trích dẫn cần được thêm vào trong khi mọi người cố gắng tham khảo bài đăng này như một nguồn thông tin. Mặc dù nếu thông tin này được phản ánh ở đâu đó với các trích dẫn như Wikipedia, một liên kết đến tác phẩm được trích dẫn tương tự như vậy sẽ được đánh giá cao.
ThorSummoner

1348
Tôi là tài liệu tham khảo, đã là một phần của tất cả điều đó. Bài đăng này có thể được trích dẫn trong Wikipedia như là một nguồn ban đầu.
Đánh dấu Adler

524
FYI: Mark Adler là một kỹ sư phần mềm người Mỹ và đã tham gia rất nhiều vào việc thám hiểm không gian. Ông nổi tiếng với công việc của mình trong lĩnh vực nén dữ liệu với tư cách là tác giả của chức năng tổng kiểm tra Adler-32 và là đồng tác giả của thư viện nén zlib và gzip. Ông đã đóng góp cho Info-ZIP và đã tham gia phát triển định dạng hình ảnh Đồ họa mạng di động (PNG). Adler cũng là Giám đốc Sứ mệnh của Cruise Cruise cho nhiệm vụ Mars Explective Rover. (wikipedia)
Isaac Hanson

99
gzip đã được tạo để thay thế nén Unix. zip không vượt trội so với tar + gzip trên Unix, vì nhiều lý do. (Khi bạn thấy .tar.gzcác tệp, đó là những gì chúng là.) Đầu tiên, tar + gzip nén tốt hơn zip, vì việc nén tệp tiếp theo có thể sử dụng lịch sử từ tệp trước đó (đôi khi được gọi là lưu trữ "solid"). zip chỉ có thể nén các tập tin cá nhân. Thứ hai, tar bảo toàn tất cả thông tin thư mục Unix, trong khi zip không được thiết kế để làm điều đó. (Các tiện ích mở rộng sau này sang định dạng zip với các khối bổ sung dành riêng cho Unix cố gắng khắc phục sự cố này.)
Mark Adler

85
Bạn có vẻ khó hiểu định dạng với việc thực hiện. Việc triển khai 7-Zip của định dạng khử rung có thể nhận được một cái gì đó giống như nén của bạn được trích dẫn tốt hơn 2% đến 10% so với gzip với định dạng giảm phát rất giống nhau (trong khi mất nhiều thời gian CPU hơn để làm như vậy). Định dạng 7z LZMA2 cung cấp khả năng nén tốt hơn 40%.
Đánh dấu Adler

43

ZIP là một định dạng tệp được sử dụng để lưu trữ một số lượng tệp và thư mục tùy ý cùng với nén không mất dữ liệu. Nó không đưa ra các giả định nghiêm ngặt về các phương thức nén được sử dụng, nhưng thường được sử dụng nhất với DEFLATE .

Gzip vừa là thuật toán nén dựa trên DEFLATE nhưng ít bị vướng mắc với các bằng sáng chế tiềm năng et al và định dạng tệp để lưu trữ một tệp nén. Nó hỗ trợ nén một số lượng tệp và thư mục tùy ý khi kết hợp với tar . Tệp kết quả có phần mở rộng là .tgzhoặc .tar.gzvà thường được gọi là tarball .

zlib là một thư viện các hàm đóng gói DEFLATE trong phiên bản LZ77 phổ biến nhất của nó .


28

Sự khác biệt quan trọng nhất là gzip chỉ có khả năng nén một tệp trong khi zip nén nhiều tệp một và lưu trữ chúng thành một tệp duy nhất sau đó. Do đó, gzip đi kèm với tar hầu hết thời gian (mặc dù có những khả năng khác). Điều này đi kèm với một số lợi thế (dis).

Nếu bạn có một kho lưu trữ lớn và bạn chỉ cần một tệp duy nhất trong số đó, bạn phải giải nén toàn bộ tệp gzip để đến tệp đó. Điều này là không bắt buộc nếu bạn có một tệp zip.

Mặt khác, nếu bạn nén 10 tệp tương tự hoặc thậm chí giống hệt nhau, kho lưu trữ zip sẽ lớn hơn nhiều vì mỗi tệp được nén riêng lẻ, trong khi trong gzip kết hợp với tar, một tệp duy nhất được nén sẽ hiệu quả hơn nhiều nếu các tệp được tương tự (bằng nhau).


8
Bạn đang nói quá. Nếu mọi người muốn lưu trữ nén truy cập ngẫu nhiên, họ có thể tạo tệp ".gz.tar" thay vì tệp ".tar.gz". Họ không, bởi vì hầu hết mọi người không quan tâm đến việc truy cập ngẫu nhiên. Có một cộng đồng lớn xung quanh định dạng lưu trữ web .warc.gz và họ cần truy cập ngẫu nhiên, vì vậy họ nén riêng từng trang web. Bạn sử dụng định dạng này mỗi khi bạn nhìn vào một trang web trong Internet Way Wayback Machine.
Greg Lindahl

2
".Gz.tar" không cung cấp quyền truy cập ngẫu nhiên vì định dạng tar không có khả năng truy cập ngẫu nhiên các mục nhập của nó. Bạn cần phải đi qua tất cả các mục từ đầu để có được một mục cụ thể muốn, thậm chí tệ hơn: bạn cần phải đi qua tất cả các mục cho đến khi kết thúc vì cùng một tệp có thể được lưu trữ nhiều lần (trong một số phiên bản) ở một số nơi trong cùng một kho lưu trữ - và không có cách nào để tìm ra nó ngoại trừ việc đọc toàn bộ mục lưu trữ theo mục nhập.
Pipefeet Min-Soo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.