Протокол 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-запрос состоит из:
- Строка запроса (request line): метод, URI (Uniform Resource Identifier) и версия протокола. Например:
GET /index.html HTTP/1.1. - Заголовки (headers): метаданные запроса, такие как
Host,User-Agent,Accept,Cookie,Authorization. - Тело запроса (body): опционально, используется для передачи данных (например, в POST-запросах).
¶Структура ответа
HTTP-ответ состоит из:
- Строка статуса (status line): версия протокола, код состояния и текстовое описание. Например:
HTTP/1.1 200 OK. - Заголовки (headers): метаданные ответа, такие как
Content-Type,Content-Length,Set-Cookie,Cache-Control. - Тело ответа (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 →


