Ответ
Я работал с разными версиями HTTP, и их эволюция напрямую влияет на производительность Node.js-приложений.
**HTTP/1.1 (1997) — текущий стандарт де-факто.**
* **Основная модель:** Один запрос — один ответ на одно TCP-соединение. Для параллелизма браузеры открывают несколько соединений (обычно 6-8).
* **Ключевые фичи для Node.js:** Keep-Alive соединения (переиспользование TCP-канала), chunked transfer encoding для стриминга.
* **Проблема:** Head-of-line blocking — если первый запрос в очереди медленный, последующие ждут.
**HTTP/2 (2015) — бинарный протокол для производительности.**
* **Мультиплексирование:** Множество запросов и ответов могут передаваться параллельно в рамках **одного** TCP-соединения, решая проблему блокировки.
* **Сжатие заголовков (HPACK):** Уменьшает оверхеды.
* **Server Push:** Сервер может отправить клиенту ресурсы (например, CSS), которые, как он предсказывает, понадобятся.
* **В Node.js:** Поддержка нативно с Node.js 8.4.0+. Используется через модуль `http2`.
```javascript
const http2 = require('http2');
const server = http2.createSecureServer({ cert, key });
server.on('stream', (stream, headers) => {
stream.respond({ ':status': 200, 'content-type': 'text/html' });
stream.end('
Hello HTTP/2
'); }); ``` **HTTP/3 (2022) — протокол на основе QUIC (поверх UDP).** * **Решает фундаментальную проблему TCP:** В HTTP/2 мультиплексирование работает поверх одного TCP-соединения. Потеря одного пакета приводит к блокировке всех потоков в этом соединении (TCP-level HOL blocking). * **QUIC:** Интегрирует TLS 1.3, обеспечивает независимые потоки. Потеря пакета в одном потоке не влияет на другие. * **Быстрое установление соединения:** 0-RTT handshake для повторных подключений. * **В Node.js:** Экспериментальная поддержка через флаг `--experimental-quic`. На практике часто используется через прокси (например, Cloudflare). **Практический выбор:** Для публичного API или веб-приложения обязательно включаю поддержку **HTTP/2** (чаще через TLS, так как браузеры требуют HTTPS для HTTP/2). Это даёт заметный прирост скорости загрузки страниц с множеством ресурсов. За **HTTP/3** пока наблюдаю, так как инфраструктура поддержки в хостингах и балансировщиках нагрузки ещё не повсеместна.Ответ 18+ 🔞
Слушай, история с этими HTTP-версиями — это просто ёперный театр какой-то. Сидишь, блядь, пишешь сервер, а тут оказывается, что протокол, на котором пол-интернета ездит, по сути — старый дед, который бензин хавает как не в себя и всех тормозит. Речь про HTTP/1.1, который с 97-го года. Его основная фишка — один запрос, один ответ, и точка. Хочешь параллельно? Открывай, сука, ещё пять-шесть таких же соединений, как будто на дворе 2002-й год и модем пищит. Проблема в том, что если первый запрос в очереди — тормоз, то все остальные за ним просто стоят и курят, это называется Head-of-line blocking. Удивление пиздец, как на этом вообще что-то быстро работает.
Потом в 2015-м пришёл HTTP/2, и тут уже началось что-то адекватное. Овердохуища пользы. Всё гениальное просто: делаем один TCP-канал, а внутри него — хуй с горы — мультиплексирование. То есть кучу запросов и ответов можно гнать параллельно, и если один файл большой, он остальных не блокирует. Ещё заголовки сжимаются, и сервер может сам, с подвохом, закинуть тебе в браузер стили или скрипты, которые ты ещё не просил, но вот-вот попросишь (Server Push). В Node.js с 8.4+ это из коробки, через модуль `http2`. Выглядит почти так же, но уже не так печально.
```javascript
const http2 = require('http2');
const server = http2.createSecureServer({ cert, key });
server.on('stream', (stream, headers) => {
stream.respond({ ':status': 200, 'content-type': 'text/html' });
stream.end('