Como estão relacionados o zlib, o gzip e o zip? O que eles têm em comum e como são diferentes?

948

O algoritmo de compactação usado no zlib é essencialmente o mesmo que o gzip e zip . O que são gzip e zip ? Como eles são diferentes e como são os mesmos?

Abhishek Jain
fonte

Respostas:

2476

Forma curta:

.zipé um formato de arquivamento usando, geralmente, o método de compactação Deflate . O .gzformato gzip é para arquivos únicos, também usando o método de compactação Deflate. Muitas vezes gzip é usado em combinação com tar para fazer um formato de arquivo comprimido , .tar.gz. A biblioteca zlib fornece o código de compactação e descompactação do Deflate para uso por zip, gzip, png (que usa o wrapper zlib para desinflar os dados) e muitos outros aplicativos.

Forma longa:

O formato ZIP foi desenvolvido por Phil Katz como um formato aberto com uma especificação aberta, onde sua implementação, PKZIP, era shareware. É um formato de arquivo que armazena arquivos e sua estrutura de diretórios, onde cada arquivo é compactado individualmente. O tipo de arquivo é .zip. Os arquivos, bem como a estrutura de diretórios, podem opcionalmente ser criptografados.

O formato ZIP suporta vários métodos de compactação:

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

Os métodos 1 a 7 são históricos e não estão em uso. Os métodos 9 a 98 são adições relativamente recentes e estão em pequenas quantidades variadas de uso. O único método amplamente utilizado no formato ZIP é o método 8, Deflate , e em menor medida o método 0, que não é compactação. Praticamente todos os .ziparquivos que você encontrará no ambiente selvagem usarão exclusivamente os métodos 8 e 0, provavelmente apenas o método 8. (O método 8 também possui um meio de armazenar efetivamente os dados sem compactação e relativamente pouca expansão, e o método 0 não pode ser transmitido em fluxo contínuo considerando que o método 8 pode ser.)

O padrão ISO / IEC 21320-1: 2015 para contêineres de arquivos é um formato zip restrito, como usado em arquivos Java (.jar), arquivos Office Open XML (Microsoft Office .docx, .xlsx, .pptx), Documento do Office Formate arquivos (.odt, .ods, .odp) e arquivos EPUB (.epub). Esse padrão limita os métodos de compactação a 0 e 8, além de outras restrições, como nenhuma criptografia ou assinaturas.

Por volta de 1990, o grupo Info-ZIP criou implementações zipe unziputilitários portáteis, gratuitos e de código aberto , suportando a compactação com o formato Deflate e a descompactação desse e dos formatos anteriores. Isso expandiu bastante o uso do .zipformato.

No início dos anos 90, o formato gzip foi desenvolvido como um substituto para o utilitário Unixcompress , derivado do código Deflate nos utilitários Info-ZIP. O Unix compressfoi projetado para compactar um único arquivo ou fluxo, acrescentando um .Zao nome do arquivo. compressusa o algoritmo de compactação LZW , que estava sob patente e seu uso gratuito estava em disputa pelos detentores de patentes. Embora algumas implementações específicas do Deflate tenham sido patenteadas por Phil Katz, o formato não era e, portanto, foi possível escrever uma implementação do Deflate que não viola nenhuma patente. Essa implementação não foi tão contestada nos últimos 20 anos. O gziputilitário Unix foi concebido como um substituto para ocompresse, de fato, é capaz de descompactar compressdados compactados (supondo que você tenha conseguido analisar essa frase). gzipanexa .gza ao nome do arquivo. gzipusa o formato de dados compactados Deflate, que compacta um pouco melhor que o Unix compress, possui descompressão muito rápida e adiciona um CRC-32 como verificação de integridade dos dados. O formato do cabeçalho também permite o armazenamento de mais informações do que o compressformato permitido, como o nome do arquivo original e a hora da modificação do arquivo.

