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

RFC 9113

RFC 9113 — это документ, опубликованный в июне 2022 года в серии Request for Comments (RFC) Инженерного совета Интернета (IETF), который определяет протокол HTTP/2 для передачи данных в сети Интернет. Он является стандартом, описывающим семантику, формат сообщений и правила взаимодействия между клиентом (например, веб-браузером) и сервером при использовании второй версии протокола HTTP. RFC 9113 заменяет предыдущий стандарт RFC 7540, уточняя и исправляя его положения на основе накопленного опыта эксплуатации.

История и контекст

Протокол HTTP/2 был разработан для решения проблем производительности HTTP/1.1, таких как избыточность заголовков, блокировка начала строки (head-of-line blocking) и неэффективное использование сетевых соединений. Первая версия спецификации HTTP/2 была опубликована в RFC 7540 в мае 2015 года. В 2022 году IETF выпустила обновлённую версию стандарта, объединив несколько связанных документов в единую серию. RFC 9113 стал частью этой серии, наряду с RFC 9110 (семантика HTTP) и RFC 9111 (кэширование HTTP).

Основные причины обновления включали:

  • Уточнение формулировок: исправление неоднозначных мест, которые приводили к различным интерпретациям при реализации.
  • Исправление ошибок безопасности: устранение уязвимостей, выявленных в ходе эксплуатации, таких как проблемы с управлением потоком и обработкой кадров.
  • Совместимость с новыми расширениями: добавление поддержки для будущих расширений протокола, например, для сжатия заголовков с использованием HPACK.

Основные характеристики

RFC 9113 сохраняет все ключевые особенности HTTP/2, определённые в RFC 7540, но с рядом уточнений.

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

Одним из главных нововведений HTTP/2 является возможность отправлять несколько запросов и ответов одновременно по одному TCP-соединению. Это достигается за счёт разбиения данных на кадры (frames) и их привязки к потокам (streams). Каждый поток имеет уникальный идентификатор и может быть независимо обработан. Это устраняет проблему блокировки начала строки, характерную для HTTP/1.1, где один медленный запрос мог задерживать все остальные.

Бинарный формат

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

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

RFC 9113 использует алгоритм HPACK для сжатия заголовков HTTP. Это значительно сокращает объём передаваемых данных, особенно при повторяющихся запросах, таких как куки или заголовки авторизации. Спецификация HPACK была уточнена в RFC 9113, чтобы избежать атак, связанных с переполнением динамической таблицы.

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

Протокол позволяет клиенту указывать приоритеты для разных потоков, что влияет на порядок обработки запросов сервером. RFC 9113 уточняет механизмы приоритизации, вводя более строгие правила для предотвращения манипуляций со стороны клиента.

Управление потоком (Flow Control)

Для предотвращения перегрузки получателя HTTP/2 реализует управление потоком на уровне соединения и на уровне отдельных потоков. RFC 9113 уточняет, как сервер и клиент должны обмениваться кадрами WINDOW_UPDATE для регулирования объёма передаваемых данных.

Структура протокола

Кадры (Frames)

Основной единицей данных в HTTP/2 является кадр. RFC 9113 определяет несколько типов кадров:

  • DATA — передача полезной нагрузки (тело запроса или ответа).
  • HEADERS — передача заголовков HTTP.
  • PRIORITY — установка приоритета потока.
  • RST_STREAM — немедленное завершение потока.
  • SETTINGS — согласование параметров соединения (например, размер окна управления потоком).
  • PUSH_PROMISE — обещание сервера отправить ресурс, который может понадобиться клиенту (Server Push).
  • PING — проверка работоспособности соединения.
  • GOAWAY — завершение соединения.
  • WINDOW_UPDATE — обновление окна управления потоком.
  • CONTINUATION — продолжение передачи заголовков, если они не поместились в один кадр HEADERS.

Потоки (Streams)

Поток — это двунаправленный канал для передачи данных между клиентом и сервером. Каждый поток имеет уникальный идентификатор (нечётные — для клиентов, чётные — для серверов). Потоки могут быть открыты, закрыты или находиться в состоянии «полузакрытия». RFC 9113 уточняет правила перехода между состояниями, чтобы избежать состояния гонки.

Server Push

Механизм Server Push позволяет серверу отправлять клиенту ресурсы, которые, по его мнению, понадобятся клиенту (например, CSS или JavaScript-файлы), без явного запроса. RFC 9113 ограничивает использование Server Push, отмечая, что он может быть неэффективным при неправильной реализации и часто приводит к избыточной передаче данных. В современных реализациях Server Push часто отключается по умолчанию.

Изменения по сравнению с RFC 7540

RFC 9113 вносит несколько ключевых изменений:

  • Уточнение обработки кадров SETTINGS: теперь сервер и клиент обязаны подтверждать получение настроек кадром SETTINGS ACK, иначе соединение может быть разорвано.
  • Исправление приоритизации: убран механизм приоритизации на основе зависимостей (dependency-based prioritization), который был сложен в реализации и часто приводил к ошибкам. Вместо него введена более простая схема с весами.
  • Запрет на использование некоторых кодов ошибок: например, код ошибки ENHANCE_YOUR_CALM (0x0B) был удалён из-за неоднозначности.
  • Уточнение обработки кадров PUSH_PROMISE: сервер не может отправлять PUSH_PROMISE для потоков, которые уже были закрыты.
  • Обновление алгоритма HPACK: добавлены меры защиты от атак, основанных на переполнении динамической таблицы.

Применение и реализация

RFC 9113 является основой для всех современных реализаций HTTP/2. Он используется в веб-серверах (например, Nginx, Apache, IIS), браузерах (Chrome, Firefox, Safari) и прокси-серверах (HAProxy, Envoy). Большинство крупных веб-сайтов и API-сервисов поддерживают HTTP/2, что позволяет ускорить загрузку страниц и снизить нагрузку на сеть.

В России HTTP/2 широко применяется в государственных информационных системах (например, портал «Госуслуги»), а также в коммерческих сервисах (Яндекс, Mail.ru, Сбербанк). Однако стоит отметить, что использование HTTP/2 в некоторых случаях может быть ограничено из-за особенностей сетевой инфраструктуры или требований к безопасности.

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

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

  • Сложность реализации: бинарный протокол и управление потоками требуют более сложного кода по сравнению с HTTP/1.1.
  • Проблемы с TCP: мультиплексирование по одному TCP-соединению может привести к тому, что потеря одного пакета задерживает все потоки (head-of-line blocking на уровне TCP). Эта проблема решается в HTTP/3, который работает поверх QUIC.
  • Server Push: механизм часто оказывается неэффективным, так как сервер не всегда может точно предсказать, какие ресурсы нужны клиенту.
  • Безопасность: HTTP/2 требует использования TLS (HTTPS) в большинстве браузеров, что увеличивает вычислительные затраты на сервере.

Будущее

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

Источники

  • RFC 9113 — HTTP/2 (IETF, 2022)
  • RFC 7540 — HTTP/2 (IETF, 2015)
  • RFC 9110 — HTTP Semantics (IETF, 2022)
  • RFC 9111 — HTTP Caching (IETF, 2022)
  • «HTTP/2 in Action» by Barry Pollard (Manning Publications, 2019)
  • «High Performance Browser Networking» by Ilya Grigorik (O'Reilly Media, 2013)

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

На главную BFOmetr →