Ответ
Классический HTTP/1.x (самая распространенная версия) основан на протоколе TCP (Transmission Control Protocol).
Как это работает:
- Клиент (браузер или
http-модуль Node.js) устанавливает TCP-соединение с сервером (обычно на порт 80 для HTTP или 443 для HTTPS). - По установленному надежному TCP-каналу передается текстовый HTTP-запрос.
- Сервер отправляет HTTP-ответ по тому же TCP-соединению.
- Соединение может быть закрыто или сохранено для повторного использования (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/3 — QUIC (поверх UDP).
Ответ 18+ 🔞
А, ну это ж классика, ёпта! Сидишь ты такой, пишешь на Node.js, и думаешь — а на чём там, блядь, этот ваш HTTP вообще ездит? Ну так вот, слушай сюда, сейчас разжую.
Основная версия, с которой все и сталкивались — это HTTP/1.x. И работает эта мартышлюшка поверх TCP (Transmission Control Protocol). Представь себе телефонный звонок, только для программ.
Как это происходит, если на пальцах:
- Твой браузер или твой же
http-модуль в Node.js такой: "Ага, надо стукнуться кexample.com". И начинает дозваниваться, устанавливая это самое TCP-соединение на порт 80 (или 443 для HTTPS, если ты не пидарас шерстяной и шифруешь трафик). - Соединение установилось — труба готова. По этой надёжной трубе клиент засовывает текстовый HTTP-запрос. Прямо как письмо в конверте.
- Сервер на том конце получает, читает, и по этой же самой трубе высылает ответ обратно.
- После этого трубу можно прикрыть (соединение закрыть), а можно и оставить приоткрытой на потом, если в заголовках стоит
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). Новый дерзкий гонщик, который не любит стоять в пробках.