Открыть сервис

Фрагментированная передача данных в HTTP

Фрагментированная передача данных в HTTP — механизм протокола HTTP, позволяющий серверу передавать тело ответа клиенту частями (фрагментами, чанками) без указания точного размера тела в заголовке Content-Length. Данный механизм реализуется через заголовок Transfer-Encoding: chunked и используется для потоковой передачи данных, когда полный размер ответа неизвестен на момент начала отправки.

История и стандартизация

Механизм фрагментированной передачи данных был определён в спецификации HTTP/1.1, описанной в документе RFC 2616 (1999 год). Впоследствии он был уточнён в RFC 7230 (2014 год), который заменил предыдущую редакцию. В HTTP/2 данный механизм был заменён на фреймовую структуру передачи данных, однако для обратной совместимости с HTTP/1.1 он продолжает использоваться. В HTTP/3, основанном на протоколе QUIC, передача данных также осуществляется через отдельные потоки, что делает чанкование избыточным, но не запрещённым при согласовании версий.

Принцип работы

При использовании Transfer-Encoding: chunked тело ответа разбивается на последовательность блоков. Каждый блок состоит из строки, содержащей размер фрагмента в шестнадцатеричном формате, за которой следует перевод строки (CRLF), затем сам фрагмент данных, и завершающий CRLF. Последний блок имеет нулевой размер, что сигнализирует об окончании передачи.

Пример структуры чанкованного ответа:

``` HTTP/1.1 200 OK Content-Type: text/plain Transfer-Encoding: chunked

25 Здесь находится первая часть данных... 1c А здесь вторая часть данных. 0 ```

В данном примере первый фрагмент имеет размер 0x25 (37 байт), второй — 0x1c (28 байт). Завершающий блок 0 указывает на конец тела.

Назначение и преимущества

Основное назначение механизма — передача данных, размер которых заранее неизвестен. Это характерно для следующих ситуаций:

  • Динамическая генерация контента — когда сервер формирует ответ в процессе передачи (например, результаты поиска, отчёты, данные из потоковых источников).
  • Потоковая передача медиа — трансляция аудио- и видеопотоков, где продолжительность и объём данных не фиксированы.
  • Передача данных от внешних источников — когда сервер выступает прокси и передаёт данные, получаемые от другого сервера, без предварительной буферизации.

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

Отличия от Content-Length

Обычно размер тела ответа указывается в заголовке Content-Length. Использование Transfer-Encoding: chunked исключает необходимость в этом заголовке. Если оба заголовка присутствуют одновременно, Transfer-Encoding имеет приоритет, а Content-Length игнорируется. Сервер не может использовать Transfer-Encoding: chunked для ответов с кодом 1xx (информационные), 204 (нет содержимого) и для ответов на запросы методом HEAD.

Обработка на стороне клиента

Клиенты (браузеры, HTTP-библиотеки) автоматически распознают заголовок Transfer-Encoding: chunked и декодируют фрагментированное тело, собирая его в единый поток данных. Для разработчика прикладного кода процесс декодирования обычно прозрачен. Однако при низкоуровневой работе с HTTP-сокетами необходимо вручную обрабатывать чанки, учитывая их размеры и завершающий нулевой блок.

Применение в серверных технологиях

Многие серверные платформы и фреймворки поддерживают чанкованную передачу данных. Например:

  • Node.js — модуль http автоматически использует Transfer-Encoding: chunked, если размер ответа не задан явно через Content-Length.
  • Nginx — поддерживает чанкование при передаче ответов от проксируемых серверов и при включении определённых директив.
  • Python (WSGI-серверы) — например, gunicorn или uWSGI могут передавать ответы чанками при использовании потоковых генераторов.

Ограничения и особенности

Механизм имеет ряд ограничений. В HTTP/1.1 чанкованная передача возможна только в одном направлении — от сервера к клиенту. Для передачи данных от клиента к серверу (например, при загрузке больших файлов) применяется Transfer-Encoding: chunked в запросах, но это поддерживается реже и требует явной реализации.

В HTTP/2 и HTTP/3 фрагментация на уровне приложения заменена фреймовой структурой, что повышает эффективность мультиплексирования. Однако при работе через прокси или при понижении версии протокола до HTTP/1.1 чанкование может применяться повторно.

Также стоит учитывать, что при использовании сжатия (например, Content-Encoding: gzip) данные сжимаются до разбиения на фрагменты, и размеры чанков соответствуют сжатому потоку.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →