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

Протокол передачи данных HTTP

HTTP (Hypertext Transfer Protocol — протокол передачи гипертекста) — это протокол прикладного уровня модели OSI, используемый для передачи данных в распределённых информационных системах, в первую очередь во Всемирной паутине. HTTP является основой обмена информацией между веб-серверами и клиентами (обычно веб-браузерами), обеспечивая запросы и ответы в формате «запрос-ответ». Протокол определяет структуру сообщений, методы взаимодействия и коды состояния, но не гарантирует сохранность соединения (является протоколом без сохранения состояния).

История развития

Ранние версии

Первая версия протокола, HTTP/0.9, была разработана Тимом Бернерсом-Ли в 1991 году в рамках проекта CERN. Она поддерживала только передачу простых HTML-документов без заголовков и метаданных. Запрос состоял из одной строки (например, GET /index.html), а ответ — только из тела документа.

HTTP/1.0

В 1996 году была опубликована спецификация HTTP/1.0 (RFC 1945). Она ввела заголовки запросов и ответов, коды состояния (например, 200 OK, 404 Not Found), а также поддержку различных типов контента (MIME-типы). Однако каждая пара «запрос-ответ» требовала отдельного TCP-соединения, что приводило к значительным накладным расходам.

HTTP/1.1

В 1997 году вышла версия HTTP/1.1 (RFC 2068, позже обновлённая в RFC 2616 и RFC 7230–7235). Ключевые нововведения:

  • Постоянные соединения (keep-alive) — возможность отправлять несколько запросов по одному TCP-соединению.
  • Конвейеризация (pipelining) — отправка нескольких запросов без ожидания ответа на предыдущий (реализована не полностью из-за проблем с совместимостью).
  • Поддержка виртуальных хостов — возможность размещать несколько сайтов на одном IP-адресе (заголовок Host).
  • Кэширование — заголовки Cache-Control, ETag, Last-Modified.
  • Фрагментация передачи — использование заголовка Transfer-Encoding: chunked.

HTTP/1.1 остаётся наиболее распространённой версией протокола по состоянию на 2020-е годы, несмотря на появление более новых версий.

HTTP/2

В 2015 году был стандартизирован HTTP/2 (RFC 7540), основанный на протоколе SPDY от Google. Основные отличия:

  • Бинарный формат — вместо текстового (как в HTTP/1.x) данные передаются в бинарных фреймах, что упрощает парсинг и снижает задержки.
  • Мультиплексирование — несколько потоков данных могут передаваться по одному TCP-соединению одновременно, устраняя проблему «головы очереди» (head-of-line blocking) на уровне протокола.
  • Сжатие заголовков — использование HPACK для уменьшения объёма передаваемых метаданных.
  • Server Pushсервер может отправлять клиенту ресурсы (например, CSS или изображения) до того, как клиент их запросит.

HTTP/2 широко поддерживается современными браузерами и серверами, но требует использования шифрования (TLS) в большинстве реализаций.

HTTP/3

В 2022 году был опубликован стандарт HTTP/3 (RFC 9114), который использует транспортный протокол QUIC (основан на UDP вместо TCP). Преимущества:

  • Уменьшение задержек соединения — за счёт 0-RTT (zero round-trip time) для повторных подключений.
  • Устойчивость к потере пакетов — мультиплексирование не блокирует другие потоки при потере одного пакета.
  • Встроенное шифрованиеQUIC требует обязательного шифрования, аналогичного TLS 1.3.

HTTP/3 постепенно внедряется крупными интернет-компаниями (Google, Cloudflare, Meta — организация признана экстремистской и запрещена в РФ).

Структура сообщений

Запрос

HTTP-запрос состоит из трёх частей:

  1. Стартовая строка — содержит метод (например, GET), URI (унифицированный идентификатор ресурса) и версию протокола (например, HTTP/1.1).
  2. Заголовки — набор пар «ключ-значение» (например, Host: example.com, User-Agent: Mozilla/5.0).
  3. Тело (опционально) — данные, передаваемые в запросе (например, содержимое формы при POST).

Ответ

HTTP-ответ включает:

  1. Стартовая строка — версия протокола, код состояния (например, 200 OK, 404 Not Found) и поясняющая фраза.
  2. Заголовки — метаданные ответа (например, Content-Type: text/html, Content-Length: 1234).
  3. Тело — запрашиваемые данные (HTML-страница, изображение, JSON-объект и т.д.).

Методы HTTP

HTTP определяет несколько методов (глаголов), указывающих желаемое действие над ресурсом:

МетодОписаниеИдемпотентностьБезопасность
GETЗапрос ресурсаДаДа
HEADПолучение заголовков ответа без телаДаДа
POSTСоздание нового ресурса или отправка данныхНетНет
PUTПолная замена ресурсаДаНет
PATCHЧастичное изменение ресурсаНетНет
DELETEУдаление ресурсаДаНет
OPTIONSПолучение поддерживаемых методов для ресурсаДаДа
TRACEДиагностика — возврат полученного запросаДаДа

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

