Этот вопрос проверяет понимание механизма передачи данных по частям в HTTP, который позволяет отправлять ответы, не зная их полный размер заранее.
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" сигнализирует об окончании.
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, когда размер ответа неизвестен заранее. Его стоит применять для стриминга динамического контента, чтобы уменьшить задержку для клиента и нагрузку на память сервера.