# Zlib

Zlib es una biblioteca de software utilizada para la compresión de datos. Fue escrita por Jean-loup Gailly y Mark Adler y es una abstracción del algoritmo DEFLATE de compresión utilizado en el programa de compresión de archivos gzip. Zlib es también un componente crucial de muchas plataformas de software incluyendo Linux, Mac OS X e iOS. También ha sido utilizado en consolas de videojuegos como la PlayStation 4, PlayStation 3, Wii U, Wii, Xbox One y Xbox 360.
La primera versión pública de zlib, 0.9, fue liberada el 1 de mayo de 1995 y fue originalmente pensada para usarla con la biblioteca libpng. Es software libre distribuido bajo la Licencia Zlib.

## Capacidades
### Encapsulación

Los datos comprimidos por zlib típicamente son escritos por un wrapper de gzip o zlib. El wrapper encapsula los datos crudos de DEFLATE añadiendo una cabecera y una cola. Esto proporciona identificación del stream y detección de errores que no son proporcionados en los datos en crudo de DEFLATE.
El encabezado de gzip, usado ubicuamente en el formato de fichero gzip, es mayor que la cabecera de zlib debido a que almacena el nombre del fichero y otra información del sistema de ficheros.

### Algoritmo

A septiembre de 2018, zlib solo soporta un algoritmo, llamado DEFLATE, que es una variación del algoritmo LZ77 (Lempel–Ziv 1977). Este algoritmo proporciona buena compresión en una amplia variedad de datos con un uso mínimo de recursos de sistema. Es también el algoritmo usado en el formato de archivo ZIP.
El encabezado permite otros algoritmos, pero actualmente ningún otro está implementado.

### Uso de recursos

Zlib proporciona facilidades para el control del uso del procesador y de memoria. Se le puede indicar un parámetro para aumentar la velocidad en detrimento de la compresión. También se puede limitar el uso de la memoria.

### Estrategia

La compresión puede ser optimizada para ciertos datos. Si usa datos que siempre mantengan cierta estructura, usar una estrategia específica puede mejorar el ratio de compresión y de rendimiento. Por ejemplo, si los datos contienen longitudes largas de bytes repetidos, la estrategia RLE (codificación RLE) puede dar buenos resultados de velocidad. Para datos generales, la configuración por defecto es la preferida.

### Gestión de errores

Los errores en los datos comprimidos pueden ser detectados y saltados. Además, si se escriben puntos "full-flush" a la secuencia comprimida, los datos corruptos pueden ser omitidos y la descompresión se resincronizará en el siguiente punto "full-flush" aunque no se proporcionan mecanismos de recuperación de los errores en los datos. Este tipo de puntos son útiles para grandes secuencias de datos en canales no confiables, donde cierta pérdida de datos no es importante, como en algunas aplicaciones multimedia. Sin embargo, crear muchos de estos "flush-points" puede afectar a la velocidad y al ratio de compresión.

### Longitud de datos

No hay ningún límite a la longitud de datos que pueden ser comprimidos o descomprimidos. Repetidas llamadas a la biblioteca permiten un ilimitado número de bloques de datos. Algunos contadores pueden sufrir de desbordamiento de buffers pero esto no afecta la compresión o descompresión.
Cuando el conjunto de datos es muy largo(o infinito) se recomienda regularmente escribir puntos "full-flush".

## Aplicaciones

Hoy, zlib es un estándar de facto, al punto que zlib y DEFLATE son a menudo usados indistintamente en documentos, con miles de aplicaciones que confían en su compresión, directamente o indirectamente. Esto incluye:
* Al núcleo Linux, donde zlib es usado en protocolos de red, sistemas de archivo , y para descomprimir el núcleo cuando inicial el sistema operativo.
* GNU Binutils y el Depurador GNU (GDB)
* libpng, la implementación de referencia para el formato de imagen PNG, el cual especifica DEFLATE como la compresión para sus datos bitmap.
* libwww, una API para aplicaciones web como navegadores Web.
* El Servidor HTTP Apache, el cual utiliza zlib para implementar HTTP/1.1.
* El cliente y servidor OpenSSH, los cuales usan en zlib la compresión ofrecida por el protocolo de Secure Shell.
* Los proyectos OpenSSL y GnuTLS, los cuales pueden utilizar zlib para comprimir conexiones TLS.
* La biblioteca multimedia FFmpeg, la cual utiliza zlib para leer y escribir datos en DEFLATE, como por ejemplo en Matroska.
* El sincronizador de archivo remoto rsync, el cual utiliza zlib para comprimir los datos.
* Los gestores de paquetes dpkg y RPM, los cuales utilizan zlib para desempaquetar archivos de los paquetes de software comprimido.
* Los sistemas de control de versiones Subversion y CVS, los cuales utilizan zlib para comprimir el tráfico desde y hacia los repositorios remotos.
* El sistema de control de versiones Git utiliza zlib para almacenar los contenidos de sus objetos de datos (blobs, árboles, commits y etiquetas).
* El RDBMS PostgreSQL usa zlib como formato de exportación(pg_dump -Fc) para copias de seguridad de la base de datos.
* La clase.IO.Compresión.DeflateStream del framework Microsoft .NET 2.0 o superior.
* La utilidad "deflate" en TORNADO como parte de VxWorks, el sistema operativo hecho por Wind River Systems, utiliza zlib para comprimir la imagen de arranque ROM.
zlib es también utilizado en muchos dispositivos embebidos, como el iPhone de Apple y la Sony PlayStation 3, porque el código es portátil, tiene licencia libre, y poco uso de memoria.