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

Ответ

Классический 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).

Ответ 18+ 🔞

А, ну это ж классика, ёпта! Сидишь ты такой, пишешь на Node.js, и думаешь — а на чём там, блядь, этот ваш HTTP вообще ездит? Ну так вот, слушай сюда, сейчас разжую.

Основная версия, с которой все и сталкивались — это HTTP/1.x. И работает эта мартышлюшка поверх TCP (Transmission Control Protocol). Представь себе телефонный звонок, только для программ.

Как это происходит, если на пальцах:

  1. Твой браузер или твой же http-модуль в Node.js такой: "Ага, надо стукнуться к example.com". И начинает дозваниваться, устанавливая это самое TCP-соединение на порт 80 (или 443 для HTTPS, если ты не пидарас шерстяной и шифруешь трафик).
  2. Соединение установилось — труба готова. По этой надёжной трубе клиент засовывает текстовый HTTP-запрос. Прямо как письмо в конверте.
  3. Сервер на том конце получает, читает, и по этой же самой трубе высылает ответ обратно.
  4. После этого трубу можно прикрыть (соединение закрыть), а можно и оставить приоткрытой на потом, если в заголовках стоит keep-alive — чтобы заново не звонить, если ещё запросы будут. Умно, да?

Вот тебе пример, как это выглядит изнутри, на голом TCP в Node.js. Смотри, какой колхоз:

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()); // Вывалит на экран всю хрень: заголовки и тело ответа.
  client.end();
});

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

Видишь? Никакой магии. Просто текстовый протокол по банальной TCP-трубе. Эволюция, блядь, не стояла на месте:

  • HTTP/2 — та же самая история с TCP, но чуваки поумнели. Взяли и перешли с текста на бинарные фреймы, да ещё и мультиплексирование добавили, чтобы несколько запросов в одной трубе не толкались. Эффективность — овердохуища.
  • А вот HTTP/3 — это уже полный пиздец и отрыв от шаблона. Тут ребята сказали: "Да похуй на ваш TCP, он иногда тормозит как вмазанный". И пересели на протокол QUIC, который юзает UDP. QUIC сам внутри решает проблемы TCP с установкой соединения и этой дурацкой "блокировкой начала очереди", когда один плохой пакет всё тормозит.

Итог, чтобы ты, чувак, запомнил: Для HTTP/1.1 и HTTP/2 — ответ TCP. Старая добрая надёжная труба. Для HTTP/3 — ответ QUIC (который поверх UDP). Новый дерзкий гонщик, который не любит стоять в пробках.