Что такое HTTP
HTTP — это протокол, на основании которого передаются данные в интернете. HTTP строится на модели клиент/сервер. В такой модели два компьютера, клиент (тот, кто получает услугу) и сервер (провайдер услуги) общаются между собой с помощью запросов и ответов.
Эту модель можно пояснить на примере гостя в ресторане и официанта. Гость (клиент) заказывает (отправляет запрос) у официанта (сервера) еду. Официант идет за едой к повару (логика вашего приложения) и приносит ее гостю. Это очень простой пример, но он поможет понять вам концепт.
Теперь поговорим о протоколе 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/2 сжимает большое количество ненужных фреймов хедеров. Для этого протокол использует спецификацию 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 картинками зеленых галочек. Мы будем использовать ее, чтобы показать отправку данных по инициативе сервера протоколами HTTP/1.1, HTTP/2 и HTTP/2.
На что важно обращать внимание на картинке ниже — это количество запросов, время загрузки, колонку протокола, колонку инициатора и диаграмму.
Для HTTP/1.1
Пример обработки картинки со 100 галочками протоколом HTTP/1.1
Количество запросов: 102
Время загрузки: 12, 97 секунд
Протокол: “http/1.1”
Колонка инициатора: Инициатор первого запроса — пользователь/клиент, и оставшаяся часть запросов инициируются клиентом, который понимает, что ему нужны дополнительные ресурсы (в этом случае картинки).
Диаграмма: мы можем видеть, как запросы обрабатываются множественными пачками (TCP-подключениями).
Для HTTP/2
Пример обработки картинки со 100 галочками протоколом HTTP/2
Количество запросов: 102
Время загрузки: 11,19 секунд
Протокол: “h2” (HTTP/2)
Колонка инициатора: Инициатор первого запроса — пользователь/клиент, и оставшаяся часть запросов инициируются клиентом, который понимает, что ему нужны дополнительные ресурсы (в этом случае картинки).
Диаграмма: мы можем видеть, как запросы обрабатываются двумя пачками (TCP-подключениями).
Обратите внимание на время загрузки. В этом случае оно немного ниже, чем время загрузки в примере HTTP/1.1, но это не всегда так.
Отправка данных по инициативе сервера HTTP/2
Обработка картинки со 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-протокол.
Шаг 2
Убедитесь, что ваша сетевая инфраструктура, включая ПО сервера, поддерживает HTTP/2. Серверы Nginx поддерживают HTTP/2 по умолчанию, тогда как Apache добавил поддержку HTTP/2 в октябре 2015. Это значит, что серверам Apache могут понадобиться дополнительные модули, чтобы включить передачу данных c помощью HTTP/2.
Шаг 3
Обновите, настройте и протестируйте серверы, чтобы они поддерживали HTTP/2.
Настройка и тестирование для серверов Apache
Свяжитесь с вашим хостинг-провайдером, чтобы убедиться, что HTTP/2 работает для вашего сайта.
Источники: статья в блоге Kinsta, статья в Medium