HTTP/2: предыстория, преимущества производительности и реализации
Протоколом, который стал синонимом использования интернета, является HTTP (hypertext transfer protocol). Он был разработан Тимом Бернерсом-Ли в CERN в 1989 году. Спецификация для версии 1.0 была выпущена в 1996 году (RFC 1945), для версии 1.1 – в 1999 году.
Первое поколение HTTP (версии 1 и 1.1) доминировало в сети до 2015 года. Тогда был выпущен протокол HTTP/2.
HTTP / 1
HTTP - это протокол без сохранения состояния, основанный на структуре запрос-ответ. При этом отдельный запрос не знает о предыдущих запросах. Файлы cookie используются для устранения разрыва между несколькими запросами в одной сессии пользователя. Например, чтобы предоставлять версию сайта для зарегистрированных пользователей.
Текущее состояние HTTP можно назвать низкоуровневым, требующей дополнительной «помощи», которая должна быть предоставлена браузерам и серверам для осуществления эффективной коммуникации.
Эволюция протокола происходила за счет хаков, внедряемых Google, Facebook и т. д. Все оптимизировали обычный сценарий: посетитель запрашивает веб-страницу, и браузер получает ее с сервера. После чего он анализирует HTML и находит ресурсы, необходимые для отображения страницы: CSS, изображения и JavaScript.
Когда браузер сталкивается со ссылками на ресурсы, он перестает загружать все остальное содержимое и запрашивает указанные ресурсы с сервера. Он не начнет загрузку следующего элемента, пока не получит запрашиваемый.

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

Синхронное, не конвейерное соединение в сравнении с конвейерным.
Разработчикам приходится прибегать к модели HTTP/1 для оптимизации своих сайтов с помощью спрайтов изображений, конкатенации CSS и JavaScript, распределения запросов посетителей на ресурсы по нескольким доменам или поддоменам и т. д.
SPDY
В 2009 году корпорация Google рассказала о запуске проекта, который должен был реализовать протокол нового поколения SPDY. Его поддержка была добавлена в браузер Chrome и в последующие годы она распространилась на все сервисы компании.
В какой-то момент то же самое сделал Twitter, Apache, nginx, Node.js, а затем Facebook, WordPress.com и большинство CDN - провайдеров.
В SPDY было добавлено мультиплексирование - параллельная отправка нескольких ресурсов через одно TCP-соединение. Соединения шифруются по умолчанию, а данные сжимаются. Согласно официальной документации SPDY, предварительные тесты показали увеличение скорости загрузки на 27-60%.
Третья версия SPDY версии 3 стала основой для первого проекта HTTP/2, созданного рабочей группой Hypertext Transfer Protocol httpbis в 2015 г.
HTTP/2 ставит своей задачей исправление недостатков первой версии протокола путем:
- сжатия HTTP- заголовков;
- реализации server push;
- мультиплексирования запросов для одного соединения.
Вторая версия HTTP также должна решить проблему блокировки заголовков. Передаваемые данные представлены в двоичном формате, что повышает его эффективность, и по умолчанию требует шифрования.
Сжатие заголовка выполняется с помощью алгоритма HPACK. Это устраняет уязвимость SPDY и уменьшает количество запросов вдвое.
Server push - это одна из функций, которая направлена на решение проблемы ожидания. Она предоставляет ресурсы браузеру посетителя до того, как он затребует их.
Благодаря всем этим улучшениям разницу во времени загрузки, которую обеспечивает HTTP/2, можно увидеть на странице этого примера.
Как узнать, обслуживает ли сайт ресурсы с помощью HTTP/2
В наиболее популярных браузерах можно проверить поддержку протокола HTTP/2 конкретным сайтом с помощью инспектора кода. Для этого откройте вкладу «Сеть» и кликните правой кнопкой мыши по полосе над списком ресурсов. Затем активируйте пункт «Протокол».

Также можно установить небольшой инструмент, созданный на основе JavaScript. Он позволяет проверять поддержку HTTP/2 через командную строку (при условии, предварительной установки Node.js и npm):
npm install -g is-HTTP2-cli
После установки можно использовать этот инструмент следующим образом:
is-HTTP2 www.google.com
✓ HTTP/2 supported by www.google.com
Supported protocols: grpc-exp h2 HTTP/1.1
Реализации
На момент написания статьи все наиболее популярные браузеры поддерживают HTTP/2. Но при условии шифрования всех запросов HTTP/2 . Чего не требует спецификация второй версии протокола.
Серверы
Apache 2.4 поддерживает его с модулем mod_HTTP2, который уже должен быть готов к работе. Apache должен быть настроен с добавлением аргумента --enable-HTTP2
к команде ./configure
. Кроме этого должна быть установлена библиотека libngHTTP2
версии не ниже 1.2.1. В случае если система не может найти ее, можно указать в ./configure
соответствующий путь, добавив --with-ngHTTP2=<path>
.
Следующим шагом будет загрузка модуля путем добавления директивы в конфигурацию Apache:
LoadModule HTTP2_module modules/mod_HTTP2.so
Затем мы добавляем Protocols h2 h2c HTTP/1.1
в блок виртуального хоста и перезагружаем сервер. Документация Apache предоставляет следующие предостережения относительно включения HTTP/2:
Включение HTTP/2 на сервере Apache влияет на потребление ресурсов.
При использовании HTTP/2 следует учитывать, что процессы сервера будут запускать дополнительные потоки. Так как HTTP/2 передает все полученные запросы для обработки своим рабочим потокам, затем собирает результаты и передает их клиенту.
Больше информации о конфигурации Apache можно получить здесь.
nginx поддерживает HTTP/2, начиная с версии 1.9.5. Активировать поддержку можно, добавив аргумент http2 в спецификацию виртуального хоста:
server {
listen 443 ssl http2 default_server;
ssl_certificate server.crt;
ssl_certificate_key server.key;
После этого нужно перезагрузить nginx.
К сожалению, на момент написания данной статьи поддержка server push не была официально реализована. Для энтузиастов доступен не официальный модуль nginx, который добавляет поддержку HTTP/2 server push.
LiteSpeed и OpenLiteSpeed также могут похвастаться поддержкой HTTP/2. Но перед активацией HTTP/2 на стороне сервера убедитесь, что реализована поддержка SSL. Все сниппеты виртуальных хостов, которые мы упоминали для Apache и для nginx, должны входить в блоки виртуальных хостов SSL, прослушивая порт 443.
После этого получите SSL-сертификат LetsEncrypt и установите его в любом из основных дистрибутивов Linux. Для этого нужно всего лишь несколько строк кода. Certbot - это инструмент командной строки, который автоматизирует весь процесс.
Заключение
В этой статье я представил обзор HTTP/2. Полный список реализаций HTTP нового поколения можно найти здесь.
Для тех, кто не очень разбирается в технологиях, самый простой способ перехода на новый протокол заключается в подключении к CDN.