Embora compressapenas comprima um único arquivo, era comum usar o tarutilitário para criar um archive de arquivos, seus atributos e sua estrutura de diretórios em um único .tararquivo e compactá-lo compresspara criar um .tar.Zarquivo. De fato, o tarutilitário tinha e ainda tem uma opção para fazer a compactação ao mesmo tempo, em vez de canalizar a saída de tarpara compress. Isso tudo foi transferido para o formato gzip e tartem uma opção para compactar diretamente no .tar.gzformato. O tar.gzformato compacta melhor que a .zipabordagem, pois a compactação de um .tarpode tirar proveito da redundância entre arquivos, especialmente muitos arquivos pequenos. .tar.gzé o formato de arquivo mais comum em uso no Unix devido à sua portabilidade muito alta, mas também existem métodos de compactação mais eficazes, portanto você verá .tar.bz2e .tar.xzarquivará frequentemente .

Ao contrário .tar, .zippossui um diretório central no final, que fornece uma lista do conteúdo. Isso e a compactação separada fornecem acesso aleatório às entradas individuais em um .ziparquivo. Um .tararquivo precisaria ser descompactado e verificado do começo ao fim para criar um diretório, e é assim que um .tararquivo é listado.

Logo após a introdução do gzip, em meados da década de 90, a mesma disputa de patentes questionou o uso gratuito do .gifformato de imagem, amplamente utilizado em quadros de avisos e na World Wide Web (algo novo na época). Portanto, um pequeno grupo criou o formato de imagem compactado sem perdas PNG, com o tipo de arquivo .png, para substituir .gif. Esse formato também usa o formato Deflate para compactação, que é aplicado após os filtros nos dados da imagem exporem mais redundância. Para promover o uso generalizado do formato PNG, foram criadas duas bibliotecas de códigos gratuitas. libpng e zlib. A libpng tratou de todos os recursos do formato PNG e o zlib forneceu o código de compactação e descompactação para uso pela libpng, bem como para outros aplicativos. O zlib foi adaptado do gzipcódigo.

Todas as patentes mencionadas expiraram desde então.

A biblioteca zlib suporta a compactação e descompactação Deflate e três tipos de agrupamento em torno dos fluxos de deflate. São eles: nenhum empacotamento (deflate "bruto"), empacotamento zlib , usado nos blocos de dados no formato PNG e empacotamento gzip, para fornecer rotinas gzip para o programador. A principal diferença entre o zlib e o gzip wrapping é que o zlib wrapping é mais compacto, seis bytes vs. um mínimo de 18 bytes para o gzip, e a verificação de integridade Adler-32 é executada mais rapidamente que o CRC-32 que o gzip usa. A desinflação bruta é usada por programas que lêem e gravam o .zipformato, que é outro formato que envolve a desinfecção de dados compactados.

O zlib agora é amplamente utilizado para transmissão e armazenamento de dados. Por exemplo, a maioria das transações HTTP de servidores e navegadores comprime e descompacta os dados usando o zlib, especificamente o cabeçalho HTTP Content-Encoding: deflatesignifica desinflar o método de compactação envolvido dentro do formato de dados do zlib .

Diferentes implementações de desinflar podem resultar em diferentes saídas compactadas para os mesmos dados de entrada, conforme evidenciado pela existência de níveis de compactação selecionáveis ​​que permitem negociar a eficácia da compactação pelo tempo da CPU. zlib e PKZIP não são as únicas implementações de desinflar a compactação e descompactação. Tanto o utilitário de arquivamento 7-Zip quanto a biblioteca zopfli do Google têm a capacidade de usar muito mais tempo de CPU que o zlib, a fim de reduzir os últimos bits possíveis ao usar o formato deflate, reduzindo os tamanhos compactados em alguns por cento em comparação ao valor mais alto do zlib nível de compressão. O utilitário pigz, uma implementação paralela do gzip, inclui a opção de usar zlib (níveis de compactação 1-9) ou zopfli (nível de compactação 11) e mitiga um pouco o impacto no tempo do uso do zopfli, dividindo a compactação de arquivos grandes em vários processadores e núcleos.

