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

Протокол HTTP

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

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

Первые версии

Протокол HTTP был разработан Тимом Бернерсом-Ли в 1989–1991 годах в Европейской организации по ядерным исследованиям (CERN) как часть проекта World Wide Web. Первая документированная версия, HTTP/0.9, была чрезвычайно простой: она поддерживала только метод GET и не имела заголовков, позволяя передавать только HTML-документы.

В 1996 году была опубликована спецификация HTTP/1.0 (RFC 1945), которая ввела заголовки запроса и ответа, поддержку различных типов контента (MIME-типы) и методы POST и HEAD. Версия HTTP/1.0 стала основой для быстрого роста Всемирной паутины.

HTTP/1.1

В 1997 году вышла версия HTTP/1.1 (RFC 2068, позднее обновлённая до RFC 2616 в 1999 году), которая стала стандартом де-факто на протяжении почти двух десятилетий. Ключевые нововведения включали:

  • Постоянные соединения (keep-alive): возможность отправлять несколько запросов и получать несколько ответов в рамках одного TCP-соединения, что значительно снижало задержки.
  • Конвейерная обработка (pipelining): клиент мог отправлять несколько запросов, не дожидаясь ответа на каждый, хотя эта функция редко поддерживалась корректно.
  • Виртуальные хосты: возможность размещать несколько веб-сайтов на одном IP-адресе, используя заголовок Host.
  • Поддержка кэширования: заголовки Cache-Control, Expires и ETag для управления кэшированием.
  • Дополнительные методы: PUT, DELETE, OPTIONS, TRACE, CONNECT.

HTTP/2

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

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

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

HTTP/3

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

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

Архитектура и принципы работы

Модель «клиент-сервер»

HTTP работает по модели «запрос-ответ». Клиент (например, веб-браузер) инициирует соединение и отправляет запрос серверу. Сервер обрабатывает запрос и отправляет ответ. Соединение может быть как постоянным (persistent), так и временным.

Безсостоятельность (stateless)

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

Структура запроса

HTTP-запрос состоит из:

  1. Строка запроса (request line): метод, URI (Uniform Resource Identifier) и версия протокола. Например: GET /index.html HTTP/1.1.
  2. Заголовки (headers): метаданные запроса, такие как Host, User-Agent, Accept, Cookie, Authorization.
  3. Тело запроса (body): опционально, используется для передачи данных (например, в POST-запросах).

Структура ответа

HTTP-ответ состоит из:

  1. Строка статуса (status line): версия протокола, код состояния и текстовое описание. Например: HTTP/1.1 200 OK.
  2. Заголовки (headers): метаданные ответа, такие как Content-Type, Content-Length, Set-Cookie, Cache-Control.
  3. Тело ответа (body): запрашиваемые данные (HTML-страница, изображение, JSON-объект и т.д.).

Методы HTTP

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

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

Идемпотентность означает, что многократное выполнение одного и того же запроса приводит к одному и тому же состоянию сервера. Безопасность — метод не должен изменять состояние сервера.

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

Код состояния — трёхзначное число, указывающее результат обработки запроса. Классифицируются по первой цифре:

  • 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

Заголовки передают метаданные запроса или ответа. Делятся на несколько категорий:

  • Общие заголовки: применимы как к запросу, так и к ответу. Примеры: Date, Connection, Cache-Control.
  • Заголовки запроса: содержат информацию о клиенте и запрашиваемом ресурсе. Примеры: User-Agent, Accept, Cookie, Authorization.
  • Заголовки ответа: содержат информацию о сервере и ответе. Примеры: Server, Set-Cookie, Content-Type, Content-Length.
  • Сущностные заголовки: описывают тело сообщения. Примеры: Content-Type, Content-Encoding, Content-Language.

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

HTTP поверх TLS (HTTPS)

HTTPS (HTTP Secure) — это комбинация HTTP с протоколами шифрования TLS (Transport Layer Security) или его предшественником SSL (Secure Sockets Layer). HTTPS обеспечивает:

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

Использование HTTPS стало стандартом для современных веб-сайтов, особенно тех, которые обрабатывают конфиденциальные данные (логины, пароли, платежи).

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

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

  • Basic Authentication: передача имени пользователя и пароля в заголовке Authorization в кодировке Base64 (небезопасно без HTTPS).
  • Digest Authentication: более безопасный метод, использующий хеширование.
  • Bearer Authentication: передача токена доступа (например, JWT) в заголовке Authorization: Bearer <token>.

Ограничение скорости (Rate Limiting)

Серверы могут ограничивать количество запросов от одного клиента за определённый промежуток времени. Для этого используются заголовки Retry-After (в ответе) и X-RateLimit-* (нестандартные, но распространённые).

Кэширование

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

  • Принудительное кэширование: сервер указывает, что ресурс можно кэшировать на определённый срок с помощью заголовков Cache-Control: max-age=<seconds> или Expires.
  • Условное кэширование: клиент проверяет, изменился ли ресурс с момента последнего запроса, используя заголовки ETag (уникальный идентификатор версии) или Last-Modified (дата последнего изменения). Сервер отвечает кодом 304 Not Modified, если ресурс не изменился, и клиент использует свою локальную копию.

Применение за пределами веба

Хотя HTTP был разработан для передачи гипертекста, он широко используется в других областях:

  • RESTful API: большинство современных веб-сервисов (например, социальные сети, облачные хранилища) предоставляют API, работающие поверх HTTP.
  • Передача файлов: HTTP может использоваться для загрузки и скачивания файлов.
  • Потоковое видео и аудио: протоколы HLS (HTTP Live Streaming) и MPEG-DASH используют HTTP для доставки медиаконтента.
  • Интернет вещей (IoT): многие устройства используют HTTP для отправки данных на серверы.

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

  • Избыточность заголовков: в HTTP/1.1 заголовки передаются в текстовом виде и могут занимать значительный объём, особенно при большом количестве запросов. HTTP/2 и HTTP/3 частично решают эту проблему сжатием.
  • Отсутствие встроенного шифрования: HTTP передаёт данные в открытом виде, что требует использования HTTPS для обеспечения безопасности.
  • Сложность управления состоянием: безсостоятельность протокола вынуждает разработчиков внедрять дополнительные механизмы (куки, сессии), что усложняет архитектуру.

Источники

  • Fielding, R., Gettys, J., Mogul, J., Frystyk, H., Masinter, L., Leach, P., Berners-Lee, T. (1999). Hypertext Transfer Protocol -- HTTP/1.1. RFC 2616.
  • Belshe, M., Peon, R., Thomson, M. (2015). Hypertext Transfer Protocol Version 2 (HTTP/2). RFC 7540.
  • Bishop, M. (2022). Hypertext Transfer Protocol Version 3 (HTTP/3). RFC 9114.
  • Berners-Lee, T. (1991). WorldWideWeb: Proposal for a HyperText Project. CERN.
  • Gourley, D., Totty, B. (2002). HTTP: The Definitive Guide. O'Reilly Media.

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

На главную BFOmetr →