# Zlib

zlib (/'zi:lIb/ o "zeta-lib", /'zi:t@,lIb/) è una libreria software utilizzata per la compressione dei dati. zlib è stato scritto da Jean-loup Gailly e Mark Adler ed è un'astrazione dell'algoritmo di compressione DEFLATE utilizzato nel loro programma di compressione file gzip. zlib è anche un componente cruciale di molte piattaforme software, tra cui Linux, macOS e iOS. È stata utilizzata anche in console di gioco come PlayStation 4, PlayStation 3, Wii U, Wii, Xbox One e Xbox 360.
La prima versione pubblica di zlib, 0.9, è stata rilasciata il 1 maggio 1995 ed era originariamente destinata all'uso con la libreria di immagini libpng. È un software libero, distribuito sotto la licenza zlib.

## Caratteristiche
### Incapsulamento

I dati compressi zlib sono in genere scritti con un gzip o un wrapper zlib. Il wrapper incapsula i dati grezzi DEFLATE aggiungendo un'intestazione e una sezione di coda. Ciò fornisce l'identificazione del flusso e il rilevamento degli errori che non sono forniti dai dati grezzi DEFLATE.
L'intestazione gzip, utilizzata nell'onnipresente formato di file gzip, è più grande dell'intestazione zlib, poiché memorizza un nome file e altre informazioni sul file system.

### Algoritmo

zlib supporta solo un algoritmo, chiamato DEFLATE, che utilizza una combinazione di una variazione di LZ77 (Lempel-Ziv 1977) e la codifica di Huffman. Questo algoritmo fornisce una buona compressione su un'ampia varietà di dati con un utilizzo minimo delle risorse di sistema. Questo è anche l'algoritmo utilizzato nel formato di archivio Zip. L'intestazione tiene conto di altri algoritmi, ma nessuno è attualmente implementato.

### Uso delle risorse

zlib fornisce funzioni per il controllo del processore e dell'uso della memoria. Può essere fornito un valore del livello di compressione che scambia la velocità con la compressione. Esistono anche funzioni per la conservazione della memoria, utili in ambienti con memoria limitata, come alcuni sistemi embedded.

### Strategia

La compressione può essere ottimizzata per tipi specifici di dati. Se si utilizza la libreria per comprimere sempre tipi specifici di dati, l'utilizzo di una strategia specifica può migliorare la compressione e le prestazioni. Ad esempio, se i dati contengono lunghe lunghezze di byte ripetuti, la strategia di codifica run-length (RLE) può dare buoni risultati a una velocità maggiore. Per i dati generali, è preferibile la strategia predefinita.

### Gestione degli errori

Gli errori nei dati compressi possono essere rilevati e ignorati se necessario. Inoltre, se i punti "full-flush" vengono scritti nel flusso compresso, i dati corrotti possono essere ignorati e la decompressione si risincronizzerà al punto di flush successivo, anche se non viene fornito alcun recupero di errore dei dati corrotti. I punti full-flush sono utili per grandi flussi di dati su canali inaffidabili, dove una certa perdita di dati non è importante, come in alcune applicazioni multimediali. Tuttavia, la creazione di molti punti di livellamento può influire sulla velocità e sulla quantità (rapporto) di compressione.

### Lunghezza dei dati

Non c'è limite alla lunghezza dei dati che possono essere compressi o decompressi. Ripetute chiamate alla libreria consentono di gestire un numero illimitato di blocchi di dati. Alcuni codici ausiliari (contatori) possono soffrire di overflow per lunghi flussi di dati, ma ciò non influisce sulla compressione o decompressione effettiva.
Quando si comprime un lungo flusso di dati (o infinito), è consigliabile scrivere punti di full-flush a intervalli regolari.

## Applicazioni

Oggi, zlib è una sorta di standard de facto, al punto che zlib e DEFLATE sono spesso usati in modo intercambiabile nei documenti standard, con migliaia di applicazioni che si affidano ad esso per la compressione, direttamente o indirettamente. Questi includono:
* Il kernel Linux, dove zlib viene utilizzato per implementare protocolli di rete compressi, file system compressi e per decomprimere l'immagine del kernel al momento dell'avvio.
* GNU Binutils
* libpng, l'implementazione di riferimento per il formato immagine PNG, che specifica DEFLATE come compressione del flusso per i suoi dati bitmap.
* libwww, un'API per applicazioni web come i browser Web.
* Apache HTTP Server, che utilizza zlib per implementare la compressione in HTTP/1.1.
* Allo stesso modo, la libreria cURL utilizza zlib per decomprimere le risposte HTTP.
* Il client e server OpenSSH, che si basano su zlib per eseguire la compressione opzionale offerta dal protocollo Secure Shell.
* Le librerie di sicurezza OpenSSL e GnuTLS, che possono facoltativamente utilizzare zlib per comprimere le connessioni TLS.
* La libreria multimediale FFmpeg, che utilizza zlib per leggere e scrivere le parti compresse DEFLATE dei formati di streaming, come Matroska.
* Il sincronizzatore di file remoto rsync, che utilizza zlib per implementare la compressione del protocollo opzionale.
* I gestori di pacchetti dpkg e RPM, che utilizzano zlib per decomprimere i file dai pacchetti software compressi.
* I sistemi di controllo della versione Apache Subversion e CVS, che utilizzano zlib per comprimere il traffico da e verso i repository remoti.
* Il formato di archiviazione dei dati orientato alla colonna Apache ORC utilizza ZLib come metodo di compressione predefinito.
* Il sistema di controllo versione Git utilizza zlib per archiviare il contenuto dei suoi oggetti dati (blob, alberi, commit e tag).
* L'RDBMS PostgreSQL utilizza zlib con formato di dump personalizzato (pg_dump -Fc) per i backup del database.
* La classe System.IO.Compression.DeflateStream del .NET Framework 2.0 e versioni successive
* L'utilità "deflate" in TORNADO come parte del sistema operativo VxWorks realizzato da Wind River Systems utilizza zlib per comprimere le immagini ROM di avvio.
* L'RDBMS MySQL utilizza ZLib LZ77 per la compressione nelle tabelle InnoDB
zlib è utilizzato anche in molti dispositivi embedded, come Apple iPhone e Sony PlayStation 3, perché il codice è portatile, con licenza libera e ha un footprint di memoria relativamente ridotto.