Transfer-Encoding
Применение
Заголовок Transfer-Encoding — попрыжковый (hop-by-hop) заголовок, описывающий, как тело сообщения закодировано для текущего участка соединения. Каждый промежуточный узел (прокси, шлюз) декодирует транспортное кодирование, обрабатывает сообщение и кодирует его заново перед пересылкой следующему узлу.
Самое распространённое значение — chunked: оно позволяет серверу начать потоковую передачу ответа, ещё не зная суммарного Content-Length. Сервер разбивает тело на фрагменты, каждому из которых предшествует указатель размера. Фрагмент нулевой длины обозначает конец сообщения.
В отличие от Content-Encoding, применяющего сквозное сжатие к самому ресурсу, Transfer-Encoding действует только между двумя соседними узлами. Сервер, отправляющий сжатый gzip ресурс по chunked-соединению, использует Content-Encoding для сжатия и Transfer-Encoding для разбиения на фрагменты.
Когда Transfer-Encoding появляется в ответе на HTTP-запрос HEAD, его значение отражает кодирование, которое сервер применил бы к телу в соответствующем ответе на GET.
Примечание
Content-Encoding действует сквозным образом: сжимается сам ресурс (например, gzip), и каждый получатель декодирует полезную нагрузку. Transfer-Encoding действует попрыжково: кодирование применяется для передачи между двумя соседними узлами и снимается на каждом переходе. Ответ может нести оба заголовка одновременно, используя Content-Encoding для сжатия ресурса и Transfer-Encoding для доставки по фрагментам.
Примечание
HTTP-заголовок Transfer-Encoding не имеет отношения к почтовому Content-Transfer-Encoding, который отвечает за MIME-кодирование тел писем, например base64 или quoted-printable.
Примечание
Заголовок Transfer-Encoding запрещён в HTTP/2 и HTTP/3. Эти протоколы предоставляют собственные механизмы кадрирования данных, из-за чего кодирование на транспортном уровне становится излишним.
chunked
Директива chunked разбивает тело сообщения на последовательность фрагментов. Каждый фрагмент начинается с размера фрагмента в шестнадцатеричном виде, за которым следуют данные фрагмента. Завершающий фрагмент нулевого размера завершает сообщение. Заголовок Trailer перечисляет поля, добавляемые после последнего фрагмента.
compress
Директива compress применяет сжатие Lempel-Ziv-Welch (LZW). Это кодирование в современных развёртываниях используется редко.
deflate
Директива deflate применяет zlib-сжатие по алгоритму deflate.
gzip
Директива gzip применяет кодирование Лемпеля — Зива (LZ77) с 32-битной контрольной суммой CRC. Это тот же алгоритм, что используется в формате файлов gzip, и он широко поддерживается HTTP-реализациями.
Пример
Сервер отправляет chunked-ответ. Отсутствие заголовка Content-Length указывает, что сервер передаёт тело потоком, по частям.
HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked
7\r\n
Mozilla\r\n
9\r\n
Developer\r\n
0\r\n
\r\n
Несколько транспортных кодирований применяются по порядку. В этом ответе тело сначала сжимается gzip, а затем разбивается на фрагменты для передачи.
Transfer-Encoding: gzip, chunked