Открыть сервис

Протокол HTTP/2

HTTP/2 — это вторая крупная версия сетевого протокола передачи гипертекста (HTTP), используемого для передачи данных в интернете. Разработанный рабочей группой IETF (Internet Engineering Task Force) на основе протокола SPDY компании Google, HTTP/2 был стандартизирован в мае 2015 года как RFC 7540. Основной целью создания HTTP/2 было повышение производительности веб-приложений за счёт снижения задержек и более эффективного использования сетевых ресурсов, при сохранении полной семантической совместимости с предыдущей версией HTTP/1.1.

История

Предшественник HTTP/2, протокол HTTP/1.1, использовавшийся с 1999 года, со временем стал демонстрировать ограничения в условиях современного веба. Основные проблемы включали: последовательную обработку запросов (head-of-line blocking), избыточность заголовков и неэффективное использование одного TCP-соединения. В 2009 году компания Google представила протокол SPDY, который стал экспериментальной платформой для тестирования новых механизмов ускорения передачи данных. SPDY продемонстрировал значительное улучшение производительности (на 15–50% по сравнению с HTTP/1.1) и был внедрён в браузеры Google Chrome и серверное ПО Google.

В 2012 году IETF сформировала рабочую группу HTTPbis для стандартизации нового протокола. В качестве основы был взят SPDY, но с рядом изменений: например, обязательное шифрование в стандарте не было закреплено, хотя на практике большинство реализаций поддерживают HTTPS. В феврале 2015 года IETF утвердила RFC 7540, а в мае 2015 года HTTP/2 был официально опубликован. К концу 2015 года поддержку протокола добавили все основные браузеры (Chrome, Firefox, Safari, Edge) и веб-серверы (Apache, Nginx, IIS). По данным W3Techs на 2024 год, HTTP/2 используется примерно на 35–40% всех веб-сайтов.

Основные отличия от HTTP/1.1

HTTP/2 не является заменой синтаксиса HTTP — он сохраняет те же методы (GET, POST, PUT и др.), коды состояния (200, 404, 500 и др.) и структуру URI. Изменения касаются исключительно транспортного уровня: как данные фреймируются, мультиплексируются и передаются по сети.

Бинарный протокол

В отличие от текстового HTTP/1.1, HTTP/2 является бинарным протоколом. Это означает, что данные передаются не в виде строк, а в виде двоичных фреймов. Бинарный формат упрощает парсинг, снижает вероятность ошибок и позволяет более эффективно обрабатывать данные на уровне сети. Фреймы делятся на несколько типов: DATA (передача тела сообщения), HEADERS (заголовки), SETTINGS (настройки соединения), PING (проверка соединения) и другие.

Мультиплексирование

Ключевое нововведение HTTP/2 — возможность отправлять несколько запросов и получать несколько ответов одновременно в рамках одного TCP-соединения. В HTTP/1.1 каждый запрос требовал отдельного соединения (или использовался механизм pipelining, который не получил широкого распространения из-за проблем с блокировкой). Мультиплексирование устраняет проблему head-of-line blocking на уровне протокола, позволяя браузеру отправлять запросы на ресурсы (изображения, стили, скрипты) параллельно, не дожидаясь завершения предыдущих.

Приоритизация потоков

HTTP/2 поддерживает приоритизацию потоков. Клиент может указать серверу, какие ресурсы важнее и должны быть отправлены в первую очередь (например, критический CSS или JavaScript), а какие могут быть загружены позже. Приоритеты задаются в виде дерева зависимостей, где каждый поток имеет вес и может зависеть от другого потока. Это позволяет оптимизировать отображение страницы, особенно в условиях медленных сетей.

Сжатие заголовков (HPACK)

В HTTP/1.1 заголовки передавались в текстовом виде без сжатия, что приводило к избыточности (например, повторяющиеся заголовки Cookie, User-Agent). HTTP/2 использует алгоритм HPACK для сжатия заголовков. HPACK основан на статической и динамической таблицах, которые хранят часто используемые заголовки и их значения. Это снижает объём передаваемых данных в среднем на 85–90%.

Server Push

HTTP/2 позволяет серверу отправлять клиенту ресурсы, которые могут потребоваться для отображения страницы, до того, как клиент их явно запросит. Например, если браузер запрашивает HTML-страницу, сервер может сразу отправить связанные с ней CSS-файлы и изображения. Server Push может сократить время загрузки, но на практике используется редко из-за сложностей с кэшированием и возможных проблем с избыточной отправкой данных.

Устройство и механизмы

Фреймы и потоки

