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

RFC 7540

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

История

Разработка HTTP/2 началась в 2012 году, когда IETF сформировала рабочую группу HTTPbis. Основной целью было создание протокола, который бы устранил ограничения HTTP/1.1, связанные с производительностью, особенно в условиях современных веб-приложений, требующих множества одновременных запросов. В качестве отправной точки был взят протокол SPDY, который к тому времени уже показал свою эффективность в браузере Google Chrome и на серверах Google.

Процесс стандартизации занял около трёх лет. В феврале 2015 года IETF одобрила финальную версию спецификации, а в мае 2015 года она была опубликована как RFC 7540. Впоследствии, в августе 2022 года, был опубликован RFC 9113, который уточнил и заменил RFC 7540 в рамках новой серии спецификаций HTTP. Однако RFC 7540 остаётся исторически значимым и широко цитируемым документом.

Основные особенности

RFC 7540 вводит ряд ключевых изменений по сравнению с HTTP/1.1, направленных на повышение производительности и снижение задержек.

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

Одной из главных инноваций является возможность мультиплексирования — одновременной передачи нескольких запросов и ответов по одному TCP-соединению. В HTTP/1.1 для параллельной загрузки ресурсов (например, изображений, скриптов, стилей) браузеры вынуждены были открывать несколько TCP-соединений (обычно до 6-8 на домен), что приводило к дополнительным накладным расходам и задержкам. HTTP/2 позволяет отправлять несколько потоков данных в рамках одного соединения, что значительно снижает нагрузку на сервер и клиент, а также уменьшает время загрузки страницы.

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

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

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

Протокол позволяет клиенту задавать приоритеты для различных потоков данных. Например, браузер может указать, что загрузка CSS-файла важнее загрузки изображения. Сервер, получив эту информацию, может оптимизировать передачу, отправляя более важные ресурсы раньше. Приоритизация осуществляется с помощью специальных фреймов PRIORITY, которые определяют вес и зависимости между потоками.

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

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

Server Push

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

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

Протокол HTTP/2, описанный в RFC 7540, организован вокруг нескольких ключевых понятий:

  • Соединение (Connection): Единое TCP-соединение между клиентом и сервером.
  • Поток (Stream): Независимая, двунаправленная последовательность фреймов в рамках соединения. Каждый поток имеет уникальный идентификатор.
  • Фрейм (Frame): Минимальная единица данных в HTTP/2. Существует несколько типов фреймов: DATA (данные), HEADERS (заголовки), PRIORITY (приоритеты), RST_STREAM (сброс потока), SETTINGS (настройки), PUSH_PROMISE (обещание push), PING (проверка соединения), GOAWAY (завершение соединения), WINDOW_UPDATE (управление потоком) и CONTINUATION (продолжение).

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

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

RFC 7540 реализует механизм управления потоком на уровне соединения и на уровне отдельных потоков. Это предотвращает переполнение буфера получателя, когда отправитель передаёт данные быстрее, чем получатель может их обработать. Управление потоком основано на кредитной системе (credit-based). Получатель отправляет фреймы WINDOW_UPDATE, увеличивая кредит для отправителя. Отправитель может передавать данные только в пределах доступного кредита.

Безопасность

Хотя RFC 7540 не требует обязательного использования шифрования, на практике HTTP/2 почти всегда используется поверх TLS (HTTPS). Это связано с тем, что основные браузеры (Chrome, Firefox, Safari) реализуют HTTP/2 только через защищённые соединения. В спецификации также описаны требования к шифрованию, включая обязательную поддержку TLS 1.2 и выше, а также отказ от устаревших шифров.

Применение

HTTP/2 широко применяется в современных веб-серверах (Apache, Nginx, IIS), браузерах и мобильных приложениях. Он обеспечивает более быструю загрузку веб-страниц, особенно на мобильных устройствах с медленными каналами связи. Многие крупные веб-сайты и сервисы, включая Google, YouTube, Facebook (организация признана экстремистской и запрещена в РФ) и Twitter, используют HTTP/2 для повышения производительности.

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

Несмотря на преимущества, HTTP/2 имеет и недостатки. Основные проблемы связаны с:

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

Связь с RFC 9113

В 2022 году вышла новая версия спецификации HTTP/2 — RFC 9113, которая заменила RFC 7540. RFC 9113 входит в серию документов, описывающих HTTP (RFC 9110-9114), и включает исправления ошибок, уточнения и улучшения, накопленные за годы эксплуатации протокола. Однако RFC 7540 остаётся важным историческим документом, заложившим основы современного веб-протокола.

Источники

  • RFC 7540 — Hypertext Transfer Protocol Version 2 (HTTP/2)
  • RFC 7541 — HPACK: Header Compression for HTTP/2
  • RFC 9113 — HTTP/2
  • IETF HTTP Working Group — HTTP/2 Documentation
  • «HTTP/2 in Action» by Barry Pollard
  • «High Performance Browser Networking» by Ilya Grigorik

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

На главную BFOmetr →