Какие версии HTTP протокола существуют и в чём их ключевые отличия?

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

Ответ

Я работал с разными версиями 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** пока наблюдаю, так как инфраструктура поддержки в хостингах и балансировщиках нагрузки ещё не повсеместна.