Данные в HTTP/2 передаются в виде фреймов. Каждый фрейм принадлежит определённому потоку (stream). Поток — это виртуальный канал, по которому передаётся один запрос-ответ. Фреймы разных потоков могут перемежаться, что и обеспечивает мультиплексирование. Потоки имеют уникальные идентификаторы (нечётные для клиента, чётные для сервера) и могут быть открыты, закрыты или находиться в состоянии «полузакрыты».

Соединение и настройка

HTTP/2 работает поверх TCP. Перед началом передачи данных клиент и сервер обмениваются фреймами SETTINGS, в которых согласовывают параметры соединения: максимальный размер фрейма, начальный размер окна управления потоком, максимальное количество одновременных потоков и т.д. Управление потоком (flow control) реализовано на уровне каждого потока и всего соединения, чтобы предотвратить переполнение буфера получателя.

Установление соединения

HTTP/2 может работать как через шифрованное (HTTPS), так и через незашифрованное (HTTP) соединение. Для HTTPS используется расширение ALPN (Application-Layer Protocol Negotiation) протокола TLS, которое позволяет клиенту и серверу согласовать использование HTTP/2 ещё на этапе рукопожатия TLS. Для незащищённого соединения используется механизм Upgrade (заголовок Upgrade: h2c), но на практике подавляющее большинство реализаций HTTP/2 требуют TLS.

Применение

HTTP/2 широко применяется в современных веб-серверах, браузерах, CDN (сетях доставки контента) и прокси-серверах. Основные преимущества протокола особенно заметны на сайтах с большим количеством мелких ресурсов (изображения, скрипты, стили), где мультиплексирование и сжатие заголовков дают наибольший выигрыш. По данным исследований, переход на HTTP/2 может сократить время загрузки страницы на 10–50% в зависимости от условий сети и архитектуры сайта.

Примеры использования

  • Веб-серверы: Apache HTTP Server (модуль mod_http2), Nginx (начиная с версии 1.9.5), IIS (начиная с Windows 10/Server 2016), Caddy.
  • Браузеры: Google Chrome, Mozilla Firefox, Apple Safari, Microsoft Edge, Opera.
  • CDN: Cloudflare, Akamai, Fastly, Amazon CloudFront — все поддерживают HTTP/2 на своих edge-серверах.
  • Прокси: HAProxy, Envoy, Squid (с ограничениями).

Критика и ограничения

Несмотря на преимущества, HTTP/2 имеет ряд недостатков и критических замечаний:

  • Head-of-line blocking на уровне TCP: Хотя HTTP/2 устраняет блокировку на уровне протокола, он всё ещё работает поверх TCP. Потеря одного пакета может заблокировать все потоки в рамках одного TCP-соединения, так как TCP гарантирует доставку данных по порядку. Эта проблема частично решается в HTTP/3, который использует протокол QUIC поверх UDP.
  • Сложность реализации: Бинарный протокол, управление потоками, приоритизация и HPACK требуют более сложной реализации на стороне сервера и клиента по сравнению с HTTP/1.1.
  • Server Push: Механизм Server Push не получил широкого распространения из-за проблем с кэшированием и возможностью отправки ненужных ресурсов. В некоторых случаях он может ухудшить производительность, если сервер отправляет ресурсы, которые уже есть в кэше браузера.
  • Проблемы с прокси и фильтрацией: Некоторые старые прокси-серверы и межсетевые экраны могут неправильно обрабатывать бинарные фреймы HTTP/2, что приводит к разрыву соединения или снижению производительности.

Интересные факты

  • HTTP/2 был разработан на основе SPDY, но Google прекратил поддержку SPDY в 2016 году, рекомендовав перейти на HTTP/2.
  • В стандарте RFC 7540 есть раздел, описывающий «потоковую приоритизацию», но на практике многие реализации (включая Chrome) используют упрощённую схему приоритетов.
  • HTTP/2 не требует обязательного шифрования, но все основные браузеры (Chrome, Firefox, Safari) поддерживают его только через HTTPS, что фактически сделало шифрование обязательным для использования HTTP/2 в вебе.
  • Протокол HTTP/2 поддерживает до 256 одновременных потоков на одно соединение, хотя на практике обычно используется 100–128.

Будущее

HTTP/2 является текущим стандартом, но постепенно уступает место HTTP/3, который решает проблему блокировки на уровне TCP за счёт использования QUIC. Однако HTTP/2 остаётся широко распространённым и будет поддерживаться ещё многие годы, особенно на серверах и в инфраструктурах, где переход на QUIC затруднён.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →