Каковы основные различия между версиями HTTP/1.1, HTTP/2 и HTTP/3?

Ответ

Основная цель эволюции протокола HTTP — повышение производительности и уменьшение задержек при загрузке веб-ресурсов. Каждая версия решала проблемы предыдущей.

HTTP/1.1 (1997)

  • Основа: Работает поверх TCP.
  • Ключевая особенность: Ввел постоянные соединения (keep-alive), позволяя выполнять несколько запросов в рамках одного TCP-соединения.
  • Главная проблема: Блокировка очереди (Head-of-Line blocking). Запросы в одном соединении должны выполняться строго последовательно. Потеря одного пакета останавливает всю очередь.

HTTP/2 (2015)

  • Основа: Работает поверх TCP.
  • Ключевые улучшения:
    • Мультиплексирование: Позволяет отправлять несколько запросов и ответов параллельно в одном TCP-соединении, решая проблему HOL blocking на уровне приложения.
    • Бинарный протокол: Вместо текстового, что упрощает и ускоряет парсинг.
    • Сжатие заголовков (HPACK): Уменьшает объем передаваемых метаданных.
    • Server Push: Сервер может отправлять ресурсы, которые, по его мнению, понадобятся клиенту, не дожидаясь запроса.
  • Ограничение: Все еще подвержен HOL blocking на уровне транспорта (TCP). Потеря одного TCP-пакета может затормозить все потоки данных.

HTTP/3 (2022)

  • Основа: Работает поверх QUIC (который, в свою очередь, работает через UDP).
  • Ключевые улучшения:
    • Решение проблемы HOL blocking на уровне транспорта: QUIC имеет независимые потоки. Потеря пакета в одном потоке не влияет на другие.
    • Ускоренное установление соединения: Объединяет рукопожатия TCP и TLS, сокращая задержки.
    • Встроенное шифрование: TLS 1.3 является неотъемлемой частью QUIC.
Версия Транспорт Мультиплексирование HOL Blocking Сжатие заголовков
HTTP/1.1 TCP Нет Да (на уровне приложения) Нет
HTTP/2 TCP Да Да (на уровне TCP) HPACK
HTTP/3 QUIC (UDP) Да Нет QPACK

Ответ 18+ 🔞

Давай разберём эту эволюцию протоколов, как будто это история про трёх мужиков в гараже, которые пытаются запилить тачку, которая не глохнет на каждом светофоре.

Представь себе, блядь, 1997 год. Выпускают HTTP/1.1. Мужик вроде бы и не дурак, придумал постоянные соединения — keep-alive. Раньше-то, сука, на каждый запрос новый канал открывали, как в общественный туалет заходишь — справил нужду и вышел. А тут вроде как взял кабинку, и стоишь в ней, делаешь свои дела один за другим. Удобно? Вроде да. Но проблема-то в чём? Блокировка очереди, ёпта! Это как если ты в этой кабинке стоишь, а перед тобой чел решил книжку «Войну и мир» на толчке читать. И пока он не закончит, ты нихуя не сделаешь. Один запрос тормозит — все остальные ждут. Пиздец, а не производительность.

Проходит почти 20 лет, и в 2015 выкатывают HTTP/2. Все орут: «Ура, революция!». И правда, прикольные фишки:

  • Мультиплексирование — это когда в одной кабинке (TCP-соединении) можно одновременно и писать, и читать, и в телефоне сидеть. Запросы летят параллельно, как сумасшедшие.
  • Заголовки сжали (HPACK) — вместо того чтобы каждый раз орать «МНЕ НУЖЕН ФАЙЛ style.css, ДАВАЙ ЕГО СЮДА, А ТОЧНЕЕ ПО АДРЕСУ /assets/...», теперь можно кинуть скомканную записку. Быстро.
  • Server Push — сервер, такой предупредительный, сам суёт тебе в карман то, что ты, по его мнению, ещё не успел попросить. «На, братан, возьми script.js, он тебе потом пригодится».

И вроде бы красота, ан нет! Осталась одна, но жирная проблема. Всё это великолепие ездит на старом колхозном тракторе под названием TCP. А у него своя беда: если один колёсный диск (пакет) потерялся по дороге, то весь трактор встаёт как вкопанный, пока этот диск не найдут и не прикрутят обратно. Это и есть HOL blocking на транспортном уровне. Все параллельные потоки упираются в эту потерю. Эпик фейл, блядь.

И вот, наконец, в 2022 является наш спаситель — HTTP/3. Это не просто новый протокол, это, сука, смена всей парадигмы! Он вообще забил болт на TCP и пересел на QUIC, который работает поверх UDP.

QUIC — это как если бы твой трактор внезапно стал вертолётом. Потерял одну лопасть? Да похуй, остальные три крутятся, летим дальше! Потоки независимы. Потеря пакета в одном не тормозит остальные. Проблема HOL blocking наконец-то решена в рот её чих-пых!

Плюс, QUIC — хитрая жопа. Он при установке соединения сразу делает и «рукопожатие» (как в TCP), и шифрование (как в TLS), за один заход. Раньше на это уходило три обмена данными, а теперь — полтора. Задержки сократились просто овердохуища.

И шифрование у него встроенное с рождения, не как допилка, а как родная фича. Без него — никуда.

Короче, резюмируем эту трёхсерийную сагу:

Версия На чём едет Параллельность Главная проблeма (HOL Blocking) Сжатые заголовки?
HTTP/1.1 TCP (старый трактор) Нет. Очередь. Да, на уровне приложения (книга на толчке) Нет
HTTP/2 TCP (всё тот же трактор, но с турбонаддувом) Да! Да, но уже на уровне транспорта (потеря колеса) Да (HPACK)
HTTP/3 QUIC/UDP (вертолёт) Да! Нет, блядь! Потерял лопасть — лети дальше. Да (QPACK)

Вот так, от очереди в одну кабинку до независимых вертолётных потоков. Эволюция, мать её.