¿Cómo se relacionan zlib, gzip y zip? ¿Qué tienen en común y en qué se diferencian?

948

El algoritmo de compresión utilizado en zlib es esencialmente el mismo que el de gzip y zip . ¿Qué son gzip y zip ? ¿Cómo son diferentes y cómo son iguales?

Abhishek Jain
fuente

Respuestas:

2476

Forma corta:

.zipes un formato de archivo que utiliza, generalmente, el método de compresión Deflate . El .gzformato gzip es para archivos individuales, también usando el método de compresión Deflate. A menudo gzip se utiliza en combinación con alquitrán para hacer un formato de archivo comprimido , .tar.gz. La biblioteca zlib proporciona un código de compresión y descompresión Deflate para usar con zip, gzip, png (que usa el contenedor zlib en los datos desinflados) y muchas otras aplicaciones.

Forma larga:

El formato ZIP fue desarrollado por Phil Katz como un formato abierto con una especificación abierta, donde su implementación, PKZIP, fue shareware. Es un formato de archivo que almacena archivos y su estructura de directorios, donde cada archivo se comprime individualmente. El tipo de archivo es .zip. Los archivos, así como la estructura del directorio, opcionalmente se pueden cifrar.

El formato ZIP admite varios métodos de compresió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

Los métodos 1 a 7 son históricos y no están en uso. Los métodos 9 a 98 son adiciones relativamente recientes, y se usan en cantidades pequeñas y variables. El único método de uso realmente extendido en el formato ZIP es el método 8, Deflate , y en cierta medida el método 0, que no es compresión alguna. Prácticamente todos los .ziparchivos que encontrará en la naturaleza utilizarán exclusivamente los métodos 8 y 0, probablemente solo el método 8. (El método 8 también tiene un medio para almacenar efectivamente los datos sin compresión y relativamente poca expansión, y el método 0 no puede transmitirse mientras que el método 8 puede ser).

El estándar ISO / IEC 21320-1: 2015 para contenedores de archivos es un formato zip restringido, como el que se usa en archivos de archivo Java (.jar), archivos Open Office XML (Microsoft Office .docx, .xlsx, .pptx), documento de Office Formatear archivos (.odt, .ods, .odp) y archivos EPUB (.epub). Ese estándar limita los métodos de compresión a 0 y 8, así como otras restricciones, como la falta de cifrado o firmas.

Alrededor de 1990, el grupo Info-ZIP escribió implementaciones zipy unziputilidades portátiles, gratuitas y de código abierto , apoyando la compresión con el formato Deflate y la descompresión de ese y los formatos anteriores. Esto amplió enormemente el uso del .zipformato.

A principios de los 90, el formato gzip se desarrolló como un reemplazo para la utilidad Unixcompress , derivada del código Deflate en las utilidades Info-ZIP. Unix compressfue diseñado para comprimir un solo archivo o secuencia, agregando un .Zal nombre del archivo. compressutiliza el algoritmo de compresión LZW , que en ese momento estaba bajo patente y su uso gratuito estaba en disputa por los titulares de la patente. Aunque algunas implementaciones específicas de Deflate fueron patentadas por Phil Katz, el formato no fue así, por lo que fue posible escribir una implementación de Deflate que no infringiera ninguna patente. Esa implementación no ha sido tan cuestionada en los últimos 20 años. La gziputilidad Unix fue pensada como un reemplazo directo paracompressy, de hecho, puede descomprimir compressdatos comprimidos (suponiendo que haya podido analizar esa oración). gzipagrega .gza al nombre del archivo. gzipusa el formato de datos comprimidos Deflate, que comprime bastante mejor que Unix compress, tiene una descompresión muy rápida y agrega un CRC-32 como una verificación de integridad para los datos. El formato del encabezado también permite el almacenamiento de más información que el compressformato permitido, como el nombre del archivo original y la hora de modificación del archivo.

