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 / 1

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

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

Как отметил Даниэль Стенберг (один из специалистов по стандартизации HTTP/2), первая версия протокола испытывает трудности с использованием возможностей базового транспортного уровня, TCP.

Скорость передачи данных в интернете возросла. Но инфраструктура эпохи HTTP/1.1 не использовала это в полной мере. Протокол по-прежнему боролся с такими проблемами, как отсутствие поддержки конвейерной передачи (увеличение количества ресурсов, передаваемых через одно и то же TCP-соединение).

HTTP / 1 - 2

Синхронное, не конвейерное соединение в сравнении с конвейерным.

Разработчикам приходится прибегать к модели 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 также должна решить проблему блокировки заголовков. Передаваемые данные представлены в двоичном формате, что повышает его эффективность, и по умолчанию требует шифрования.

Сжатие заголовка выполняется с помощью алгоритма HPACK. Это устраняет уязвимость SPDY и уменьшает количество запросов вдвое.

Server push - это одна из функций, которая направлена ​​на решение проблемы ожидания. Она предоставляет ресурсы браузеру посетителя до того, как он затребует их.

Благодаря всем этим улучшениям разницу во времени загрузки, которую обеспечивает HTTP/2, можно увидеть на странице этого примера.

Как узнать, обслуживает ли сайт ресурсы с помощью 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.

Вадим Дворниковавтор-переводчик статьи «HTTP/2: Background, Performance Benefits and Implementations»