3.5. HTTP/2
В этой статье мы подробно разберём HTTP/2, поговорим о скорости и поддержке браузеров. Посмотрим, чем HTTP/2 полезен для сайтов и какие у него есть недостатки.
Каждый раз, когда пользователь нажимает на ссылку для посещения веб-приложения, на сервер отправляется запрос. Сервер отвечает на него сообщением о состоянии (заголовком) и списком файлов для этого веб-приложения. После просмотра списка браузер запрашивает файлы по одному. Разница между HTTP/1 и HTTP/2 заключается в том, что происходит дальше.
Представьте, что вы собираете новый конструктор LEGO. Сначала вы идёте в магазин, чтобы купить набор. Когда вы приходите домой, то открываете коробку и смотрите инструкции, в которых говорится, что вам нужно делать: брать и присоединять по одной детальке за раз. То есть для каждой детальки вы должны посмотреть инструкцию, чтобы увидеть, какую деталь взять дальше. И так до тех пор, пока вы не закончите строить модель конструктора. Если в вашем наборе 3000 деталей, это займёт довольно много времени. Так работает HTTP/1.
С HTTP/2 иначе. Когда вы открываете коробку и инструкцию LEGO, то можете запросить сразу все детали, используемые в одной части набора. Вы можете продолжать получать информацию и новые детали, не тратя время на заглядывание в инструкцию. «Эти детали здесь тоже нужны, так что вот они». Вы можете получать детали очень быстро, можете даже получить все кубики сразу, чтобы собрать набор в одно мгновение.
То есть самое важное нововведение HTTP/2 — здесь используется одно открытое соединение, в котором запросы могут выполняться одновременно. Это называется мультиплексированием.
Мультиплексирование — это одно TCP-соединение для нескольких запросов и ответов.
Что такое HTTP/2
HTTP/2 — это протокол, который был создан для улучшения процесса передачи данных. В HTTP/1 много недостатков, и SPDY был создан, чтобы закрыть «дыры» HTTP/1. В 2015 году SPDY был интегрирован в HTTP/2 и постепенно заменён на него.
HTTP/2 ориентирован на оптимизацию потока данных между клиентом и сервером. HTTP/2 обратно совместим с HTTP/1, то есть веб-приложения будут работать с любым из этих протоколов.
Когда пользователь подключается к серверу, его браузер согласовывает сеанс HTTP с сервером. Тип созданного сеанса зависит от функций, поддерживаемых клиентом и сервером. Если обе стороны поддерживают HTTP/2, сервер начинает работать по протоколу HTTP/2.
Если клиент и сервер поддерживают и готовы использовать HTTP/2, они могут использовать такие функции HTTP/2, как сжатие, мультиплексирование и push-сервер для оптимизации соединения — мы разберём их дальше. Если какая-либо из сторон не поддерживает HTTP/2, тогда и браузер, и сервер возвращаются к HTTP/1.
Разница в скорости между HTTP/1 и HTTP/2
Замерить скорость загрузки по HTTP/1 и HTTP/2 можно по тестам https://www.httpwatch.com/. В среднем, HTTP/2 + HTTPS ускоряет загрузку на 23%. Проверить скорость загрузки сайтов на разных протоколах можно в сервисе HTTP vs HTTPS.
Особенности HTTP/2
- HTTP-сообщения разбиваются на один или несколько фреймов с общим заголовком. Это сокращает дополнительное время приёма-передачи (RTT), ускоряя загрузку сайта без какой-либо оптимизации.

Заголовки сжимаются при помощи алгоритма HPACK. Происходит сокращение информации для обмена между браузером и сервером.
HTTP/2 мультиплексирован. В HTTP/1 для каждого запроса нужно устанавливать отдельное TCP-соединение, и единовременное количество TCP-соединений ограничено. С HTTP/2 клиент и сервер могут отправлять множество запросов и ответов в одном TCP-соединении.

Как результат, более быстрая загрузка.
- Параллельный запрос статических элементов:

- Реализован
push-сервер — возможность сервера отправлять несколько ответов
на один клиентский запрос. Например, если клиент запрашивает файл
form.html, а для его загрузки нужны файлыform-script.jsиicon-form.svg, то сервер отправит сразу три файла:

В этом случае кеш браузера может быть очищен или обновлён.
То есть сервер знает о многих дополнительных ресурсах, которые потребуются странице, и может начать отправлять эти ресурсы, отвечая на первоначальный запрос. Это позволяет серверу полностью использовать сеть и сократить время загрузки страниц.
Это бинарный протокол, а не текстовый, как HTTP/1, что устраняет проблемы безопасности, связанные с передачей текста в HTTP.
Улучшен процесс распределения приоритетов, то есть браузеру отдаются сначала наиболее важные файлы. В SPDY приоритизация осуществлялась по более простому алгоритму. Приоритизация запросов учитывает их вес и зависимость друг от друга.
Менее подвержен ошибкам и занимает меньше места в сети.
Веб-разработчикам проще работать за счёт исключения HTTP-оптимизаций.
HTTP/2 подразумевает использование веб-приложением безопасного HTTPS-соединения. Популярные браузеры, Chrome и Firefox, поддерживают HTTP/2 только поверх TLS. Есть возможность работы HTTP/2 с использованием обычного TCP, то есть без дополнительной защиты, но лучше так не делать.
Все ресурсы сохраняются в кеше.
Таким образом, уменьшается задержка сети и улучшается пропускная способность. На момент начала 2022 года широко поддерживается браузерами:

Недостатки HTTP/2
Блокировка заголовка на уровне TCP по-прежнему вызывает проблемы. Это значительно улучшено протоколом HTTP/3.
Каждое соединение требует больших объёмов памяти по сравнению с HTTP.
Не всегда нужно использовать безопасное соединение. Например, в этом нет смысла, когда информация уже зашифрована или нет необходимости защиты.
Нужно удалять оптимизации под HTTP/1.
Веб-приложения с ресурсоёмкими аудио и видеопотоками работают медленнее.
Использование одновременных запросов увеличивает нагрузку на сервер, что приводит к тайм-аутам запросов. Для клиентов с медленным сетевым подключением количество пакетов будет постепенно падать, и качество сети ухудшится до одного подключения HTTP/2. Это замедляет весь процесс и блокирует передачу данных.
Постепенное снижение гибкости протокола (известное как окостенение) становится проблемой для устройств, настроенных для приёма TCP или UDP.