HTTP/2 и HTTP/3: чем отличаются и что быстрее
Протокол HTTP — основа современного веба. Эволюция от HTTP/1.1 к HTTP/2 и HTTP/3 принесла значительные улучшения производительности. Понимание различий между этими версиями помогает правильно настроить сервер и ускорить загрузку сайта.
Краткая история HTTP
| Версия | Год | Транспорт | Ключевое нововведение |
|---|---|---|---|
| HTTP/1.0 | 1996 | TCP | Базовый протокол |
| HTTP/1.1 | 1997 | TCP | Keep-alive, chunked transfer, Host header |
| HTTP/2 | 2015 | TCP + TLS | Мультиплексирование, сжатие заголовков, server push |
| HTTP/3 | 2022 | QUIC (UDP) | Устранение HOL blocking на транспортном уровне |
HTTP/1.1 — проблемы
HTTP/1.1 — простой и понятный, но у него есть серьёзные ограничения производительности:
- Один запрос за раз — каждое TCP-соединение обрабатывает запросы последовательно. Браузеры открывают 6–8 параллельных соединений к одному домену, но этого недостаточно для современных сайтов с десятками ресурсов.
- Текстовые заголовки — заголовки передаются в текстовом виде и повторяются в каждом запросе. Cookie и другие заголовки могут занимать несколько килобайт.
- Отсутствие приоритизации — все ресурсы загружаются с одинаковым приоритетом.
HTTP/2 — мультиплексирование
HTTP/2 решает проблемы HTTP/1.1 с помощью бинарного фрейминга:
Мультиплексирование
Несколько запросов и ответов передаются одновременно через одно TCP-соединение. Каждый запрос — это отдельный «поток» (stream), и потоки не блокируют друг друга на уровне HTTP.
Сжатие заголовков (HPACK)
HTTP/2 использует алгоритм HPACK для сжатия заголовков. Повторяющиеся заголовки (Host, User-Agent, Accept) кодируются индексами, что сокращает размер на 85–90%.
Приоритизация потоков
Клиент может указать приоритет каждого запроса. CSS и JS могут загружаться с высоким приоритетом, а изображения — с низким.
Server Push
Сервер может отправить ресурсы до того, как клиент их запросит. Например, вместе с HTML сразу отправить CSS. На практике Server Push используется редко из-за сложности настройки и кэширования.
Проблема HTTP/2: Head-of-Line Blocking
Хотя HTTP/2 мультиплексирует потоки на уровне HTTP, все они передаются через одно TCP-соединение. Если теряется один TCP-пакет, все потоки блокируются до его повторной передачи. Это называется TCP Head-of-Line Blocking.
HTTP/3 — QUIC вместо TCP
HTTP/3 решает проблему HOL blocking, заменив TCP на QUIC — новый транспортный протокол на базе UDP.
QUIC: главные преимущества
- Независимые потоки — потеря пакета в одном потоке не блокирует остальные. Каждый поток в QUIC независим на транспортном уровне.
- Быстрое установление соединения — QUIC объединяет TLS-хэндшейк с транспортным, сокращая время установления соединения с 2–3 RTT (TCP + TLS) до 1 RTT (или 0-RTT для повторных соединений).
- Миграция соединения — при смене сети (Wi-Fi → мобильная связь) соединение сохраняется, потому что QUIC использует Connection ID вместо IP:port.
- Встроенное шифрование — TLS 1.3 встроен в протокол. Незашифрованный HTTP/3 невозможен.
Сравнение производительности
| Параметр | HTTP/1.1 | HTTP/2 | HTTP/3 |
|---|---|---|---|
| Установление соединения | 1 RTT (TCP) + 2 RTT (TLS) | 1 RTT (TCP) + 1 RTT (TLS 1.3) | 1 RTT (QUIC+TLS) / 0-RTT |
| Параллельные запросы | 6–8 соединений | Неограниченно (1 соединение) | Неограниченно (1 соединение) |
| HOL blocking | На уровне HTTP | На уровне TCP | Отсутствует |
| Сжатие заголовков | Нет | HPACK | QPACK |
| Потеря пакетов | Блокирует всё | Блокирует всё | Блокирует только один поток |
Когда HTTP/3 заметно быстрее
- На мобильных сетях с высоким процентом потери пакетов
- При высокой задержке (RTT > 100 мс)
- При частой смене сети (мобильные устройства)
- Для сайтов с большим количеством мелких ресурсов
Как проверить протокол сайта
Проверить, какой протокол HTTP использует сайт, можно несколькими способами:
В браузере
Откройте DevTools (F12) → Network → правой кнопкой по заголовку столбцов → включите «Protocol». Вы увидите h2 (HTTP/2) или h3 (HTTP/3) для каждого ресурса.
Через curl
# HTTP/2
curl -I --http2 https://example.com
# HTTP/3 (требует curl с поддержкой QUIC)
curl -I --http3 https://example.com
Онлайн-инструменты
Инструмент проверки проверку HTTP-заголовков на Enterno.io показывает версию протокола в ответе сервера.
Настройка на сервере
nginx (HTTP/2)
server {
listen 443 ssl;
http2 on;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
}
nginx (HTTP/3)
server {
listen 443 ssl;
http2 on;
listen 443 quic reuseport;
http3 on;
add_header Alt-Svc 'h3=":443"; ma=86400';
}
Рекомендации
- Включите HTTP/2 — это минимум для современного сайта
- Рассмотрите HTTP/3, если ваша аудитория на мобильных устройствах
- Не отключайте HTTP/1.1 — нужен как fallback
- Используйте TLS 1.3 для максимальной производительности
- Регулярно проверяйте протокол через инструменты анализа заголовков
Проверьте ваш сайт прямо сейчас
Проверить →