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). Каждое сообщение состоит из:
- Стартовой строки: для запроса — метод, URI, версия протокола (например,
GET /index.html HTTP/1.1); для ответа — версия протокола, код состояния, пояснение (например,HTTP/1.1 200 OK). - Заголовков (headers): набор пар «ключ: значение», передающих метаданные (тип контента, длина, язык, информация о кэшировании, cookies и т.д.).
- Пустой строки, отделяющей заголовки от тела.
- Тела сообщения (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 →