Сжатие данных ZLIB
Сжатие данных ZLIB — это формат сжатия данных без потерь, основанный на алгоритме DEFLATE, и одноимённая программная библиотека, реализующая этот формат. ZLIB предоставляет универсальный, компактный и широко распространённый метод упаковки данных, который используется в самых разных областях — от хранения файлов до передачи данных по сети. Формат определён в RFC 1950, а базовая реализация на языке C была написана Жаном-Лу Гайи и Марком Адлером.
История
Разработка ZLIB началась в начале 1990-х годов как ответ на патентные ограничения, связанные с популярным в то время алгоритмом сжатия LZW, который использовался в форматах GIF и CompuServe. Жан-Лу Гайи и Марк Адлер, работавшие в то время в компании Info-ZIP, поставили перед собой цель создать свободную, высокопроизводительную и не обременённую патентами библиотеку сжатия.
Первая публичная версия ZLIB (версия 0.5) была выпущена 1 мая 1995 года. Ключевым решением стало использование в качестве основы алгоритма DEFLATE, который был разработан Филом Кацем для программы PKZIP и не был запатентован. В отличие от LZW, DEFLATE сочетал в себе два метода: кодирование повторяющихся последовательностей (алгоритм LZ77) и кодирование Хаффмана. Библиотека быстро завоевала популярность благодаря своей эффективности, надёжности и свободной лицензии (zlib License), которая разрешает использование как в свободных, так и в проприетарных проектах.
К середине 1990-х годов ZLIB стала стандартом де-факто для сжатия данных в Unix-подобных системах. Она была включена в состав многих дистрибутивов Linux и стала основой для таких утилит, как gzip. В 1996 году формат ZLIB был официально закреплён в RFC 1950, а алгоритм DEFLATE — в RFC 1951.
Формат ZLIB
Формат ZLIB представляет собой контейнер, который оборачивает сжатые данные, полученные с помощью алгоритма DEFLATE. Структура потока ZLIB включает в себя три основные части:
- Заголовок (2 байта): Содержит информацию о методе сжатия (всегда DEFLATE), уровне сжатия, а также флаг (FCHECK) для проверки целостности самого заголовка. Заголовок также может указывать на наличие словаря (специальной таблицы начальных данных) и размер окна сжатия.
- Сжатые данные (переменной длины): Непосредственно данные, сжатые алгоритмом DEFLATE. Они могут быть представлены в виде одного или нескольких блоков DEFLATE.
- Контрольная сумма (4 байта): В конце потока добавляется контрольная сумма, вычисленная по алгоритму Adler-32. Она служит для проверки целостности распакованных данных. Adler-32 менее надёжен, чем CRC-32, но значительно быстрее вычисляется.
Отличительной особенностью формата ZLIB является его компактность — заголовок занимает всего 2 байта, что делает его пригодным для передачи даже в коротких сообщениях.
Библиотека ZLIB
Программная библиотека ZLIB, написанная на языке C, является эталонной реализацией формата. Она предоставляет набор функций для сжатия и распаковки данных в памяти и в потоках. Ключевые характеристики библиотеки:
- Кроссплатформенность: Библиотека портирована практически на все существующие операционные системы и архитектуры.
- Простота API: Интерфейс библиотеки состоит из небольшого числа функций (
deflate,inflate,compress,uncompressи др.), что облегчает её интеграцию. - Гибкость: Пользователь может настраивать уровень сжатия (от 0 — без сжатия, до 9 — максимальное сжатие), размер окна и стратегию сжатия.
- Производительность: Библиотека оптимизирована для работы как на мощных серверах, так и на встраиваемых устройствах с ограниченными ресурсами.
Библиотека ZLIB распространяется под свободной лицензией zlib License, которая разрешает использование, модификацию и распространение как в исходных, так и в бинарных кодах, при условии сохранения уведомления об авторских правах.
Применение
ZLIB и её реализация нашли широчайшее применение в современном программном обеспечении. Наиболее известные области использования:
- Форматы файлов и архиваторы:
- gzip (GNU zip): Утилита и формат сжатия, использующий ZLIB/DEFLATE. Широко применяется в Unix-подобных системах для сжатия файлов и потоков данных.
- PNG (Portable Network Graphics): Формат растровой графики, использующий сжатие DEFLATE (через ZLIB) для уменьшения размера изображения без потери качества.
- ZIP: Хотя формат ZIP использует собственный формат сжатия, многие реализации, включая популярную библиотеку minizip, основаны на ZLIB.
- PDF (Portable Document Format): Внутренние потоки данных в PDF-файлах часто сжимаются с помощью ZLIB.
- Сетевые протоколы:
- HTTP: Протокол передачи гипертекста поддерживает сжатие тела ответа с помощью кодирования
deflate(что на практике часто означает ZLIB) илиgzip. Это позволяет значительно сократить трафик при загрузке веб-страниц. - SSH (Secure Shell): Протокол для удалённого управления может использовать сжатие ZLIB для ускорения передачи данных.
- TLS/SSL: Некоторые реализации протоколов шифрования поддерживают сжатие на уровне записи с помощью ZLIB.
- Программное обеспечение:
- Ядро Linux: Включает встроенную поддержку ZLIB для сжатия модулей ядра, файловых систем (например, Btrfs, SquashFS) и сетевых протоколов.
- Базы данных: Некоторые СУБД, такие как PostgreSQL и MySQL, используют ZLIB для сжатия резервных копий и внутренних данных.
- Игровые движки: Многие игры используют ZLIB для сжатия текстур, моделей и других ресурсов.
Критика и альтернативы
Несмотря на широкую распространённость, ZLIB не лишена недостатков. Основные претензии связаны с относительно низкой степенью сжатия по сравнению с современными алгоритмами, такими как LZMA (используется в 7z) или Brotli. Алгоритм DEFLATE, лежащий в основе ZLIB, был разработан в 1990-х годах и не использует более сложные методы, такие как контекстное моделирование или преобразование Барроуза — Уилера.
Кроме того, ZLIB не поддерживает многопоточное сжатие, что ограничивает её производительность на многоядерных процессорах. Для решения этой проблемы были созданы форки, такие как zlib-ng (zlib next generation), которые оптимизированы для современных архитектур и поддерживают многопоточность.
Альтернативами ZLIB являются:
- zlib-ng: Модернизированная версия ZLIB с улучшенной производительностью и поддержкой новых инструкций CPU (SSE, AVX).
- Brotli: Алгоритм сжатия, разработанный Google, обеспечивающий более высокую степень сжатия, чем ZLIB, особенно для текстовых данных. Используется в HTTP/2.
- Zstandard (Zstd): Алгоритм сжатия от Facebook (компания Meta признана экстремистской и запрещена в РФ), предлагающий высокую скорость и степень сжатия, сравнимую с LZMA. Поддерживает многопоточность и словари.
- LZ4: Алгоритм, ориентированный на максимальную скорость сжатия и распаковки, жертвуя степенью сжатия.
Интересные факты
- Название «zlib» не является акронимом. По словам авторов, это просто короткое и запоминающееся имя, которое хорошо сочетается с «gzip».
- Контрольная сумма Adler-32, используемая в ZLIB, была разработана Марком Адлером. Она названа в честь его фамилии и является модификацией алгоритма Флетчера.
- Исходный код ZLIB считается образцом написания переносимого и эффективного кода на C. Он используется в качестве учебного пособия во многих университетах.
- В 2018 году в библиотеке ZLIB была обнаружена критическая уязвимость (CVE-2018-25032), связанная с переполнением буфера при обработке специально сформированных данных. Уязвимость была оперативно исправлена.
Источники
- RFC 1950 — ZLIB Compressed Data Format Specification version 3.3.
- RFC 1951 — DEFLATE Compressed Data Format Specification version 1.3.
- Официальный сайт библиотеки zlib: https://www.zlib.net/
- Deutsch, P., & Gailly, J.-L. (1996). ZLIB Compressed Data Format Specification. RFC 1950.
- Gailly, J.-L., & Adler, M. (1995). zlib 0.5 Release Notes.
- Salomon, D. (2007). Data Compression: The Complete Reference (4th ed.). Springer.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →