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: предыстория, преимущества производительности и реализации

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

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

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

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

HTTP/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- заголовков;
  • реализации server push;
  • мультиплексирования запросов для одного соединения.

Вторая версия 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.comSupported 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.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *