Протокол передачи гипертекста
Протокол передачи гипертекста (HyperText Transfer Protocol, HTTP) — это протокол прикладного уровня, используемый для передачи данных в распределённых информационных системах, в первую очередь во Всемирной паутине. HTTP является основным протоколом обмена данными между веб-серверами и клиентами (обычно веб-браузерами). Он работает по модели «запрос-ответ»: клиент инициирует соединение, отправляя запрос, а сервер возвращает ответ. Протокол не сохраняет состояние между запросами (stateless), то есть каждый запрос обрабатывается сервером независимо от предыдущих. HTTP лежит в основе работы интернета, обеспечивая доступ к веб-страницам, изображениям, видео и другим ресурсам.
История развития
Предпосылки и создание
Протокол HTTP был разработан в 1989–1991 годах британским учёным Тимом Бернерсом-Ли в Европейской организации по ядерным исследованиям (CERN) как часть проекта по созданию глобальной гипертекстовой системы, позже названной Всемирной паутиной. Первая спецификация HTTP/0.9 была опубликована в 1991 году и представляла собой простой протокол, поддерживающий только метод GET и передачу текстовых данных в формате HTML.
HTTP/1.0
В 1996 году была опубликована спецификация HTTP/1.0 (RFC 1945). Она добавила поддержку заголовков запроса и ответа, кодировок, типов содержимого (MIME-типы) и методов POST и HEAD. Однако протокол оставался неэффективным для современных веб-приложений из-за необходимости открывать новое TCP-соединение для каждого запроса.
HTTP/1.1
В 1997 году вышла спецификация HTTP/1.1 (RFC 2068, позже обновлённая в RFC 2616 в 1999 году). Эта версия стала стандартом де-факто на протяжении многих лет. Ключевые улучшения включали:
- Постоянные соединения (keep-alive): возможность отправлять несколько запросов и получать несколько ответов в рамках одного TCP-соединения.
- Конвейерная обработка (pipelining): отправка нескольких запросов без ожидания ответа на каждый.
- Поддержка виртуальных хостов: возможность обслуживать несколько доменов на одном IP-адресе с помощью заголовка
Host. - Кэширование: улучшенные механизмы управления кэшированием через заголовки
Cache-Control. - Поддержка фрагментированной передачи (chunked transfer encoding): передача данных частями, когда размер контента заранее неизвестен.
HTTP/2
В 2015 году был стандартизирован HTTP/2 (RFC 7540), основанный на протоколе SPDY, разработанном компанией Google. Основные нововведения:
- Бинарный формат: вместо текстового представления запросов и ответов используется двоичное кодирование, что ускоряет парсинг.
- Мультиплексирование: несколько запросов и ответов могут передаваться одновременно по одному TCP-соединению, устраняя проблему блокировки начала очереди (head-of-line blocking).
- Сжатие заголовков: использование алгоритма HPACK для уменьшения объёма передаваемых заголовков.
- Приоритизация потоков: возможность задавать приоритеты для разных запросов.
- Server Push: сервер может отправлять клиенту ресурсы, которые, вероятно, понадобятся, без явного запроса.
HTTP/3
В 2022 году был опубликован стандарт HTTP/3 (RFC 9114), который использует транспортный протокол QUIC вместо TCP. QUIC, разработанный Google, базируется на протоколе UDP и обеспечивает:
- Уменьшение задержек при установке соединения (0-RTT в некоторых случаях).
- Устранение блокировки начала очереди на уровне TCP.
- Встроенную поддержку шифрования (обязательное использование TLS 1.3).
- Улучшенную обработку потери пакетов (мультиплексирование не блокируется потерей одного пакета).
Архитектура и принцип работы
Модель «клиент-сервер»
HTTP работает по схеме «клиент-сервер». Клиентом выступает программа, инициирующая запрос (например, веб-браузер, мобильное приложение, поисковый робот). Сервером является программа, обрабатывающая запросы и возвращающая ответы (например, Apache, Nginx, IIS). Взаимодействие происходит через обмен сообщениями в формате, определённом протоколом.
Структура запроса
HTTP-запрос состоит из следующих частей:
- Стартовая строка (request line): содержит метод (например, GET, POST), URI запрашиваемого ресурса и версию протокола (например, HTTP/1.1).
- Заголовки (headers): набор пар «ключ-значение», передающих метаданные (например,
Host,User-Agent,Accept,Cookie). - Тело (body): опциональная часть, содержащая передаваемые данные (например, в POST-запросах при отправке формы).
Структура ответа
HTTP-ответ состоит из:
- Стартовая строка (status line): содержит версию протокола, код состояния (status code) и текстовое пояснение (например,
200 OK,404 Not Found,500 Internal Server Error). - Заголовки (headers): метаданные ответа (например,
Content-Type,Content-Length,Set-Cookie,Cache-Control). - Тело (body): запрашиваемые данные (HTML-код, изображение, JSON-объект и т.д.).
Коды состояния
Коды состояния 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). - 5xx (Ошибка сервера): сервер не смог выполнить запрос (например,
500 Internal Server Error,502 Bad Gateway,503 Service Unavailable).
Методы HTTP
Основные методы HTTP:
- GET: запрос содержимого указанного ресурса. Не должен изменять состояние сервера (идемпотентен).
- POST: отправка данных на сервер для создания или изменения ресурса. Не идемпотентен.
- PUT: полная замена указанного ресурса. Идемпотентен.
- PATCH: частичное изменение ресурса.
- DELETE: удаление указанного ресурса.
- HEAD: запрос, аналогичный GET, но без тела ответа (используется для получения метаданных).
- OPTIONS: запрос информации о поддерживаемых сервером методах для указанного ресурса.
- TRACE: отладка — возвращает полученный запрос для проверки промежуточных серверов.
Заголовки HTTP
Заголовки HTTP делятся на несколько категорий:
- Общие заголовки (general headers): применяются как к запросу, так и к ответу (например,
Cache-Control,Connection,Date). - Заголовки запроса (request headers): передают информацию о клиенте и запросе (например,
Host,User-Agent,Accept,Authorization,Cookie). - Заголовки ответа (response headers): передают информацию о сервере и ответе (например,
Server,Set-Cookie,Location,WWW-Authenticate). - Заголовки сущности (entity headers): описывают тело сообщения (например,
Content-Type,Content-Length,Content-Encoding,Last-Modified).
Безопасность и шифрование
HTTP vs HTTPS
Обычный HTTP передаёт данные в незашифрованном виде, что делает его уязвимым для атак типа «человек посередине» (MITM) и перехвата трафика. Для обеспечения конфиденциальности и целостности данных используется протокол HTTPS (HTTP Secure), который работает поверх протоколов шифрования TLS (Transport Layer Security) или его предшественника SSL (Secure Sockets Layer). HTTPS шифрует все передаваемые данные, включая URL, заголовки и тело запроса, а также аутентифицирует сервер с помощью цифровых сертификатов. В 2024 году использование HTTPS стало стандартом для большинства веб-сайтов, особенно тех, которые обрабатывают персональные данные, логины, пароли или платежную информацию.
Аутентификация
HTTP поддерживает несколько механизмов аутентификации, включая:
- Basic Access Authentication: передача имени пользователя и пароля в кодировке Base64 в заголовке
Authorization. Небезопасен без HTTPS. - Digest Access Authentication: более безопасный метод, использующий хеширование.
- Bearer Token: передача токена (например, JWT) в заголовке
Authorization. - Cookie-based Authentication: использование сессионных куки, устанавливаемых сервером после успешной аутентификации.
Применение
HTTP используется не только для передачи веб-страниц, но и в качестве основы для многих других протоколов и технологий:
- RESTful API: большинство современных веб-сервисов (например, социальные сети, облачные хранилища, платёжные системы) предоставляют программные интерфейсы на основе HTTP.
- WebSocket: протокол, инициализируемый через HTTP-запрос (handshake), после чего переключается на постоянное двунаправленное соединение.
- Загрузка файлов: HTTP используется для загрузки и скачивания файлов любого размера.
- Потоковое видео и аудио: протоколы HLS (HTTP Live Streaming) и MPEG-DASH используют HTTP для доставки мультимедийного контента.
- Веб-сокеты и Server-Sent Events: технологии для передачи данных в реальном времени.
Ограничения и критика
- Отсутствие состояния (statelessness): каждый запрос обрабатывается независимо, что требует дополнительных механизмов (куки, сессии) для поддержания состояния пользователя.
- Избыточность заголовков: в HTTP/1.1 заголовки могут занимать значительный объём, особенно при передаче множества мелких ресурсов.
- Блокировка начала очереди (head-of-line blocking): в HTTP/1.1 один медленный запрос может заблокировать все последующие в рамках одного соединения. Эта проблема частично решена в HTTP/2 и полностью — в HTTP/3.
- Отсутствие встроенного шифрования: безопасность не является частью протокола, что привело к необходимости создания HTTPS.
Интересные факты
- Первый в истории HTTP-запрос был отправлен Тимом Бернерсом-Ли в 1990 году для получения страницы с информацией о проекте World Wide Web.
- Код состояния
418 I'm a Teapot(я — чайник) был определён в первоапрельском RFC 2324 (Hyper Text Coffee Pot Control Protocol) и иногда используется в шутку. - Протокол HTTP используется не только в интернете, но и в локальных сетях (например, для управления сетевыми устройствами, принтерами, IP-камерами).
- Согласно статистике W3Techs на 2024 год, около 80% всех веб-сайтов используют HTTPS по умолчанию.
Источники
- RFC 1945 — Hypertext Transfer Protocol — HTTP/1.0
- RFC 2616 — Hypertext Transfer Protocol — HTTP/1.1
- RFC 7540 — Hypertext Transfer Protocol Version 2 (HTTP/2)
- RFC 9114 — Hypertext Transfer Protocol Version 3 (HTTP/3)
- Тим Бернерс-Ли, «Плетя паутину: истоки и будущее Всемирной паутины» (1999)
- Материалы сайта MDN Web Docs (Mozilla Developer Network)
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →