Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про Node.js: HTTP, chunked transfer encoding, streaming, response body, Transfer-Encoding

Как работает механизм chunked transfer encoding в HTTP?

Этот вопрос проверяет понимание механизма передачи данных по частям в HTTP, который позволяет отправлять ответы, не зная их полный размер заранее.

Короткий ответ

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

Длинный ответ

Chunked Transfer Encoding — это метод, определённый в HTTP/1.1, который позволяет серверу отправлять тело HTTP-ответа серией фрагментов (чанков). Основная цель — передача данных, когда общая длина тела ответа неизвестна до начала отправки. Это часто используется для динамически генерируемого контента, такого как страницы, создаваемые на лету, результаты API, которые вычисляются постепенно, или стриминг событий (например, через Server-Sent Events).

Как это работает

Вместо заголовка Content-Length, сервер использует заголовок Transfer-Encoding: chunked. Тело ответа разбивается на последовательные блоки. Каждый блок имеет формат:

[размер чанка в HEX]\r\n
[данные чанка]\r\n

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

Пример потока данных

Представьте, что сервер отправляет сообщение "Hello, World!" по частям.

HTTP/1.1 200 OK
Transfer-Encoding: chunked

7\r\n
Hello, \r\n
6\r\n
World!\r\n
0\r\n
\r\n

Здесь первый чанк размером 7 байт содержит "Hello, ", второй чанк размером 6 байт содержит "World!". Чанк "0" сигнализирует об окончании.

Где применяется

  • Стриминг данных в реальном времени: Ленты новостей, обновления цен на бирже, live-чат.
  • Динамическая генерация больших файлов: Когда сервер создаёт отчёт или архив на лету и начинает отправку, не дожидаясь завершения генерации.
  • Прокси-серверы: Могут пересылать контент, получаемый из другого источника, по мере его поступления.
  • Современные API и фреймворки: Многие веб-фреймворки (Node.js с Express, Python с aiohttp) поддерживают chunked-ответы для эффективной работы с длительными операциями.

Пример кода на Node.js

const http = require('http');

const server = http.createServer((req, res) => {
    res.writeHead(200, { 'Transfer-Encoding': 'chunked' });
    
    // Имитация отправки данных частями
    const chunks = ['First part', 'Second part', 'Final part'];
    
    chunks.forEach((chunk, index) => {
        // Формат: размер в HEX, затем данные
        const size = Buffer.byteLength(chunk).toString(16);
        res.write(`${size}\r\n${chunk}\r\n`);
    });
    
    // Отправка завершающего нулевого чанка
    res.write('0\r\n\r\n');
    res.end();
});

server.listen(3000);

Вывод: Chunked Transfer Encoding — ключевой механизм для эффективной потоковой передачи данных в HTTP, когда размер ответа неизвестен заранее. Его стоит применять для стриминга динамического контента, чтобы уменьшить задержку для клиента и нагрузку на память сервера.

Уровень

  • Рейтинг:

    3

  • Сложность:

    5

Навыки

  • Node.js

    Node.js

  • Networks

Ключевые слова

#HTTP

#chunked transfer encoding

#streaming

#response body

#Transfer-Encoding

Подпишись на React Developer в телеграм