предисловие
GZip часто используется для передачи по сети на основе протокола HTTP, и GZip также можно открыть с помощью половины строки кода в Nginx. Каков принцип сжатия GZip? Эта статья представляет собой краткое изложение того, что я сделал после прочтения некоторой документации в Интернете.
Из RFC 1952 г.
RFC 1952даGZIP file format specification version 4.3
. Эта спецификация в основном определяет спецификацию формата данных сжатия GZip для облегчения передачи файлов и обмена ими между различными операционными системами, процессорами, файловыми системами и т. д. Выделим несколько интересных моментов ниже, если вам интересно, вы можете прочитать исходный текст RFC 1952.
Формат файла GZIP на самом деле предназначен для размещения нескольких сжатых наборов данных в одном файле — объединение фрагментов, сжатых с помощью GZIP. Но для большинства наших сценариев приложений это в основном один файл и один сжатый набор данных.Если несколько файлов упакованы вместе, несколько пакетов часто объединяются в один файл tar.
Каждый сжатый набор данных имеет следующую структуру:
| ID1 | ID2 | CM | FLG | MTIME (4 байта) | XFL | OS | ---> подробнее
|
а также|
Между ними 1 байт, все с обратным порядком байтов (Big Edian)
-
Где ID1 и ID2 — это 0x1f и 0x8b соответственно, используемые для идентификации формата файла — gzip.
-
Алгоритм шифрования идентификатора CM, в настоящее время 0-7 зарезервированы слова, 8 относится калгоритм выкачивания
-
FLG от младшего адреса к старшему: FTEXT, FHCRC, FEXTRA, FNAME, FCOMMENT, зарезервировано, зарезервировано, зарезервировано.Если вам интересно, что означает каждый бит после установки, вы можете обратиться к RFC 1952 за подробностями. Более интересна FEXTRA, если она настроена на указание наличия дополнительных полей расширения. Структура поля расширения следующая:
- | SI1 | SI2 | LEN | ... LEN bytes of subfield data ... |
- SI1 и SI2 — это идентификаторы субдоменов, состоящие из кодов ASCII. Если вам нужно его использовать, вы можете попросить его сопровождающего Жана-Лу Гайи.
<gzip@prep.ai.mit.edu>
Электронное приложение. В настоящее время файл Apollo имеет собственный уникальный идентификатор.
-
MTIME относится к времени последней модификации исходного файла, в котором хранится временная метка Unix.
-
XFL — это некоторые параметры, передаваемые алгоритму сжатия для определения способа распаковки. В алгоритме по умолчанию 2 означает использование алгоритма с самой высокой степенью сжатия, а 4 означает использование алгоритма с самой высокой скоростью сжатия.
-
ОС идентифицирует файловую систему, на которой работает компрессор, для работы с EOF и т. д.
-
Назад больше определяется в соответствии с открытием FLG, и может быть различная другая информация, такая как код проверки циклическим избыточным кодом, длина исходного файла, дополнительная информация и т. д.
Ядро сжатия Deflate
Ядром GZIP является Deflate, которыйRFC 1951был стандартизирован в , а затем использовался какLZWАльтернативы используются очень широко.
Deflate — это алгоритм, который использует как LZ77, так и кодирование Хаффмана, Вот краткое введение в общие идеи этих двух алгоритмов:
LZ77
Основная идея LZ77 заключается в том, что если в строке есть две повторяющиеся строки,Тогда вам нужно только знать содержимое первой строки и расстояние следующей строки от начальной позиции первой строки + длина строки.
Например: ABCDEFGABCDEFH → ABCDEFG(7,6)H. 7 относится к 7-му числу впереди, 6 относится к длине повторяющейся строки, ABCDEFG(7,6)H может полностью представлять предыдущую строку, и двусмысленности нет.
LZ77 реализует этот алгоритм, используя сжатие скользящего окна. Конкретная идея состоит в том, что сканирующая головка начинает сканирование строки с головы строки, а перед сканирующей головкой находится скользящее окно длиной N. Если вы найдете строки на сканирующей головке и в окнесамая длинная совпадающая строкаЕсли это то же самое, то используйте (расстояние между двумя строками, длину строки) для замены последней повторяющейся строки, а также необходимо добавить байт, указывающий, является ли это реальной строкой или замененной «строкой» впереди для удобства Распаковать (эта строка должна существовать как перед реальной строкой, так и перед заменой «строки»).
В реальном процессе размер скользящего окна фиксирован, а совпадающие строки также имеют ограничение на минимальную длину, так что фиксированы байты, занимаемые идентификатором + расстояние между двумя строками + длина строки и объем сжатия не должен быть больше. Для более подробной реализации, пожалуйста, обратитесь к:Standford Edu. lz77 algorithm,LZ77 Compression Algorithm,Подробное объяснение принципа кодирования алгоритма сжатия LZ77 (в сочетании с изображениями и простыми кодами)
Здесь проще объяснить, почему через этот механизм сжатия.CSS BEMПосле сжатия GZIP длину можно игнорировать, аИзображения JPEG могут увеличиваться после GZIPситуация
Декомпрессия: сжатие GZIP относительно неэффективно, потому что ему нужно найти повторяющиеся строки в окне (LZ77 значительно улучшился благодаря Hash и другим методам), так что насчет декомпрессии? Соблюдайте всю сжатую строку. Перед каждой маленькой строкой есть метка, помечающая, является ли она исходной строкой или замещающей «строкой». Благодаря этой метке сложность O (1) может использоваться для прямого чтения и замены "строка".Общая эффективность очень впечатляет.
Huffman Coding
Кодирование Хаффмана — это алгоритм, который обычно упоминается в учебниках для колледжей. Основная идея состоит в том, чтобы перекодировать символы путем построения дерева Хаффмана (ядро состоит в том, чтобы путь одного листа не был префиксом пути другого листа), чтобы гарантировать, что символы с более высокой частотой появления занимают меньше байтов. Построение дерева Хаффмана здесь подробно описываться не будет, если что непонятно, можно обратиться к:Huffman Coding.
Декомпрессия: после кодирования Хаффмана необходимо вести таблицу карты Хаффмана для записи перекодированных строк.Согласно этой таблице, также очень эффективно восстанавливать исходные строки.
Deflate всесторонне использует LZ77 и кодирование Хаффмана для сжатия файлов, что относительно улучшено. Для получения подробной информации см.Принцип и реализация gzip
Использование на веб-сайте
существуетRFC 2016Medium GZIP стал одним из трех указанных стандартных форматов сжатия HTTP. В настоящее время большинство веб-сайтов используют GZIP для передачи HTML, CSS, JavaScript и других файлов ресурсов.
Nginx включен
Nginxngx_http_gzip_moduleОн также предоставляет способ включения сжатия GZIP со следующими распространенными конфигурациями:
# 开启
gzip on;
# 压缩等级,1-9。设置多少可以参考:http://serverfault.com/questions/253074/what-is-the-best-nginx-compression-gzip-level
gzip_comp_level 2;
# "MSIE [1-6]\." 比如禁止 IE6 使用 GZIP
gzip_disable regex ...
# 最小压缩文件长度
gzip_min_length 20;
# 使用 GZIP 压缩的最小 HTTP 版本
gzip_http_version 1.1;
# 压缩的文件类型,值是 [MIME type](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Complete_list_of_MIME_types)
gzip_types text/html;
Обнаружение корреляции
После включения GZIP на Nginx сжатие теоретически будет открываться в соответствии с конфигурацией GZIP. Так как же проверить, прошла ли активация успешно?
Откройте браузер, зайдите на свой веб-сайт и посмотрите в сети Chrome.Если в поле «Размер» указаны два разных размера (например, 222 КБ и 613 КБ), это означает, что GZIP был успешно открыт.
Как браузер работает с сервером?
Когда браузер запрашивает ресурсы, он будет включен в заголовокaccept-encoding: gzip
параметр. Получив Header, Nginx обнаруживает, что если эта конфигурация есть, то он отправит файл после GZIP (возвращенный заголовок также содержит соответствующие инструкции), а если нет, то отправит исходный файл. Браузер решает, следует ли распаковывать и отображать возвращенный файл в соответствии с заголовком ответа.
Справочная документация
- RFC 1952 - GZIP file format specification version 4.3
- RFC 1951 - DEFLATE Compressed Data Format Specification version 1.3
- DEFLATE — Википедия, свободная энциклопедия
- LZW — Википедия, свободная энциклопедия
- LZ77 - Википедия, свободная энциклопедия
- Standford Edu. lz77 algorithm
- LZ77 Compression Algorithm
- Подробное объяснение принципа кодирования алгоритма сжатия LZ77 (в сочетании с изображениями и простыми кодами)
- Кодирование Хаффмана — Википедия, свободная энциклопедия
- Принцип и реализация gzip
- Module ngx_http_gzip_module
- What is the best nginx compression gzip level?
- MDN — полный список типов MIME
- Вы действительно понимаете gzip?
Оригинальная ссылка:GitHub.com/so coder/no...