Протокол HTTP/2: что это, преимущества и как им пользоваться

Что такое HTTP

HTTP — это протокол, на основании которого передаются данные в интернете. HTTP строится на модели клиент/сервер. В такой модели два компьютера, клиент (тот, кто получает услугу) и сервер (провайдер услуги) общаются между собой с помощью запросов и ответов.
Эту модель можно пояснить на примере гостя в ресторане и официанта. Гость (клиент) заказывает (отправляет запрос) у официанта (сервера) еду. Официант идет за едой к повару (логика вашего приложения) и приносит ее гостю. Это очень простой пример, но он поможет понять вам концепт.

Теперь поговорим о протоколе HTTP/2.

Протокол HTTP/2: преимущества и как им пользоваться

Что такое HTTP/2

В 2015 году рабочая группа инженеров Интернета выпустила HTTP/2, вторую глобальную версию самого используемого протокола HTTP.

Основные цели разработки HTTP/2:

  • Возможность выбирать протокол, например, HTTP/1.1, HTTP/2 или другой.
  • Высокая совместимость с HTTP/1.1 — методы, коды статусов, поля хедеров.
  • Улучшение скорости загрузки благодаря сжатию хедеров запросов, бинарному протоколу, отправке данных по инициативе сервера, блокировке пакетов и запросу многократной передачи данных.

Запрос многократной передачи данных

HTTP/2 может отправлять множественные запросы данных параллельно по единому соединению TCP. Это самая продвинутая функция протокола HTTP/2. С ее помощью вы можете загружать веб-файлы асинхронно с одного сервера. Большинство современных браузеров ограничивает количество TCP-подключений к одному серверу.

Отличие между протоколами HTTP 1.1 и HTTP/2Отличие между протоколами HTTP 1.1 и HTTP/2

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

Сжатие хедеров

HTTP/2 сжимает большое количество ненужных фреймов хедеров. Для этого протокол использует спецификацию HPACK. Клиент и сервер поддерживают список хедеров, которые использовались в предыдущих запросах клиента-сервера.
HPACK сжимает отдельное значение каждого хедера до передачи на сервер, а потом смотрит закодированную инфомарцию в списке предварительно переданных значений хедера для полной реконструкции данных хедера.

Пример сжатия хедеров с помощью технологии HPACK
Пример сжатия хедеров с помощью технологии HPACK

Бинарный протокол

Эта версия протокола может превращать текстовый протокол в бинарный. HTTP1.x обрабатывал текстовые команды, чтобы завершать цикл запросов-ответов. Протокол HTTP/2 использует бинарные команды для выполнения тех же задач. Это облегчает фрейминг и выполнение команд.

Преимущества:

  • Низкие затраты на парсинг данных,
  • Меньше ошибок,
  • Меньше нагрузка на сеть,
  • Эффективное использование сетевых ресурсов,
  • Дает возможность использовать дополнительные преимущества HTTP/2, такие как сжатие, многократную передачу данных, приоритезацию и эффективную обработку TLS,
  • Компактная презентация команд для более легкой обработки и внедрения,
  • Более эффективная обработка данных между клиентом и сервером,
  • Меньше сетевых задержек.

Отправка данных по инициативе сервера

Эта опция позволяет серверу отправлять дополнительную кэшируемую информацию клиенту, которая сейчас не запрашивается, но может быть запрошена в будущем. Например, клиент запрашивает ресурс X. Сервер понимает, что ресурс Y связан с запрашиваемым файлом. Поэтому сервер может отправить Y вместе с X и не ждать такого запроса от клиента.

Пример отправки данных по инициативе сервера
Пример отправки данных по инициативе сервера

Преимущества

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

Вернемся к истории о госте в ресторане и официанте. Представим, что официанты — это TCP-подключения, и вы хотите заказать ужин и бутылку воды. Для версии HTTP/1.1 это будет означать, что вы попросить у одного официанта ужин, а у второго воду, то есть у вас будет два TCP-подключения. Для версии HTTP/2 вы попросите обе вещи у одного официанта, но он доставит вам их по отдельности. У вас будет одно TCP-подключение и меньшая нагрузка на сервер. Кроме того, у сервера будет одно лишнее подключение (официант) для следующего клиента (гостя).

Фундаментальная разница между протоколами HTTP/1.1 и HTTP/2 видна на примере отправки данных по инициативе сервера.