Коды состояния

Коды состояния HTTP делятся на пять классов:

  • 1xx (Информационные) — запрос принят, обработка продолжается (например, 100 Continue).
  • 2xx (Успешные) — запрос успешно обработан (200 OK, 201 Created, 204 No Content).
  • 3xx (Перенаправления) — клиент должен выполнить дополнительное действие (301 Moved Permanently, 302 Found, 304 Not Modified).
  • 4xx (Клиентские ошибки) — ошибка на стороне клиента (400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found, 429 Too Many Requests).
  • 5xx (Серверные ошибки) — ошибка на стороне сервера (500 Internal Server Error, 502 Bad Gateway, 503 Service Unavailable).

Заголовки HTTP

Заголовки HTTP делятся на несколько категорий:

  • Общие заголовки — применяются и к запросу, и к ответу (например, Cache-Control, Connection, Date).
  • Заголовки запроса — передают информацию о клиенте и запросе (Host, User-Agent, Accept, Authorization, Cookie).
  • Заголовки ответа — описывают сервер и ответ (Server, Set-Cookie, Location, WWW-Authenticate).
  • Заголовки сущности — описывают тело сообщения (Content-Type, Content-Length, Content-Encoding, ETag).

Механизмы кэширования

HTTP поддерживает кэширование для уменьшения нагрузки на сервер и ускорения загрузки страниц. Основные механизмы:

  • Заголовок Cache-Control — задаёт директивы кэширования (например, max-age=3600, no-cache, private).
  • Заголовок Expires — устаревший, указывает абсолютную дату истечения кэша.
  • Условные запросы — используют заголовки If-Modified-Since (на основе Last-Modified) и If-None-Match (на основе ETag) для проверки актуальности кэшированной копии.

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

HTTPS

HTTPS (HTTP Secure) — это расширение HTTP, использующее шифрование через протоколы TLS (Transport Layer Security) или SSL (Secure Sockets Layer). HTTPS обеспечивает:

  • Конфиденциальность — данные шифруются, что предотвращает их перехват.
  • Целостность — защита от подмены данных в пути.
  • Аутентификацию — проверка подлинности сервера через цифровые сертификаты.

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

Аутентификация

HTTP поддерживает несколько схем аутентификации:

  • Basic — передача имени пользователя и пароля в кодировке Base64 (небезопасно без HTTPS).
  • Digest — использование хеширования пароля с случайной строкой (nonce).
  • Bearer — передача токена доступа (например, в OAuth 2.0).
  • API-ключи — передача ключа в заголовке или параметре запроса.

Ограничения и критика

  • Отсутствие состояния — каждый запрос обрабатывается независимо, что требует дополнительных механизмов (cookies, сессии) для поддержания состояния пользователя.
  • Избыточность заголовков — в HTTP/1.x заголовки передаются в текстовом виде и не сжимаются (в HTTP/2 и HTTP/3 эта проблема решена).
  • Проблема «головы очереди» — в HTTP/1.1 задержка одного запроса может блокировать последующие (частично решена в HTTP/2 мультиплексированием, но на уровне TCP сохраняется).
  • Отсутствие встроенного шифрования — HTTP без HTTPS не обеспечивает защиту данных (в HTTP/3 шифрование обязательно).

Применение

HTTP используется не только для передачи веб-страниц, но и для:

  • REST API — обмен данными между клиентами и серверами в формате JSON или XML.
  • WebDAV — управление файлами на удалённом сервере.
  • Потоковое видео — через HTTP Live Streaming (HLS) и Dynamic Adaptive Streaming over HTTP (DASH).
  • WebSocket — начальное рукопожатие выполняется через HTTP, после чего соединение переключается на бинарный протокол.

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

  • Первоначально HTTP был разработан для передачи только текстовых документов, но со временем стал поддерживать любые типы данных (изображения, видео, бинарные файлы).
  • Код состояния 418 «I'm a teapot» (я — чайник) был введён как шутка в RFC 2324 (Hyper Text Coffee Pot Control Protocol) и иногда используется в пасхальных яйцах.
  • HTTP/2 был разработан рабочей группой IETF (Internet Engineering Task Force) на основе протокола SPDY, который Google внедрил в 2009 году.
  • По данным W3Techs, на начало 2024 года около 70% всех веб-сайтов используют HTTP/2, а около 25% — HTTP/3.

Источники

  1. RFC 1945 — Hypertext Transfer Protocol — HTTP/1.0 (1996).
  2. RFC 2616 — Hypertext Transfer Protocol — HTTP/1.1 (1999).
  3. RFC 7540 — Hypertext Transfer Protocol Version 2 (HTTP/2) (2015).
  4. RFC 9114 — HTTP/3 (2022).
  5. «HTTP: The Definitive Guide» by David Gourley and Brian Totty (O'Reilly Media, 2002).
  6. «HTTP/2 in Action» by Barry Pollard (Manning Publications, 2019).
  7. Материалы сайта MDN Web Docs (Mozilla Developer Network).

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

На главную BFOmetr →