[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-ustroystvo-pk-i-seti-chem-otlichayutsya-http-1-1-http-2-i-http-3":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":22,"progress":23,"seo":24},236,"chem-otlichayutsya-http-1-1-http-2-i-http-3",7,"ustroystvo-pk-i-seti","Устройство ПК и сети","🖥️","Чем отличаются HTTP\u002F1.1, HTTP\u002F2 и HTTP\u002F3?","**HTTP\u002F1.1, HTTP\u002F2 и HTTP\u002F3** — три поколения протокола HTTP, каждое из которых решает проблемы предыдущего: от текстового протокола с блокировкой до бинарного мультиплексированного протокола поверх QUIC.\n\n### Сравнительная таблица\n\n| Свойство | HTTP\u002F1.1 | HTTP\u002F2 | HTTP\u002F3 |\n|---|---|---|---|\n| Год стандартизации | 1997 | 2015 | 2022 |\n| Транспорт | TCP | TCP | QUIC (поверх UDP) |\n| Формат | Текстовый | Бинарный | Бинарный |\n| Мультиплексирование | Нет (один запрос за раз на соединение) | Да (множество потоков в одном TCP-соединении) | Да (потоки независимы) |\n| Head-of-line blocking | На уровне HTTP и TCP | Решено на уровне HTTP, но остаётся на уровне TCP | Полностью решено |\n| Сжатие заголовков | Нет | HPACK | QPACK |\n| Server Push | Нет | Да | Да (редко используется) |\n| Шифрование | Опционально (HTTPS) | Фактически обязательно | Обязательно (встроено в QUIC) |\n| Время установления соединения | 1 RTT (TCP) + 2 RTT (TLS 1.2) | 1 RTT (TCP) + 1 RTT (TLS 1.3) | 1 RTT (QUIC + TLS 1.3), 0-RTT при повторном |\n\n### HTTP\u002F1.1\n\n- Один запрос за раз на одно TCP-соединение. **Pipelining** существует в спецификации, но на практике не работает из-за head-of-line blocking (ответы должны приходить в порядке запросов)\n- Для параллельности браузеры открывают **6–8 TCP-соединений** к одному серверу\n- Заголовки передаются текстом, повторяются в каждом запросе (Cookie, User-Agent — десятки и сотни байт)\n- Оптимизации-«костыли»: keep-alive, конкатенация файлов, CSS-спрайты, domain sharding\n\n### HTTP\u002F2\n\n- **Бинарный протокол** — данные передаются в виде фреймов (frames), что эффективнее парсинга текста\n- **Мультиплексирование** — множество запросов и ответов передаются одновременно по одному TCP-соединению, чередуясь фреймами. Не нужно ждать завершения предыдущего запроса\n- **Сжатие заголовков (HPACK)** — заголовки сжимаются и индексируются; повторяющиеся заголовки передаются как ссылки на индекс\n- **Server Push** — сервер может отправить ресурсы до того, как клиент их запросит (например, CSS к HTML-странице)\n- **Проблема:** head-of-line blocking на уровне TCP — если один TCP-пакет потерян, **все** потоки HTTP\u002F2 ждут его повторной передачи, даже если потеря касается только одного потока\n\n### HTTP\u002F3\n\n- Использует **QUIC** — транспортный протокол поверх UDP, разработанный Google\n- Каждый HTTP-поток в QUIC **независим**: потеря пакета одного потока не блокирует другие — head-of-line blocking полностью решён\n- Встроенное шифрование (TLS 1.3) — handshake QUIC и TLS происходят одновременно, что сокращает время установления соединения\n- **0-RTT** — при повторном подключении к серверу данные могут отправляться сразу, без ожидания handshake\n- **Миграция соединений** — QUIC идентифицирует соединение по Connection ID, а не по IP:port, что позволяет сохранять соединение при смене сети (Wi-Fi → мобильная сеть)\n- Лучше работает при нестабильном соединении (мобильные сети, потери пакетов)\n\n### Эволюция решения проблемы HOL blocking\n\n```\nHTTP\u002F1.1: Запрос 1 ──→ Ответ 1 ──→ Запрос 2 ──→ Ответ 2   (последовательно)\n\nHTTP\u002F2:   Запрос 1 ─┐                                       (мультиплекс, но\n          Запрос 2 ─┤── один TCP-поток ──→ TCP потеря ──→    все ждут)\n          Запрос 3 ─┘\n\nHTTP\u002F3:   Запрос 1 ─── QUIC поток 1 ──→ потеря ──→ ждёт только поток 1\n          Запрос 2 ─── QUIC поток 2 ──→ OK        (независимо)\n          Запрос 3 ─── QUIC поток 3 ──→ OK        (независимо)\n```\n\n### Для Java-разработчика\n\n- `java.net.http.HttpClient` (Java 11+) поддерживает HTTP\u002F1.1 и HTTP\u002F2\n- Spring Boot (Tomcat, Jetty, Netty) поддерживает HTTP\u002F2 с минимальной конфигурацией (`server.http2.enabled=true`)\n- Для HTTP\u002F3 пока нужны сторонние библиотеки или reverse proxy (Nginx 1.25+, Caddy, HAProxy)\n- В микросервисной архитектуре HTTP\u002F2 между сервисами (например, gRPC) даёт существенный прирост за счёт мультиплексирования\n\n### Вывод\n\nHTTP\u002F1.1 → HTTP\u002F2 → HTTP\u002F3 — это эволюция в сторону более быстрой, параллельной и устойчивой передачи данных. HTTP\u002F2 решил проблему блокировки на уровне HTTP, HTTP\u002F3 — на уровне транспорта. Для большинства Java-приложений HTTP\u002F2 уже доступен из коробки; HTTP\u002F3 приходит через reverse proxy.\n\n> **На собеседовании:** ключевой вопрос — что такое head-of-line blocking и как каждая версия его решает. Также полезно объяснить, почему HTTP\u002F3 использует UDP (не потому что он «быстрее», а потому что TCP нельзя модифицировать в middlebox — маршрутизаторах и NAT — а QUIC реализует надёжность поверх UDP в user space).","","middle",[15,16,17,18,19,20,21],"сети","http","http2","http3","quic","мультиплексирование","hpack",[],null,{"title":25,"description":26,"ogTitle":27,"ogDescription":28,"keywords":29,"schemaAnswer":36,"featuredSnippetReady":37},"HTTP\u002F1.1 vs HTTP\u002F2 vs HTTP\u002F3 — сравнение версий протокола — Gymterview","HTTP\u002F1.1 — текстовый, один запрос на соединение. HTTP\u002F2 — бинарный, мультиплексирование, HPACK, Server Push. HTTP\u002F3 — QUIC поверх UDP, нет head-of-line blocking, 0-RTT.","HTTP\u002F1.1, HTTP\u002F2 и HTTP\u002F3 — эволюция протокола","HTTP\u002F1.1: текстовый, 6-8 TCP-соединений. HTTP\u002F2: бинарный, мультиплексирование в одном TCP, HPACK. HTTP\u002F3: QUIC (UDP), потоки независимы, 0-RTT, TLS 1.3 встроен.",[30,31,32,33,34,35],"HTTP\u002F1.1 vs HTTP\u002F2","HTTP\u002F2 vs HTTP\u002F3","QUIC протокол","мультиплексирование HTTP\u002F2","head-of-line blocking","HPACK QPACK","HTTP\u002F1.1 (1997) — текстовый, один запрос на соединение, head-of-line blocking. HTTP\u002F2 (2015) — бинарный, мультиплексирование потоков в одном TCP, сжатие заголовков HPACK, Server Push, но head-of-line blocking на уровне TCP. HTTP\u002F3 (2022) — QUIC поверх UDP, потоки независимы (нет HOL blocking), встроенный TLS 1.3, поддержка 0-RTT при повторном подключении.",true]