Знакомство с HTTP/2

5 комментариев

HTTP/2HTTP/2 – это вторая версия всем известного протокола HTTP. Полностью название этого протокола выглядит как HTTP/2.0. Как известно, HTTP – или Hypertex Transfer Protocol – это протокол, который используется для передачи гипертекста. Иными словами, благодаря HTTP веб-страницы загружаются и показываются через браузер интернет-пользователям.

Протокол HTTP появился давно: первая версия – даже не первая, а 0.9 – вышла в далеком 1991 году. Через восемь лет, в 1999 году, появилась те версия HTTP, которая активно используется сейчас, – HTTP/1.1. Казалось бы, если все работает, то зачем что-то менять? Но как и везде в разработке, прогресс не стоит на месте, все меняется и требует изменений.

Разработка

Разработкой новой версии протокола занималась рабочая группа HTTPbis из Internet Engineering Task Force (Инженерного совета интернета, который разрабатывает стандарты интернета). Она была сформирована в 2007 году специально для работой над этим проектом. Однако активные действия начали происходить лишь через пять лет, в 2012 году.

Основой для HTTP/2 стал протокол SPDY (можно расшифровать как “speedy” – быстрый). Разработчик этого прокола – компания Google – создавала его для того, чтобы снизить время загрузки веб-страниц. В частности, протокол SPDY позволяет расставлять приоритеты и использовать мультиплексирование передачи нескольких файлов так, чтобы для каждого клиента нужно лишь одно соединение.

Один из участников рабочей группы Даниэль Штенберг весной 2014 года опубликовал документ, в котором рассказано о том, зачем вообще начали работу над этим проектом, и как она происходит. Документ доступен и на русском языке: https://bagder.gitbooks.io/http2-explained/ru/

Вот кратко перечисленные в описании концепции пункты:

  • должны поддерживаться парадигмы HTTP;
  • должны остаться ссылки http:// и https://, не нужно добавлять новую схему;
  • серверы и клиенты, использующие HTTP/1, должны быть проксированы к HTTP/2-серверам;
  • возможности HTTP/2 должны быть конвертированы в HTTP/1.1 при помощи прокси;
  • сокращение числа опциональных частей в протоколе;
  • отсутствие минорных версий в HTTP/2; при необходимости будет разработан протокол HTTP/3.

Новшества

Главное, на что направлена разработка нового протокола, – это на увеличение скорости загрузки страниц. Поэтому разработчики в том числе целились на избавление от некоторых элементов, которые препятствуют к повышению производительности.

HTTP/2 это бинарный протокол. Выбор в сторону бинарности был сделан для того, чтобы формирование пакетов проходило легче и проще. В частности, это позволило проще разделять части, которые связаны с протоколом, и те части, которые связаны с пакетом данных (эта проблема присутствует в HTTP/1).

Мультиплексирование потоков – это то, на что делается основная ставка в новой разработке. Если раньше пакеты множества потоков поставлялись бы отдельно, то при протоколе HTTP/2 пакеты в рамках одного соединения смешаны, а разделяются уже на другой стороне.

HTTP/1 и HTTP/2При этом каждый поток имеет свой вес или, другими словами, приоритет для того, чтобы можно было понять, какие потоки считаются более важными, а какие – менее важными. Это актуально в тех ситуациях, когда есть ограничения ресурсов, и сервер вынужден выбирать потоки, которые будут отправлены сначала.

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

Отдельно стоит вопрос сжатия. HTTP является протоколом без состояния, а значит, повторяющимся протоколом. На практике это выражается в том, что если на сервер идет запрос нескольких ресурсов (к примеру, картинок), то это рождает серию запросов, которые сами по себе является практически идентичными. Поэтому логично, что сжатие необходимо.

Однако подводные камни есть и здесь. В частности, сжатие HTTPS и SPDY уязвимы к атаке BREACH (Browser Reconnaissance and Exfiltration via Adaptive Compression of Hypertext), использующей недочеты алгоритма сжатия gzip/DEFLATE, и атаке CRIME (Compression Ratio Info-leak Made Easy), которая также эксплуатирует алгоритмы сжатия данных.

В результате команда HTTPbis создала HPACK – это специализированный протокол для сжатия HTTP/2-заголовков. При использовании протокола HTTP/2 служебные заголовки (на загрузку элементов страницы) передаются сжатыми, благодаря чему уменьшаются количество ресурсов, которые требуются для такой операции.

Еще один полезный фрейм – RST_STEAM. Он отвечает за отмену отправки сообщения, это используется для уменьшения растраты полосы пропускания и исключения разрыва соединения. Например, этот фрейм подойдет, если вам нужно быстро отметить посланный поток, который оказался ненужным.

HTTP/2 позволяет повысить безопасность ресурса, однако перед переходом на HTTP/2 нужно предварительно перейти на HTTPS (хотя сейчас, пожалуйста, подавляющее большинство уже сделало это).

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

HTTP/2 поддерживают все основные браузеры: Chrome, Firefox, Opera, Edge, Safari.
Также рекомендуется быстрее перейти на HTTP/2 тем, у кого много мобильного трафика.

Переход на HTTP/2

Тем, кто заинтересовался переходом на HTTP/2, я советую прочитать вот эту документацию на английском языке: https://cdn.wp.nginx.com/wp-content/uploads/2015/09/NGINX_HTTP2_White_Paper_v4.pdf

Итог

HTTP/2 – это протокол, который, с одной стороны, содержит в себе наследие HTTP/1, а с другой стороны, имеет массу преимуществ по передаче данных, результатом чего стало значительное превосходство новой версии протокола над своим предшественником.

В Timeweb HTTP/2 можно подключить в Панели виртуального хостинга в разделе "Сайты".

Комментарии

Алексей Шкарупа 0
04 сен в 2017
Как бы все здорово, но возникает закономерный вопрос: когда HTTP/2 появится на серверах TimeWeb?
Свернуть ответы
Кристина Лихова +175
04 сен в 2017
Здравствуйте, Алексей.

На данный момент мы еще не приступали к внедрению HTTP/2, мы следим за актуальностью этой идеи. Вы можете проголосовать за идею по следующей ссылке: https://hosting.timeweb.ru/ideas/2739
Лавр Иванов +115
27 дек в 2017
Недавно написал в поддержку, сказали что реализовано)
Проверил, всё круто!
Alex Shkarupa 0
29 дек в 2017
Реализовано, но не до конца.
Пока работает только для PHP-страниц.

А вот статика по-прежнему отдается по HTTP 1.1 - значит прироста скорости пока не будет
Свернуть ответы
Кристина Лихова +175
29 дек в 2017
Добрый день!

Спасибо за Ваш комментарий, передали информацию нашим инженерам для ознакомления.
С помощью соцсетей
У меня нет аккаунта Зарегистрироваться
Нажимая кнопку «Зарегистрироваться», я даю согласие на обработку своих персональных данных, указанных в форме регистрации.
С помощью соцсетей
У меня уже есть аккаунт Войти
Нажимая кнопку «Зарегистрироваться», я даю согласие на обработку своих персональных данных, указанных в форме регистрации.
Инструкции по восстановлению пароля высланы на Ваш адрес электронной почты.
Пожалуйста, укажите email, который Вы использовали для входа на сайт.