Получить доступ

Чем отличаются HTTP/1.1, HTTP/2 и HTTP/3?

MiddleСети
Ещё спрашивают так:
  • Что такое мультиплексирование в HTTP/2?
  • Зачем HTTP/3 перешёл на UDP?
  • Что такое head-of-line blocking?
Коротко

HTTP/1.1 — текст, один запрос за раз в соединении. HTTP/2 — бинарные кадры, много потоков в одном TCP-соединении. HTTP/3 — то же поверх QUIC (UDP), без общей блокировки при потере пакета.

  • 1.1: keep-alive, но браузер открывает ~6 соединений на домен, чтобы распараллелить
  • 2: мультиплексирование, сжатие заголовков HPACK, приоритеты
  • 2 убрал блокировку на уровне HTTP, но осталась на уровне TCP
  • 3: QUIC — TLS 1.3 встроен, 1-RTT (0-RTT повторно), миграция соединения

А ещё Смысл методов, кодов и заголовков одинаков во всех версиях

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

HTTP/1.1 (1997). Текстовый протокол, постоянные соединения (keep-alive) по умолчанию. Но в одном соединении запросы идут по очереди: следующий ответ ждёт предыдущего — блокировка начала очереди на уровне HTTP. Конвейеризация (pipelining) почти не прижилась. Поэтому браузеры открывают около 6 соединений на домен, а сайты раньше раскидывали статику по поддоменам, склеивали файлы и рисовали спрайты.

HTTP/2 (2015). Смысл тот же — методы, заголовки, коды, — меняется передача:

  • бинарные кадры вместо текста;
  • мультиплексирование — много независимых потоков в одном соединении, кадры перемежаются; не нужны несколько соединений и склейки;
  • HPACK — сжатие заголовков с общим словарём: повторяющиеся cookie и user-agent почти ничего не стоят;
  • приоритеты потоков и (ныне заброшенный) server push.

Но всё едет по одному TCP: потеря одного пакета задерживает все потоки, пока он не будет переотправлен. На плохих сетях HTTP/2 бывает хуже нескольких соединений HTTP/1.1. gRPC работает поверх HTTP/2.

HTTP/3 (2022) — HTTP поверх QUIC, транспорта на UDP:

  • потоки независимы на уровне транспорта — потеря пакета задерживает только свой поток;
  • TLS 1.3 встроен: установка соединения и шифрования за 1 RTT вместо 2–3, при повторном подключении 0-RTT;
  • соединение определяется идентификатором, а не четвёркой адресов — переживает переход телефона с Wi-Fi на мобильную сеть;
  • реализован в пространстве пользователя, поэтому быстрее развивается.

Минусы: UDP иногда режут корпоративные сети (тогда откат на HTTP/2), больше нагрузка на CPU, сложнее отладка.

На практике: между браузером и CDN — HTTP/2 и 3; внутри дата-центра часто HTTP/1.1 с пулом соединений или HTTP/2 для gRPC. Версию выбирают согласованием в TLS (ALPN) и заголовком Alt-Svc для HTTP/3.

Пример

$ curl -sI --http2 https://example.com | head -1
HTTP/2 200
$ curl -sI https://cloudflare.com | grep -i alt-svc
alt-svc: h3=":443"; ma=86400      # сервер предлагает HTTP/3

Что хотят услышать

  • Проблема HTTP/1.1: последовательные запросы и много соединений.
  • HTTP/2: бинарные кадры, мультиплексирование, HPACK.
  • Почему блокировка осталась на TCP и как её решает QUIC.
  • Плюсы HTTP/3: быстрое установление, миграция; минусы — плюс.

Частые ошибки

  • Думать, что HTTP/2 поменял семантику — методы и коды те же.
  • Считать HTTP/3 «HTTP поверх голого UDP» без надёжности.

Что спросят дальше

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем