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

HTTP

HTTP (англ. HyperText Transfer Protocol — «протокол передачи гипертекста») — это протокол прикладного уровня модели OSI, используемый для передачи данных в распределённых информационных системах, в первую очередь во Всемирной паутине (World Wide Web). HTTP является основой обмена данными между веб-браузерами (клиентами) и веб-серверами. Протокол работает по схеме «запрос-ответ»: клиент отправляет серверу запрос, содержащий метод, URI и версию протокола, а сервер возвращает ответ, включающий статус-код, заголовки и, при необходимости, тело сообщения (например, HTML-страницу, изображение или JSON-данные). HTTP не сохраняет состояние между запросами (stateless), что означает, что каждый запрос обрабатывается сервером независимо, без контекста предыдущих взаимодействий. Для поддержания сессий и авторизации используются дополнительные механизмы, такие как cookies, токены или сессионные идентификаторы. Протокол был разработан в 1989–1991 годах Тимом Бернерсом-Ли в ЦЕРНе (Европейская организация по ядерным исследованиям) как часть проекта создания глобальной гипертекстовой системы.

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

Ранние версии (HTTP/0.9 и HTTP/1.0)

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

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

HTTP/1.1

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

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

HTTP/1.1 остаётся широко используемым протоколом, но его ограничения (например, head-of-line blocking — блокировка очереди запросов) привели к разработке более новых версий.

HTTP/2

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

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

HTTP/2 не изменяет семантику протокола (методы, коды состояния, заголовки остаются теми же), но меняет способ передачи данных. По состоянию на 2024 год значительная часть веб-трафика (более 60 %) использует HTTP/2.

HTTP/3

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

  • Уменьшение задержек соединения: QUIC объединяет установку соединения и шифрование (по умолчанию использует TLS 1.3), что сокращает число round-trips (обменов пакетами) до одного.
  • Устранение head-of-line blocking на транспортном уровне: в TCP потеря одного пакета блокирует все потоки данных, в QUIC каждый поток обрабатывается независимо.
  • Встроенная поддержка миграции соединений: при смене сети (например, с Wi-Fi на мобильный интернет) соединение не разрывается.
  • Шифрование по умолчанию: в отличие от HTTP/2, где шифрование не является обязательным, HTTP/3 требует использования TLS.

HTTP/3 активно внедряется крупными платформами (Google, YouTube, Facebook, Cloudflare) и поддерживается большинством современных браузеров.

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

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

HTTP основан на архитектуре «клиент-сервер». Клиентом обычно выступает веб-браузер или мобильное приложение, сервером — программа, обрабатывающая запросы и возвращающая ресурсы (веб-серверы, такие как Apache, Nginx, IIS). Промежуточные узлы, такие как прокси-серверы, шлюзы и кэширующие серверы, могут модифицировать, фильтровать или кэшировать трафик.

Формат сообщений

Сообщения HTTP делятся на запросы (request) и ответы (response). Каждое сообщение состоит из:

  1. Стартовой строки: для запроса — метод, URI, версия протокола (например, GET /index.html HTTP/1.1); для ответа — версия протокола, код состояния, пояснение (например, HTTP/1.1 200 OK).
  2. Заголовков (headers): набор пар «ключ: значение», передающих метаданные (тип контента, длина, язык, информация о кэшировании, cookies и т.д.).
  3. Пустой строки, отделяющей заголовки от тела.
  4. Тела сообщения (body): опционально, содержит передаваемые данные (HTML, JSON, файл).

Методы HTTP

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

  • GET: запрос на получение ресурса. Не должен изменять состояние сервера (идемпотентен).
  • POST: отправка данных на сервер для создания нового ресурса (например, отправка формы).
  • PUT: замена существующего ресурса или создание нового по указанному URI.
  • DELETE: удаление ресурса.
  • PATCH: частичное изменение ресурса.
  • HEAD: аналогичен GET, но сервер возвращает только заголовки без тела.
  • OPTIONS: запрос информации о поддерживаемых методах для данного ресурса.
  • TRACE: отладочный метод, возвращающий полученный запрос (используется для диагностики).
  • CONNECT: установка туннеля через прокси-сервер (часто используется для HTTPS).

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

Ответ сервера содержит трёхзначный код состояния, классифицируемый по первой цифре:

  • 1xx (Informational): информация (например, 101 Switching Protocols — переключение на WebSocket).
  • 2xx (Success): успешное выполнение (200 OK, 201 Created, 204 No Content).
  • 3xx (Redirection): перенаправление (301 Moved Permanently, 302 Found, 304 Not Modified).
  • 4xx (Client Error): ошибка клиента (400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found, 429 Too Many Requests).
  • 5xx (Server Error): ошибка сервера (500 Internal Server Error, 502 Bad Gateway, 503 Service Unavailable).

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

HTTP vs HTTPS

HTTP передаёт данные в открытом виде, что делает его уязвимым для перехвата и модификации (атаки «человек посередине»). Для обеспечения конфиденциальности и целостности используется HTTPS (HTTP Secure) — комбинация HTTP с протоколами шифрования TLS (Transport Layer Security) или SSL (Secure Sockets Layer). HTTPS шифрует всё содержимое запросов и ответов, включая URI, заголовки и тело. По состоянию на 2024 год более 90 % веб-трафика использует HTTPS, а поисковые системы (Google) и браузеры (Chrome, Firefox) помечают HTTP-сайты как «небезопасные».

Атаки на HTTP

Наиболее распространённые уязвимости, связанные с HTTP:

  • Cross-Site Scripting (XSS): внедрение вредоносного кода в веб-страницы.
  • Cross-Site Request Forgery (CSRF): выполнение неавторизованных действий от имени аутентифицированного пользователя.
  • SQL-инъекции: внедрение SQL-запросов через параметры запроса.
  • Session hijacking: перехват сессионных cookies.
  • Man-in-the-Middle (MITM): перехват и подмена трафика (актуально для незащищённых HTTP-соединений).

Для защиты применяются такие меры, как Content Security Policy (CSP), HTTP Strict Transport Security (HSTS), SameSite cookies, использование анти-CSRF токенов и регулярное обновление серверного ПО.

Применение

Веб-серфинг

Основное применение HTTP — загрузка веб-страниц в браузере. Браузер отправляет GET-запросы на сервер, получает HTML-документ, а затем автоматически запрашивает связанные ресурсы (CSS, JavaScript, изображения, шрифты). Современные браузеры поддерживают HTTP/2 и HTTP/3 для ускорения загрузки.

API и веб-сервисы

HTTP широко используется для построения RESTful API (Representational State Transfer). В этом контексте ресурсы представляются в виде URI, а методы HTTP (GET, POST, PUT, DELETE) соответствуют операциям CRUD (Create, Read, Update, Delete). Данные обычно передаются в формате JSON или XML. Примеры: API социальных сетей (Twitter, VK), облачных сервисов (AWS S3, Google Drive), платёжных систем (Stripe, PayPal).

Потоковая передача и загрузка файлов

HTTP поддерживает передачу больших объёмов данных (видео, аудио, архивы) через частичные запросы (Range Requests) и потоковую передачу (chunked encoding). Протокол используется для загрузки файлов через браузер (download) и выгрузки (upload) через формы или API.

Веб-сокеты и реальное время

Хотя HTTP сам по себе не предназначен для двусторонней связи в реальном времени, протокол WebSocket (RFC 6455) использует HTTP-запрос для установки соединения (через заголовок Upgrade), после чего переключается на собственный протокол. Это позволяет реализовать чаты, онлайн-игры и уведомления.

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

  • Первый в истории веб-сервер (CERN httpd) был запущен в 1991 году на компьютере NeXTcube Тима Бернерса-Ли. Он работал по протоколу HTTP/0.9.
  • Код состояния 404 («Not Found») стал широко известен в поп-культуре как символ ошибки в интернете. Существует множество «пасхальных яиц» и мемов, связанных с этой ошибкой.
  • Заголовок User-Agent в HTTP-запросах часто используется для идентификации браузера и операционной системы клиента. Многие серверы и сайты адаптируют контент в зависимости от этого заголовка.
  • Протокол HTTP изначально не предполагал шифрования. HTTPS был разработан компанией Netscape в 1994 году для безопасных онлайн-транзакций.
  • В 2022 году протокол HTTP/3 был официально стандартизирован как RFC 9114, хотя его реализация (на базе QUIC) использовалась Google и другими компаниями с 2016 года.
  • Спецификация HTTP/1.1 (RFC 2616) занимала около 170 страниц текста, в то время как HTTP/2 (RFC 7540) — около 100 страниц, а HTTP/3 (RFC 9114) — около 150 страниц.

Источники

  • 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)
  • Tim Berners-Lee, «Weaving the Web» (1999)
  • Документация Mozilla Developer Network (MDN) — HTTP
  • Материалы IETF (Internet Engineering Task Force) по протоколу HTTP

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

На главную BFOmetr →