Aunque compresssolo comprime un solo archivo, era común usar la tarutilidad para crear un archivo de archivos, sus atributos y su estructura de directorios en un solo .tararchivo, y luego comprimirlo compresspara crear un .tar.Zarchivo. De hecho, la tarutilidad tenía y todavía tiene una opción para hacer la compresión al mismo tiempo, en lugar de tener que canalizar la salida de tara compress. Todo esto llevado al formato gzip, y tartiene una opción para comprimir directamente al .tar.gzformato. El tar.gzformato se comprime mejor que el .zipenfoque, ya que la compresión de un .tarpuede aprovechar la redundancia entre archivos, especialmente muchos archivos pequeños. .tar.gzes el formato de archivo más común en uso en Unix debido a su alta portabilidad, pero también hay métodos de compresión más efectivos en uso, por lo que a menudo verá .tar.bz2y .tar.xzarchivará.

A diferencia .tar, .ziptiene un directorio central al final, que proporciona una lista de los contenidos. Eso y la compresión separada proporciona acceso aleatorio a las entradas individuales en un .ziparchivo. Un .tararchivo tendría que descomprimirse y analizarse de principio a fin para crear un directorio, que es cómo .tarse enumera un archivo.

Poco después de la introducción de gzip, a mediados de la década de 1990, la misma disputa de patentes puso en tela de juicio el uso gratuito del .gifformato de imagen, muy utilizado en los tableros de anuncios y en la World Wide Web (algo nuevo en ese momento). Entonces, un pequeño grupo creó el formato de imagen comprimido sin pérdida PNG, con el tipo de archivo .png, para reemplazar .gif. Ese formato también usa el formato Deflate para la compresión, que se aplica después de que los filtros en los datos de la imagen exponen más de la redundancia. Para promover el uso generalizado del formato PNG, se crearon dos bibliotecas de código gratuitas. libpng y zlib. libpng manejó todas las características del formato PNG, y zlib proporcionó el código de compresión y descompresión para el uso de libpng, así como para otras aplicaciones. zlib fue adaptado del gzipcódigo.

Todas las patentes mencionadas han expirado desde entonces.

La biblioteca zlib admite la compresión y descompresión de desinflado, y tres tipos de envoltura alrededor de las secuencias de desinflado. Esos son: sin envoltura (desinflado "en bruto"), envoltura zlib , que se utiliza en los bloques de datos en formato PNG, y envoltura gzip, para proporcionar rutinas gzip para el programador. La principal diferencia entre la envoltura zlib y gzip es que la envoltura zlib es más compacta, seis bytes frente a un mínimo de 18 bytes para gzip, y la verificación de integridad, Adler-32, se ejecuta más rápido que el CRC-32 que usa gzip. La desinflación sin .zipformato es utilizada por programas que leen y escriben el formato, que es otro formato que envuelve los datos comprimidos desinflados.

zlib ahora se usa ampliamente para la transmisión y almacenamiento de datos. Por ejemplo, la mayoría de las transacciones HTTP realizadas por servidores y navegadores comprimen y descomprimen los datos usando zlib, específicamente el encabezado HTTP Content-Encoding: deflatesignifica desinflar el método de compresión dentro del formato de datos zlib .

Las diferentes implementaciones de desinflado pueden dar como resultado una salida comprimida diferente para los mismos datos de entrada, como lo demuestra la existencia de niveles de compresión seleccionables que permiten compensar la efectividad de la compresión por tiempo de CPU. zlib y PKZIP no son las únicas implementaciones de compresión y descompresión desinfladas. Tanto la utilidad de archivo 7-Zip como la biblioteca zopfli de Google tienen la capacidad de usar mucho más tiempo de CPU que zlib para exprimir los últimos bits posibles al usar el formato de desinflado, reduciendo los tamaños comprimidos en un pequeño porcentaje en comparación con el más alto de zlib nivel de compresión. La utilidad pigz, una implementación paralela de gzip, incluye la opción de usar zlib (niveles de compresión 1-9) o zopfli (nivel de compresión 11), y de alguna manera mitiga el impacto temporal del uso de zopfli al dividir la compresión de archivos grandes en múltiples procesadores y núcleos.

