gzip
gzip — это свободная утилита для сжатия и восстановления данных, реализующая алгоритм Deflate, а также одноимённый формат архивации. Широко применяется в Unix-подобных операционных системах, в интернет-протоколах (HTTP, FTP) и в качестве стандартного средства сжатия для многих форматов файлов (например, .tar.gz). Разработан в начале 1990-х годов как замена устаревшим программам compress и pack.
История
Разработка gzip началась в 1992 году в рамках проекта GNU (Free Software Foundation) под руководством Жана-Лу Гайи (Jean-loup Gailly) и Марка Адлера (Mark Adler). Основной мотивацией стало создание свободной альтернативы проприетарной утилите compress, которая использовала алгоритм LZW, защищённый патентами компании Unisys. Кроме того, compress обеспечивала относительно низкую степень сжатия.
Первая версия gzip была выпущена 31 октября 1992 года. Алгоритм сжатия Deflate, разработанный Филом Кацем для программы PKZIP, был выбран как основа из-за его высокой эффективности и отсутствия патентных ограничений (патент на Deflate истёк в 2003 году). К 1993 году gzip стал стандартной утилитой для сжатия в дистрибутивах GNU/Linux и других системах на базе ядра Linux.
В 1996 году была опубликована спецификация формата gzip в виде RFC 1952. Она определила структуру потока данных, заголовков и контрольных сумм. С тех пор формат оставался стабильным, что обеспечило его совместимость на протяжении десятилетий.
Формат файла
Файл gzip (обычно с расширением .gz) состоит из последовательности блоков, каждый из которых содержит:
- Заголовок (10 байт): идентификатор (0x1F, 0x8B), метод сжатия (0x08 — Deflate), флаги, время модификации исходного файла, дополнительные флаги и идентификатор операционной системы.
- Дополнительные заголовки (опционально): могут включать имя исходного файла, комментарий, CRC-32 части данных и другие метаданные.
- Сжатые данные: поток, закодированный алгоритмом Deflate.
- Контрольная сумма (8 байт): CRC-32 исходных (несжатых) данных и длина исходных данных по модулю 2³².
Формат gzip не поддерживает архивирование нескольких файлов в один контейнер (в отличие от ZIP или RAR). Для объединения нескольких файлов используется предварительная упаковка в архив tar с последующим сжатием полученного .tar-файла — отсюда распространённое расширение .tar.gz (или .tgz).
Алгоритм сжатия
Основой gzip является алгоритм Deflate, который комбинирует два метода:
- LZ77 (словарное кодирование): поиск повторяющихся последовательностей байтов и замена их ссылками на предыдущие вхождения. Максимальная длина совпадения — 258 байт, максимальное расстояние поиска — 32 КБ.
- Кодирование Хаффмана: статистическое сжатие, при котором часто встречающиеся символы кодируются короткими кодами, а редкие — длинными. Deflate использует две таблицы Хаффмана: одну для литералов и длин совпадений, другую для расстояний.
Степень сжатия регулируется уровнем (от 1 до 9), который влияет на размер скользящего окна и глубину поиска совпадений. Уровень 1 обеспечивает максимальную скорость, уровень 9 — максимальное сжатие (но требует больше времени и памяти). По умолчанию используется уровень 6.
Использование в командной строке
Утилита gzip в Unix-подобных системах имеет стандартный интерфейс командной строки:
gzip файл— сжимает файл, заменяя его нафайл.gz.gzip -d файл.gz(илиgunzip файл.gz) — восстанавливает исходный файл.gzip -c файл > файл.gz— выводит сжатые данные в стандартный поток вывода (без удаления исходного файла).gzip -r директория— рекурсивно сжимает все файлы в директории.gzip -l файл.gz— показывает информацию о сжатом файле (степень сжатия, исходный размер, дата).
Аналогом для распаковки является команда gunzip, которая является символьной ссылкой на gzip.
Применение
Веб-серверы и HTTP
gzip является одним из основных методов сжатия в протоколе HTTP/1.1. Веб-серверы (Apache, Nginx, IIS) могут сжимать передаваемые клиенту ресурсы (HTML, CSS, JavaScript, JSON) с помощью gzip, что значительно уменьшает объём трафика. Клиент указывает поддержку gzip в заголовке Accept-Encoding: gzip, а сервер отвечает заголовком Content-Encoding: gzip. По данным исследований, сжатие gzip сокращает размер веб-страниц в среднем на 60–80%.
Архивирование и резервное копирование
В сочетании с tar gzip используется для создания сжатых архивов (tar.gz). Это стандартный формат распространения исходных кодов программного обеспечения в экосистеме GNU/Linux. Также применяется в системах резервного копирования (например, в утилитах rsync, dump).
Встраиваемые системы и прошивки
Из-за простоты реализации и малого потребления памяти gzip часто используется для сжатия прошивок устройств (роутеры, принтеры, микроконтроллеры). Алгоритм Deflate реализован в виде компактных библиотек (например, zlib), которые легко встраиваются в программное обеспечение.
Форматы файлов
Многие форматы данных используют gzip как внутренний метод сжатия:
- .gz — прямой формат gzip.
- .tar.gz (или .tgz) — архив tar, сжатый gzip.
- .svgz — сжатая версия SVG.
- .war (Java Web Application Archive) — может содержать сжатые компоненты.
- .deb (Debian) — формат пакетов Debian использует gzip для сжатия управляющих файлов.
Производительность и сравнение
gzip обеспечивает хороший баланс между скоростью сжатия и степенью сжатия для текстовых данных. По сравнению с более современными алгоритмами:
| Алгоритм | Скорость сжатия | Скорость распаковки | Степень сжатия (типичная) |
|---|---|---|---|
| gzip (уровень 6) | средняя | высокая | 60–70% |
| bzip2 | низкая | средняя | 70–80% |
| xz (LZMA) | низкая | средняя | 75–85% |
| zstd (уровень 3) | высокая | высокая | 65–75% |
| brotli (качество 4) | средняя | высокая | 70–80% |
gzip проигрывает современным алгоритмам (zstd, brotli) по степени сжатия, но остаётся стандартом де-факто благодаря всеобщей поддержке, простоте и надёжности.
Реализации
Основная реализация — gzip из проекта GNU (написана на C). Кроме неё существуют:
- zlib — библиотека, реализующая Deflate и gzip-формат. Используется в большинстве программ, работающих со сжатыми данными.
- miniz — компактная реализация на C для встраиваемых систем.
- pigz (Parallel Implementation of GZip) — многопоточная версия gzip, использующая несколько ядер процессора для ускорения сжатия.
- libz-ng — оптимизированная версия zlib с поддержкой SIMD-инструкций (SSE, AVX, NEON).
В операционных системах семейства Windows gzip не входит в стандартную поставку, но может быть установлен через пакетные менеджеры (Cygwin, MSYS2, WSL) или в составе утилит GNU.
Критика и ограничения
- Невозможность архивирования нескольких файлов: gzip сжимает только один поток данных, поэтому для создания многотомных архивов требуется предварительная упаковка (tar).
- Отсутствие восстановления после ошибок: повреждение одного блока данных может сделать недоступным весь файл.
- Устаревший алгоритм: Deflate не использует современные методы (контекстное моделирование, предсказание), что приводит к менее эффективному сжатию по сравнению с brotli или zstd.
- Отсутствие шифрования: gzip не предоставляет встроенных средств защиты данных; для шифрования необходимо использовать внешние инструменты (GnuPG, openssl).
Несмотря на эти ограничения, gzip остаётся одним из самых распространённых форматов сжатия благодаря своей зрелости, стабильности и всеобщей поддержке.
Источники
- RFC 1952 — GZIP file format specification version 4.3
- RFC 1951 — DEFLATE Compressed Data Format Specification version 1.3
- Gailly, J.-L., Adler, M. (1992). gzip: The data compression program — официальная документация проекта GNU
- Deutsch, P. (1996). Deflate Compressed Data Format Specification (RFC 1951)
- Salomon, D. (2007). Data Compression: The Complete Reference (4th ed.). Springer
- Sayood, K. (2017). Introduction to Data Compression (5th ed.). Morgan Kaufmann
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →