В чем ключевые различия между протоколами HTTP/1.1 и HTTP/2?

Ответ

HTTP/2 был разработан для решения проблем производительности HTTP/1.1. Основные различия можно представить в виде таблицы:

Характеристика HTTP/1.1 HTTP/2
Формат передачи Текстовый. Легко читается человеком. Бинарный. Компактный и эффективный для парсинга машиной.
Мультиплексирование Отсутствует. Запросы обрабатываются последовательно. Для параллелизма браузеры открывают несколько TCP-соединений (обычно до 6). Поддерживается. Множество запросов и ответов могут передаваться одновременно в рамках одного TCP-соединения, не блокируя друг друга.
Проблема "Head-of-Line Blocking" Присутствует. Если первый запрос в очереди "завис", он блокирует все последующие в том же соединении. Решена на уровне протокола. Благодаря мультиплексированию, "зависший" запрос не мешает обработке других.
Сжатие заголовков Отсутствует (или минимальное). Заголовки передаются как обычный текст, что создаёт избыточность. HPACK. Используется эффективный алгоритм сжатия, который значительно уменьшает размер передаваемых заголовков.
Server Push Отсутствует. Клиент должен сам запросить все необходимые ресурсы (CSS, JS, картинки). Поддерживается. Сервер может "проактивно" отправлять клиенту ресурсы, которые, по его мнению, скоро понадобятся, не дожидаясь запроса.

Итог

Переход на HTTP/2 обеспечивает:

  • Ускорение загрузки страниц за счёт мультиплексирования и сжатия заголовков.
  • Снижение нагрузки на сервер благодаря использованию одного TCP-соединения на пользователя.
  • Более эффективное использование сетевых ресурсов.

Стандартная библиотека Go (net/http) имеет встроенную прозрачную поддержку HTTP/2, что упрощает его внедрение в бэкенд-приложениях.

Ответ 18+ 🔞

А, слушай, смотри, вот эта вся история с HTTP/2 — это ж просто пиздец какой-то прорыв, если честно. Ну как так-то, блядь? Сидели же на HTTP/1.1, как обезьяны на суку, и мучались.

Представь себе, как это было раньше, в эпоху HTTP/1.1:

  • Формат передачи — текстовый. Ну, типа, читабельно для человека, если ты, конечно, ебанутый и хочешь глазами смотреть на поток сырых запросов. А для машины — сплошное говно, парсить эту простыню текста.
  • Мультиплексирование — нихуя. Ноль. Запросы идут друг за другом, как в очереди за колбасой в девяностые. Чтобы хоть как-то ускориться, браузеры открывали аж по 6 TCP-соединений одновременно! Это ж какой овердохуища overhead, блядь! Каждое соединение — это рукопожатия, настройки, слезы.
  • Проблема "Head-of-Line Blocking" — вот это вообще пиздец. Один запрос, сука, затупил где-то на сервере (или просто большой), и всё, блядь, вся очередь за ним встала колом. Как будто один мудак на кассе карточкой не может расплатиться, а за ним уже пол-универсама стоит и матерится.
  • Сжатие заголовков — да какое там сжатие! Каждый раз одно и то же: Host:, User-Agent:, Accept-* — и всё это текстом, десятки, сотни байт лишних. Каждый раз! Ядрёна вошь!

А теперь, ёпта, приходит HTTP/2 и начинает всех ебашить по-взрослому:

  • Формат передачи — бинарный. Всё, пиши пропало. Для человека нечитаемо, зато машина жрёт это как горячие пирожки. Компактно, быстро, эффективно.
  • МультиплексированиеДА, БЛЯДЬ, ЕСТЬ! Это же главная фишка! Все запросы и ответы летят в одном TCP-соединении, но параллельно, не мешая друг другу. Как будто из одной трубы вылетает сразу куча разноцветных шариков, и каждый знает, куда ему. Красота!
  • Проблема "Head-of-Line Blocking"РЕШЕНА НАХУЙ! Один запрос застрял? Да и хуй с ним! Остальные пролетают мимо, как будто его нет. Вообще волшебство.
  • Сжатие заголовковHPACK. Умный алгоритм, который не передаёт одно и то же сто раз. Сначала отправил полный заголовок, а потом только ссылки на него. Гениально и просто, как всё гениальное. Экономия — овердохуищная.
  • Server Push — а это вообще магия, блядь. Сервер такой: "О, чувак, я вижу, ты запросил index.html. Держи заодно и styles.css, и script.js, которые к нему прилагаются, на, не благодари". Клиенту даже просить не надо. Пизда с ушами!

Итог, блядь

Что в сухом остатке? HTTP/2 — это:

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

А самое приколючее, что в Go, например, в стандартной библиотеке net/http эта поддержка встроена и работает прозрачно. То есть ты, по сути, нихуя не делаешь, а уже получаешь все эти плюшки. Просто берёшь и пишешь своё приложение, а оно уже на HTTP/2 летает, если клиент умеет. Вот так вот, в рот меня чих-пых, технологии шагают вперёд!