Протокол передачи данных 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-запрос состоит из трёх частей:
- Стартовая строка — содержит метод (например,
GET), URI (унифицированный идентификатор ресурса) и версию протокола (например,HTTP/1.1). - Заголовки — набор пар «ключ-значение» (например,
Host: example.com,User-Agent: Mozilla/5.0). - Тело (опционально) — данные, передаваемые в запросе (например, содержимое формы при
POST).
Ответ
HTTP-ответ включает:
- Стартовая строка — версия протокола, код состояния (например,
200 OK,404 Not Found) и поясняющая фраза. - Заголовки — метаданные ответа (например,
Content-Type: text/html,Content-Length: 1234). - Тело — запрашиваемые данные (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.
Источники
- RFC 1945 — Hypertext Transfer Protocol — HTTP/1.0 (1996).
- RFC 2616 — Hypertext Transfer Protocol — HTTP/1.1 (1999).
- RFC 7540 — Hypertext Transfer Protocol Version 2 (HTTP/2) (2015).
- RFC 9114 — HTTP/3 (2022).
- «HTTP: The Definitive Guide» by David Gourley and Brian Totty (O'Reilly Media, 2002).
- «HTTP/2 in Action» by Barry Pollard (Manning Publications, 2019).
- Материалы сайта MDN Web Docs (Mozilla Developer Network).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →