Spec-Zone.ru › HTTP

Сжатие

Сжатие в HTTP

Сжатие — важный способ повысить производительность веб-сайта. Для некоторых документов уменьшение размера до 70% снижает потребность в пропускной способности канала. С годами алгоритмы также стали эффективнее, а клиенты и серверы начали поддерживать новые алгоритмы.

На практике веб-разработчикам не нужно реализовывать механизмы сжатия: они уже реализованы и в браузерах, и на серверах. Однако необходимо убедиться, что сервер настроен надлежащим образом. Сжатие может происходить на трех разных уровнях:

  • сначала некоторые форматы файлов сжимаются специальными оптимизированными методами;
  • затем может выполняться общее сжатие на уровне HTTP (ресурс передается от начала до конца в сжатом виде);
  • наконец, сжатие можно определить на уровне соединения между двумя узлами HTTP-соединения.

Сжатие форматов файлов

В каждом типе данных есть некоторая избыточность, то есть потраченное впустую пространство. Например, избыточность текста обычно достигает 60%, а для некоторых других типов данных, таких как аудио и видео, этот показатель может быть намного выше. В отличие от текста, для хранения данных в этих других типах медиа требуется много места, поэтому необходимость оптимизировать хранение и экономить пространство стала очевидной очень рано. Инженеры разработали оптимизированные алгоритмы сжатия, используемые форматами файлов, предназначенными именно для этой цели. Алгоритмы сжатия файлов можно разделить на две большие категории:

  • Сжатие без потерь, при котором цикл сжатия и распаковки не изменяет восстановленные данные. Они совпадают с оригиналом побайтно. Для изображений gif или png используют сжатие без потерь.
  • Сжатие с потерями, при котором исходные данные изменяются в ходе цикла так, чтобы пользователь (в идеале) не заметил изменений. Форматы видео в Интернете используют сжатие с потерями; формат изображений jpeg также использует сжатие с потерями.

Некоторые форматы, например webp, можно использовать как для сжатия без потерь, так и с потерями. Обычно алгоритм сжатия с потерями можно настроить на большую или меньшую степень сжатия, что, разумеется, влияет на качество. Для повышения производительности веб-сайта в идеале следует сжимать данные как можно сильнее, сохраняя при этом приемлемый уровень качества. Изображение, созданное с помощью какого-либо инструмента, может быть недостаточно оптимизировано для Интернета; рекомендуется использовать инструменты, которые обеспечивают максимально возможное сжатие при требуемом качестве. Для этого существует множество специализированных инструментов.

Алгоритмы сжатия с потерями обычно эффективнее алгоритмов сжатия без потерь.

Примечание: Поскольку сжатие эффективнее работает с файлами определенного типа, повторное сжатие обычно ничего не дает. Фактически это часто приводит к обратному результату: затраты на служебные данные (алгоритмам обычно нужен словарь, увеличивающий исходный размер) могут превысить дополнительный выигрыш от сжатия, в результате чего файл станет больше. Не используйте два следующих метода для файлов в сжатом формате.

Сквозное сжатие

Именно сквозное сжатие обеспечивает наибольший прирост производительности веб-сайтов. Сквозное сжатие — это сжатие тела сообщения, выполняемое сервером и сохраняющееся без изменений до тех пор, пока сообщение не достигнет клиента. Промежуточные узлы, какими бы они ни были, не изменяют тело сообщения.

A server sending a compressed HTTP body to a client via network nodes. The body is not decompressed at any hop through the network until it reaches the client.

Все современные браузеры и серверы поддерживают этот механизм; необходимо лишь согласовать алгоритм сжатия. Эти алгоритмы оптимизированы для текста. В 1990-х годах технологии сжатия быстро развивались, и к доступным вариантам последовательно добавлялись многочисленные алгоритмы. Сегодня актуальны только два: gzip, наиболее распространенный, и br, новый претендент.

Чтобы выбрать алгоритм, браузеры и серверы используют упреждающее согласование содержимого. Браузер отправляет заголовок Accept-Encoding с перечислением поддерживаемых алгоритмов в порядке предпочтения. Сервер выбирает один из них, использует его для сжатия тела ответа и указывает выбранный алгоритм браузеру в заголовке Content-Encoding. Поскольку для выбора представления на основе кодировки использовалось согласование содержимого, сервер должен отправить вместе с этим заголовком ответа заголовок Vary, содержащий как минимум Accept-Encoding. Благодаря этому кэши смогут сохранять разные представления ресурса.

A client requesting content with an 'Accept-Encoding: br, gzip' header. The server responds with a body compressed using the Brotli algorithm and the required 'Content-Encoding' and 'Vary' headers.

Поскольку сжатие значительно повышает производительность, рекомендуется включать его для всех файлов, кроме уже сжатых, например изображений, аудиофайлов и видео.

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, который уже загружен.

Покомпонентное сжатие

Покомпонентное сжатие похоже на сквозное, но отличается одним принципиальным моментом: сжатие выполняется не на ресурсе на сервере с созданием специального представления, которое затем передается, а над телом сообщения между любыми двумя узлами на пути от клиента к серверу. Для соединений между последовательными промежуточными узлами может применяться разное сжатие.

A server sending an uncompressed HTTP body to a client via network nodes. The body is compressed and decompressed by nodes on the network depending on 'Transfer-Encoding' headers before it reaches the client.

Для этого HTTP использует механизм, похожий на согласование содержимого при сквозном сжатии: узел, передающий запрос, сообщает о своих предпочтениях с помощью заголовка TE, а другой узел выбирает подходящий метод, применяет его и указывает свой выбор в заголовке Transfer-Encoding.

A client requesting content from a server with no compression-related headers. The server responds with an uncompressed body. The body is compressed and decompressed by nodes on the network before it reaches the client.

На практике покомпонентное сжатие прозрачно для сервера и клиента и используется редко. Заголовки TE и Transfer-Encoding в основном используются для передачи ответа частями, что позволяет начать передачу ресурса, не зная его длины.

Обратите внимание: использование Transfer-Encoding и сжатия на уровне узлов настолько редко, что в большинстве серверов, таких как Apache, Nginx и IIS, его нельзя легко настроить. Обычно такая настройка выполняется на уровне прокси-сервера.

См. также

  • Руководство по передаче словаря сжатия
  • Термины глоссария:
    • Сжатие Brotli
    • Сжатие Gzip
    • Сжатие без потерь
    • Сжатие с потерями
    • Сжатие Zstandard
    • Передача словаря сжатия

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API