Mark Adler
fuente
113
Esta publicación está llena de tanta historia e información que siento que es necesario agregar algunas citas en caso de que las personas intenten hacer referencia a esta publicación como fuente de información. Aunque si esta información se refleja en algún lugar con citas como Wikipedia, se agradecería un enlace a un trabajo citado similar.
ThorSummoner
1348
Soy la referencia, después de haber sido parte de todo eso. Esta publicación podría citarse en Wikipedia como fuente original.
Mark Adler
524
FYI: Mark Adler es un ingeniero de software estadounidense, y ha estado muy involucrado en la exploración espacial. Es mejor conocido por su trabajo en el campo de la compresión de datos como autor de la función de suma de comprobación Adler-32 y coautor de la biblioteca de compresión zlib y gzip. Ha contribuido a Info-ZIP y ha participado en el desarrollo del formato de imagen Portable Network Graphics (PNG). Adler también fue el Gerente de la Misión Spirit Cruise para la misión Mars Exploration Rover. (wikipedia)
Isaac Hanson
99
gzip fue creado para reemplazar la compresión Unix. zip no es superior a tar + gzip en Unix, por varias razones. (Cuando ve .tar.gzarchivos, eso es lo que son). Primero, tar + gzip comprime mejor que zip, ya que la compresión del siguiente archivo puede usar el historial del archivo anterior (a veces denominado archivo "sólido"). zip solo puede comprimir archivos individualmente. En segundo lugar, tar conserva toda la información del directorio Unix, mientras que zip no fue diseñado para hacerlo. (Las extensiones posteriores al formato zip con bloques adicionales específicos de Unix intentan solucionar este problema.)
Mark Adler
85
Parece que confunde los formatos con la implementación. La implementación de 7-Zip del formato de desinflado puede obtener algo así como una compresión de 2% a 10% mejor que la de gzip con el mismo formato de desinflado (mientras que toma mucho más tiempo de CPU para hacerlo). El formato 7z LZMA2 ofrece del orden del 40% una mejor compresión.
Mark Adler
43

ZIP es un formato de archivo utilizado para almacenar un número arbitrario de archivos y carpetas junto con una compresión sin pérdidas. No hace suposiciones estrictas sobre los métodos de compresión utilizados, pero se usa con mayor frecuencia con DEFLATE .

Gzip es un algoritmo de compresión basado en DEFLATE pero menos gravado con patentes potenciales y otros, y un formato de archivo para almacenar un solo archivo comprimido. Admite comprimir una cantidad arbitraria de archivos y carpetas cuando se combina con tar . El archivo resultante tiene una extensión de .tgzo .tar.gzy comúnmente se llama tarball .

zlib es una biblioteca de funciones que encapsula DEFLATE en su encarnación LZ77 más común .

Niels Keurentjes
fuente
28

La diferencia más importante es que gzip solo es capaz de comprimir un solo archivo, mientras que zip comprime varios archivos uno por uno y luego los archiva en un solo archivo. Por lo tanto, gzip viene junto con el alquitrán la mayor parte del tiempo (aunque hay otras posibilidades). Esto viene junto con algunas (des) ventajas.

Si tiene un archivo grande y solo necesita un solo archivo, debe descomprimir todo el archivo gzip para acceder a ese archivo. Esto no es obligatorio si tiene un archivo zip.

Por otro lado, si comprime 10 archivos similares o incluso idénticos, el archivo zip será mucho más grande porque cada archivo se comprime individualmente, mientras que en gzip en combinación con tar se comprime un solo archivo, que es mucho más efectivo si los archivos son similar (igual).

Tim Zimmermann
fuente
8
Estás exagerando el punto. Si las personas quisieran archivos comprimidos de acceso aleatorio, podrían crear archivos ".gz.tar" en lugar de archivos ".tar.gz". No lo hacen, porque a la mayoría de las personas no les interesa el acceso aleatorio. Existe una gran comunidad en torno al formato de archivo web .warc.gz, y necesitan acceso aleatorio, por lo que comprimen cada página web por separado. Utiliza este formato cada vez que mira una página web en Internet Archive Wayback Machine.
Greg Lindahl
2
".gz.tar" no ofrece acceso aleatorio ya que el formato tar no es capaz de acceder aleatoriamente a sus entradas. Debe pasar por todas las entradas desde el principio para obtener la entrada específica deseada, aún peor: debe pasar por todas las entradas hasta el final porque el mismo archivo puede archivarse varias veces (en varias versiones) en varios lugares en el mismo archivo, y no hay forma de resolverlo, excepto leer todo el archivo de entrada por entrada.
Min-Soo Pipefeet