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

  1. HTTP-сообщения разбиваются на один или несколько фреймов с общим заголовком. Это сокращает дополнительное время приёма-передачи (RTT), ускоряя загрузку сайта без какой-либо оптимизации.

Фреймы сообщения HTTP/2

  1. Заголовки сжимаются при помощи алгоритма HPACK. Происходит сокращение информации для обмена между браузером и сервером.

  2. HTTP/2 мультиплексирован. В HTTP/1 для каждого запроса нужно устанавливать отдельное TCP-соединение, и единовременное количество TCP-соединений ограничено. С HTTP/2 клиент и сервер могут отправлять множество запросов и ответов в одном TCP-соединении.

HTTP/2 мультиплексирование таймлайн

Как результат, более быстрая загрузка.

  1. Параллельный запрос статических элементов:

HTTP/2 мультиплексирование

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

В этом случае кеш браузера может быть очищен или обновлён.

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

  1. Это бинарный протокол, а не текстовый, как HTTP/1, что устраняет проблемы безопасности, связанные с передачей текста в HTTP.

  2. Улучшен процесс распределения приоритетов, то есть браузеру отдаются сначала наиболее важные файлы. В SPDY приоритизация осуществлялась по более простому алгоритму. Приоритизация запросов учитывает их вес и зависимость друг от друга.

  3. Менее подвержен ошибкам и занимает меньше места в сети.

  4. Веб-разработчикам проще работать за счёт исключения HTTP-оптимизаций.

  5. HTTP/2 подразумевает использование веб-приложением безопасного HTTPS-соединения. Популярные браузеры, Chrome и Firefox, поддерживают HTTP/2 только поверх TLS. Есть возможность работы HTTP/2 с использованием обычного TCP, то есть без дополнительной защиты, но лучше так не делать.

  6. Все ресурсы сохраняются в кеше.

Таким образом, уменьшается задержка сети и улучшается пропускная способность. На момент начала 2022 года широко поддерживается браузерами:

Can I use HTTP/2

Недостатки HTTP/2

  1. Блокировка заголовка на уровне TCP по-прежнему вызывает проблемы. Это значительно улучшено протоколом HTTP/3.

  2. Каждое соединение требует больших объёмов памяти по сравнению с HTTP.

  3. Не всегда нужно использовать безопасное соединение. Например, в этом нет смысла, когда информация уже зашифрована или нет необходимости защиты.

  4. Нужно удалять оптимизации под HTTP/1.

  5. Веб-приложения с ресурсоёмкими аудио и видеопотоками работают медленнее.

  6. Использование одновременных запросов увеличивает нагрузку на сервер, что приводит к тайм-аутам запросов. Для клиентов с медленным сетевым подключением количество пакетов будет постепенно падать, и качество сети ухудшится до одного подключения HTTP/2. Это замедляет весь процесс и блокирует передачу данных.

  7. Постепенное снижение гибкости протокола (известное как окостенение) становится проблемой для устройств, настроенных для приёма TCP или UDP.