Представьте, что гость (клиент) заказывает (отправляет запрос) у официанта (серверу) ужин. Официант берет ужин у повара (логика вашего приложения), но официант также подумал о том, что скорее всего вам понадобится вода. Поэтому он приносит ее вместе с ужином. В итоге у вас будет только одно TCP-подключение и один запрос, что значительно снижает нагрузку на сервер.

Чтобы продемонстрировать эту механику, возьмем пример такой страницы:

Страница со 100 картинками зеленых галочек для примера
Страница со 100 картинками зеленых галочек для примера

Это обычная страница со 100 картинками зеленых галочек. Мы будем использовать ее, чтобы показать отправку данных по инициативе сервера протоколами HTTP/1.1, HTTP/2 и HTTP/2.

На что важно обращать внимание на картинке ниже — это количество запросов, время загрузки, колонку протокола, колонку инициатора и диаграмму.

Для HTTP/1.1

Пример обработки картинки со 100 галочками протоколом HTTP/1.1Пример обработки картинки со 100 галочками протоколом HTTP/1.1

Количество запросов: 102
Время загрузки: 12, 97 секунд
Протокол: “http/1.1”
Колонка инициатора: Инициатор первого запроса — пользователь/клиент, и оставшаяся часть запросов инициируются клиентом, который понимает, что ему нужны дополнительные ресурсы (в этом случае картинки).
Диаграмма: мы можем видеть, как запросы обрабатываются множественными пачками (TCP-подключениями).

Для HTTP/2

Пример обработки картинки со 100 галочками протоколом HTTP/2
Пример обработки картинки со 100 галочками протоколом HTTP/2

Количество запросов: 102
Время загрузки: 11,19 секунд
Протокол: “h2” (HTTP/2)
Колонка инициатора: Инициатор первого запроса — пользователь/клиент, и оставшаяся часть запросов инициируются клиентом, который понимает, что ему нужны дополнительные ресурсы (в этом случае картинки).
Диаграмма: мы можем видеть, как запросы обрабатываются двумя пачками (TCP-подключениями).

Обратите внимание на время загрузки. В этом случае оно немного ниже, чем время загрузки в примере HTTP/1.1, но это не всегда так.

Отправка данных по инициативе сервера HTTP/2

Обработка картинки со 100 галочками с помощью отправки данных по инициативе сервера
Обработка картинки со 100 галочками с помощью отправки данных по инициативе сервера

Количество запросов: 102
Время загрузки: 3,17 секунд
Протокол: “h2” (HTTP/2)
Колонка инициатора: Инициатор первого запроса — пользователь/клиент, и оставшаяся часть запросов инициируются сервером (один запрос/цикл ответа)
Диаграмма: мы видим, как запросы обрабатывается с помощью одного TCP-подключения.

Совместимость с браузерами

Совместимость с браузерами
Большинство современных браузеров полностью поддерживают протокол HTTP/2 за исключением (помечено красным) Opera mini Всех версии и браузера UC под Android.

Также некоторые браузеры поддерживают HTTP/2 частично (помечены светло-зеленым), — например, IE11.

Больше деталей о поддержке браузеров протокола HTTP/2

Как можно начать использовать HTTP/2

Шаг 1

  • Убедитесь, что вы используете HTTPS: купите SSL или TLS-сертификат от официального центра сертификации или используйте бесплатный SSL от Let’s Encrypt.
  • Активируйте SSL-сертификат.
  • Установите его.
  • Перезапустите сайт, чтобы активировать HTTPS-протокол.
Установите SSL-сертификат и защитите свой сайт!

Шаг 2

Убедитесь, что ваша сетевая инфраструктура, включая ПО сервера, поддерживает HTTP/2. Серверы Nginx поддерживают HTTP/2 по умолчанию, тогда как Apache добавил поддержку HTTP/2 в октябре 2015. Это значит, что серверам Apache могут понадобиться дополнительные модули, чтобы включить передачу данных c помощью HTTP/2.

Шаг 3

Обновите, настройте и протестируйте серверы, чтобы они поддерживали HTTP/2.

Настройка и тестирование для серверов Apache

Свяжитесь с вашим хостинг-провайдером, чтобы убедиться, что HTTP/2 работает для вашего сайта.

Источники: статья в блоге Kinsta, статья в Medium

Валерия

Руковожу контент-направлением, работаю в сфере маркетинга и редактуры 4 года.