Mark Adler
fonte
113
Este post está repleto de tanta história e informações que eu sinto que algumas citações precisam ser adicionadas, caso as pessoas tentem fazer referência a este post como uma fonte de informações. Embora se essa informação for refletida em algum lugar com citações como a Wikipedia, um link para esse trabalho citado semelhante seria apreciado.
ThorSummoner
1348
Eu sou a referência, tendo feito parte de tudo isso. Este post pode ser citado na Wikipedia como fonte original.
Mark Adler #
524
FYI: Mark Adler é um engenheiro de software americano e está fortemente envolvido na exploração espacial. Ele é mais conhecido por seu trabalho no campo da compactação de dados como autor da função de soma de verificação Adler-32 e co-autor da biblioteca de compactação zlib e gzip. Ele contribuiu para o Info-ZIP e participou no desenvolvimento do formato de imagem Portable Network Graphics (PNG). Adler também foi o gerente da missão Spirit Cruise da missão Mars Exploration Rover. (wikipedia)
Isaac Hanson
99
O gzip foi criado para substituir a compactação Unix. O zip não é superior ao tar + gzip no Unix, por várias razões. (Quando você vê .tar.gzarquivos, é isso que eles são.) Primeiro, o tar + gzip compacta melhor que o zip, pois a compactação do próximo arquivo pode usar o histórico do arquivo anterior (às vezes chamado de arquivo "sólido"). O zip só pode compactar arquivos individualmente. Segundo, o tar preserva todas as informações do diretório Unix, enquanto o zip não foi projetado para fazer isso. (Extensões posteriores para o formato zip com específicos do Unix extra quadras tentativas para resolver este problema.)
Mark Adler
85
Você parece estar confundindo formatos com implementação. A implementação 7-Zip do formato deflate pode obter algo como sua compactação 2 a 10% melhor do que o gzip com o mesmo formato deflate (enquanto leva muito mais tempo da CPU para fazer isso). O formato 7z LZMA2 oferece uma ordem de compressão 40% melhor.
Mark Adler
43

ZIP é um formato de arquivo usado para armazenar um número arbitrário de arquivos e pastas junto com a compactação sem perdas. Ele não faz suposições estritas sobre os métodos de compactação usados, mas é usado com mais frequência com DEFLATE .

O gzip é um algoritmo de compactação baseado no DEFLATE, mas menos onerado com possíveis patentes et al., E um formato de arquivo para armazenar um único arquivo compactado. Ele suporta a compactação de um número arbitrário de arquivos e pastas quando combinado com o tar . O arquivo resultante tem uma extensão de .tgzou .tar.gze é geralmente chamado de tarball .

O zlib é uma biblioteca de funções que encapsula o DEFLATE em sua encarnação LZ77 mais comum .

Niels Keurentjes
fonte
28

A diferença mais importante é que o gzip é capaz apenas de compactar um único arquivo, enquanto o zip compacta vários arquivos um por um e os arquiva em um único arquivo posteriormente. Assim, o gzip vem junto com o tar na maioria das vezes (existem outras possibilidades). Isso vem junto com algumas (des) vantagens.

Se você possui um grande arquivo e precisa apenas de um único arquivo, é necessário descompactar todo o arquivo gzip para chegar a esse arquivo. Isso não é necessário se você tiver um arquivo zip.

Por outro lado, se você compactar 10 arquivos semelhantes ou mesmo idênticos, o arquivo zip será muito maior porque cada arquivo é compactado individualmente, enquanto no gzip, em combinação com o tar, um único arquivo é compactado, o que é muito mais eficaz se os arquivos forem compactados. semelhante (igual).

Tim Zimmermann
fonte
8
Você está exagerando o ponto. Se as pessoas quisessem arquivos compactados de acesso aleatório, eles poderiam criar arquivos ".gz.tar" em vez de arquivos ".tar.gz". Eles não, porque a maioria das pessoas não está interessada em acesso aleatório. Existe uma grande comunidade em torno do formato de arquivo da web .warc.gz, e eles precisam de acesso aleatório, para compactar cada página da Web separadamente. Você usa esse formato sempre que vê uma página da Web na Internet Archive Wayback Machine.
precisa
2
".gz.tar" não oferece acesso aleatório, pois o formato tar não é capaz de acessar aleatoriamente suas entradas. Você precisa passar por todas as entradas desde o início para obter a entrada específica desejada, ainda pior: precisa passar por todas as entradas até o final, porque o mesmo arquivo pode ser arquivado várias vezes (em várias versões) em vários lugares no mesmo arquivo - e não há como descobrir, exceto ler toda a entrada do arquivo por entrada.
Min-Soo Pipefeet