На каком транспортном протоколе основан HTTP-запрос?

«На каком транспортном протоколе основан HTTP-запрос?» — вопрос из категории Сети, который задают на 26% собеседований Node.js Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Классический HTTP/1.x (самая распространенная версия) основан на протоколе TCP (Transmission Control Protocol).

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

  1. Клиент (браузер или http-модуль Node.js) устанавливает TCP-соединение с сервером (обычно на порт 80 для HTTP или 443 для HTTPS).
  2. По установленному надежному TCP-каналу передается текстовый HTTP-запрос.
  3. Сервер отправляет HTTP-ответ по тому же TCP-соединению.
  4. Соединение может быть закрыто или сохранено для повторного использования (keep-alive).

Пример низкоуровневого TCP-клиента на Node.js, отправляющего HTTP-запрос:

const net = require('net');

const client = net.createConnection({ port: 80, host: 'example.com' }, () => {
  // После подключения отправляем сырой HTTP-запрос
  client.write('GET / HTTP/1.1rn');
  client.write('Host: example.comrn');
  client.write('Connection: closern');
  client.write('rn'); // Пустая строка - конец заголовков
});

client.on('data', (data) => {
  console.log('Ответ от сервера:');
  console.log(data.toString()); // Выведет HTTP-заголовки и тело
  client.end();
});

client.on('end', () => {
  console.log('Соединение закрыто');
});

Эволюция:

  • HTTP/2 также работает поверх TCP, но использует бинарные фреймы и мультиплексирование для большей эффективности.
  • HTTP/3 — это новая версия, которая отказывается от TCP в пользу протокола QUIC, работающего поверх UDP. QUIC решает проблемы задержки при установке TCP-соединения и «блокировки начала очереди» (head-of-line blocking).

Таким образом, для HTTP/1.1 и HTTP/2 ответ — TCP. Для HTTP/3QUIC (поверх UDP).