Сжатие
Сжатие в HTTP
Сжатие — важный способ повысить производительность веб-сайта. Для некоторых документов уменьшение размера до 70% снижает потребность в пропускной способности канала. С годами алгоритмы также стали эффективнее, а клиенты и серверы начали поддерживать новые алгоритмы.
На практике веб-разработчикам не нужно реализовывать механизмы сжатия: они уже реализованы и в браузерах, и на серверах. Однако необходимо убедиться, что сервер настроен надлежащим образом. Сжатие может происходить на трех разных уровнях:
- сначала некоторые форматы файлов сжимаются специальными оптимизированными методами;
- затем может выполняться общее сжатие на уровне HTTP (ресурс передается от начала до конца в сжатом виде);
- наконец, сжатие можно определить на уровне соединения между двумя узлами HTTP-соединения.
Сжатие форматов файлов
В каждом типе данных есть некоторая избыточность, то есть потраченное впустую пространство. Например, избыточность текста обычно достигает 60%, а для некоторых других типов данных, таких как аудио и видео, этот показатель может быть намного выше. В отличие от текста, для хранения данных в этих других типах медиа требуется много места, поэтому необходимость оптимизировать хранение и экономить пространство стала очевидной очень рано. Инженеры разработали оптимизированные алгоритмы сжатия, используемые форматами файлов, предназначенными именно для этой цели. Алгоритмы сжатия файлов можно разделить на две большие категории:
-
Сжатие без потерь, при котором цикл сжатия и распаковки не изменяет восстановленные данные. Они совпадают с оригиналом побайтно. Для изображений
gifилиpngиспользуют сжатие без потерь. -
Сжатие с потерями, при котором исходные данные изменяются в ходе цикла так, чтобы пользователь (в идеале) не заметил изменений. Форматы видео в Интернете используют сжатие с потерями; формат изображений
jpegтакже использует сжатие с потерями.
Некоторые форматы, например webp, можно использовать как для сжатия без потерь, так и с потерями. Обычно алгоритм сжатия с потерями можно настроить на большую или меньшую степень сжатия, что, разумеется, влияет на качество. Для повышения производительности веб-сайта в идеале следует сжимать данные как можно сильнее, сохраняя при этом приемлемый уровень качества. Изображение, созданное с помощью какого-либо инструмента, может быть недостаточно оптимизировано для Интернета; рекомендуется использовать инструменты, которые обеспечивают максимально возможное сжатие при требуемом качестве. Для этого существует множество специализированных инструментов.
Алгоритмы сжатия с потерями обычно эффективнее алгоритмов сжатия без потерь.
Примечание: Поскольку сжатие эффективнее работает с файлами определенного типа, повторное сжатие обычно ничего не дает. Фактически это часто приводит к обратному результату: затраты на служебные данные (алгоритмам обычно нужен словарь, увеличивающий исходный размер) могут превысить дополнительный выигрыш от сжатия, в результате чего файл станет больше. Не используйте два следующих метода для файлов в сжатом формате.
Сквозное сжатие
Именно сквозное сжатие обеспечивает наибольший прирост производительности веб-сайтов. Сквозное сжатие — это сжатие тела сообщения, выполняемое сервером и сохраняющееся без изменений до тех пор, пока сообщение не достигнет клиента. Промежуточные узлы, какими бы они ни были, не изменяют тело сообщения.
Все современные браузеры и серверы поддерживают этот механизм; необходимо лишь согласовать алгоритм сжатия. Эти алгоритмы оптимизированы для текста. В 1990-х годах технологии сжатия быстро развивались, и к доступным вариантам последовательно добавлялись многочисленные алгоритмы. Сегодня актуальны только два: gzip, наиболее распространенный, и br, новый претендент.
Чтобы выбрать алгоритм, браузеры и серверы используют упреждающее согласование содержимого. Браузер отправляет заголовок Accept-Encoding с перечислением поддерживаемых алгоритмов в порядке предпочтения. Сервер выбирает один из них, использует его для сжатия тела ответа и указывает выбранный алгоритм браузеру в заголовке Content-Encoding. Поскольку для выбора представления на основе кодировки использовалось согласование содержимого, сервер должен отправить вместе с этим заголовком ответа заголовок Vary, содержащий как минимум Accept-Encoding. Благодаря этому кэши смогут сохранять разные представления ресурса.
Поскольку сжатие значительно повышает производительность, рекомендуется включать его для всех файлов, кроме уже сжатых, например изображений, аудиофайлов и видео.
Apache поддерживает сжатие с помощью mod_deflate; для Nginx существует ngx_http_gzip_module; для IIS используется элемент <httpCompression>.
Передача словаря сжатия
Современные форматы сжатия, такие как сжатие Brotli и сжатие Zstandard, могут использовать словари часто встречающихся данных, чтобы повысить степень сжатия по сравнению с простым обращением к данным внутри сжимаемого файла. Обычно в HTTP-ответах для этого используется предопределенный статический словарь, включенный в формат (например, статический словарь Brotli доступен в исходном коде).
Передача словаря сжатия позволяет разработчику указать ресурс, который можно использовать в качестве словаря для последующих запросов. Это может быть как специальный файл словаря, так и существующий ресурс (например, использование app.v1.js в качестве словаря при загрузке app.v2.js). Как правило, это повышает степень сжатия и, следовательно, ускоряет загрузку. В примере с app.vX.js большая часть данных будет состоять только из разницы между двумя версиями, а общие байты можно будет взять из исходного файла app.v1.js, который уже загружен.
Покомпонентное сжатие
Покомпонентное сжатие похоже на сквозное, но отличается одним принципиальным моментом: сжатие выполняется не на ресурсе на сервере с созданием специального представления, которое затем передается, а над телом сообщения между любыми двумя узлами на пути от клиента к серверу. Для соединений между последовательными промежуточными узлами может применяться разное сжатие.
Для этого HTTP использует механизм, похожий на согласование содержимого при сквозном сжатии: узел, передающий запрос, сообщает о своих предпочтениях с помощью заголовка TE, а другой узел выбирает подходящий метод, применяет его и указывает свой выбор в заголовке Transfer-Encoding.
На практике покомпонентное сжатие прозрачно для сервера и клиента и используется редко. Заголовки TE и Transfer-Encoding в основном используются для передачи ответа частями, что позволяет начать передачу ресурса, не зная его длины.
Обратите внимание: использование Transfer-Encoding и сжатия на уровне узлов настолько редко, что в большинстве серверов, таких как Apache, Nginx и IIS, его нельзя легко настроить. Обычно такая настройка выполняется на уровне прокси-сервера.
См. также
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Compression