¿Cómo están relacionados zlib, gzip y zip? ¿Qué tienen en común y cómo son diferentes?

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

Forma corta:

.zip es un formato de archivo que usa, por lo general, el método de compresión Deflate . El formato .gz gzip es para archivos individuales, también utiliza el método de compresión Deflate. A menudo, gzip se usa en combinación con tar para crear un formato de archivo comprimido , .tar.gz . La biblioteca zlib proporciona un código de desinflado de compresión y descompresión para ser utilizado por zip, gzip, png (que utiliza el contenedor zlib en los datos de desinflado) 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 directorio, donde cada archivo se comprime individualmente. El tipo de archivo es .zip . Los archivos, así como la estructura del directorio, se pueden encriptar opcionalmente.

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 están en diferentes cantidades de uso. El único método en uso realmente extendido en el formato ZIP es el método 8, desinflar y, en menor medida, el método 0, que no es compresión en absoluto. Prácticamente todos los archivos .zip que se encontrarán en la naturaleza usará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 ser transmitido 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 utilizado en archivos de almacenamiento de Java (.jar), archivos de Office Open XML (Microsoft Office .docx, .xlsx, .pptx), documento de Office Archivos de formato (.odt, .ods, .odp) y EPUB (.epub). Ese estándar limita los métodos de compresión a 0 y 8, así como a otras restricciones como el cifrado o las firmas.

Alrededor de 1990, el grupo Info-ZIP escribió implementaciones de código abierto y gratuito de zip y unzip utilidades, admitiendo la compresión con el formato Deflate y descompresión de ese y los formatos anteriores. Esto amplió en gran medida el uso del formato .zip .

A principios de los 90, el formato gzip se desarrolló como un reemplazo para la utilidad de compress Unix , derivada del código de desinflado en las utilidades de Info-ZIP. La compress Unix se diseñó para comprimir un solo archivo o secuencia, añadiendo una .Z al nombre del archivo. compress utiliza el algoritmo de compresión LZW , que en ese momento estaba bajo patente y su uso libre fue objeto de controversia por los titulares de la patente. Aunque algunas implementaciones específicas de Deflate fueron patentadas por Phil Katz, el formato no lo era, por lo que fue posible escribir una implementación de Deflate que no infringe ninguna patente. Esa implementación no se ha visto tan cuestionada en los últimos 20 años. La utilidad gzip Unix fue pensada como un reemplazo directo para compress , y de hecho es capaz de descomprimir datos compress (suponiendo que haya podido analizar esa frase). gzip agrega un .gz al nombre del archivo. gzip utiliza el formato de datos comprimidos Deflate, que se comprime bastante mejor que la compress Unix, tiene una descompresión muy rápida y agrega un CRC-32 como una verificación de integridad para los datos. El formato de encabezado también permite el almacenamiento de más información que el formato de compress permitido, como el nombre del archivo original y la hora de modificación del archivo.

Aunque compress solo comprime un único archivo, era común usar la utilidad tar para crear un archivo de archivos, sus atributos y su estructura de directorios en un solo archivo .tar , y luego comprimirlo con compress para crear un archivo .tar.Z Archivo .tar.Z De hecho, la utilidad tar 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 tar para compress . Todo esto se transfirió al formato gzip, y tar tiene una opción para comprimir directamente al formato .tar.gz . El formato tar.gz comprime mejor que el enfoque .zip , ya que la compresión de un .tar puede aprovechar la redundancia en los archivos, especialmente en muchos archivos pequeños. .tar.gz es el formato de archivo más común en uso en Unix debido a su muy alta portabilidad, pero también hay métodos de compresión más efectivos en uso, por lo que a menudo verá archivos .tar.bz2 y .tar.xz .

A diferencia de .tar , .zip tiene un directorio central al final, que proporciona una lista de los contenidos. Eso y la compresión por separado proporciona acceso aleatorio a las entradas individuales en un archivo .zip . Un archivo .tar debería ser descomprimido y escaneado de principio a fin para construir un directorio, que es como se enumera un archivo .tar .

Poco después de la introducción de gzip, a mediados de la década de 1990, la misma disputa sobre patentes cuestionó el uso gratuito del formato de imagen .gif , muy utilizado en los tablones de anuncios y la World Wide Web (una novedad en ese momento). Entonces, un pequeño grupo creó el formato de imagen comprimido sin pérdida PNG, con tipo de archivo .png , para reemplazar .gif . Ese formato también usa el formato de desinflado para compresión, que se aplica después de que los filtros en los datos de imagen exponen más de la redundancia. Con el fin de promover el uso generalizado del formato PNG, se crearon dos bibliotecas de códigos libres. 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 su uso por libpng, así como para otras aplicaciones. zlib fue adaptado del código gzip .

Todas las patentes mencionadas han expirado.

La biblioteca zlib admite Desinflar compresión y descompresión, y tres tipos de envoltura alrededor de las streams desinfladas. Esos son: sin envoltura (desinflado “en bruto”), zlib wrapping , que se utiliza en los bloques de datos en formato PNG, y gzip wrapping, para proporcionar rutinas gzip para el progtwigdor. La principal diferencia entre zlib y gzip wrapping es que el zlib wrapping es más compacto, seis bytes frente a un mínimo de 18 bytes para gzip, y la comprobación de integridad, Adler-32, se ejecuta más rápido que el CRC-32 que usa gzip. Los progtwigs que leen y escriben el formato .zip utilizan el desinflado sin formato, que es otro formato que se ajusta a la desinflado de datos comprimidos.

zlib ahora se utiliza ampliamente para la transmisión y el almacenamiento de datos. Por ejemplo, la mayoría de las transacciones HTTP de servidores y navegadores comprimen y descomprimen los datos usando zlib.

Las diferentes implementaciones de desinflado pueden dar lugar a diferentes salidas comprimidas 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 el tiempo de la CPU. zlib y PKZIP no son las únicas implementaciones de desinflar compresión y descompresión. Tanto la utilidad de archivado 7-Zip como la biblioteca zopfli de Google tienen la capacidad de utilizar mucho más tiempo de CPU que zlib para exprimir los últimos bits posibles al usar el formato desinflado, reduciendo los tamaños comprimidos en un pequeño porcentaje en comparación con zlib’s 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 mitiga de alguna manera el impacto del uso de zopfli al dividir la compresión de archivos grandes en procesadores múltiples. y núcleos.

ZIP es un formato de archivo utilizado para almacenar una cantidad arbitraria de archivos y carpetas junto con la compresión sin pérdida. 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. Es compatible con la compresión de una cantidad arbitraria de archivos y carpetas cuando se combina con tar . El archivo resultante tiene una extensión de .tgz o .tar.gz y comúnmente se denomina tarball .

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

La diferencia más importante es que gzip solo es capaz de comprimir un solo archivo mientras comprime varios archivos uno a uno y luego los archiva en un solo archivo. Por lo tanto, gzip viene con alquitrán la mayor parte del tiempo (aunque hay otras posibilidades). Esto viene con algunas (des) ventajas.
Si tiene un archivo grande y solo necesita un archivo único, debe descomprimir todo el archivo gzip para acceder a ese archivo. Esto no es obligatorio si tienes un archivo zip.
Por otro lado, si comprimes 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 único archivo, que es mucho más efectivo si los archivos son similar (igual).