HTTP/1.1
HTTP/1.1 (HyperText Transfer Protocol version 1.1) — это версия протокола прикладного уровня передачи гипертекстовых данных, используемая в распределённых информационных системах, прежде всего во Всемирной паутине (World Wide Web). HTTP/1.1 является развитием протокола HTTP/1.0 и на протяжении длительного времени (с конца 1990-х до середины 2010-х годов) служил основным стандартом для обмена данными между веб-браузерами и веб-серверами. Протокол определён в спецификации RFC 2616 (1999 год), позднее уточнённой в RFC 7230—7235 (2014 год). Ключевыми особенностями HTTP/1.1 являются поддержка постоянных соединений (keep-alive), конвейерной обработки запросов (pipelining), виртуальных хостов и механизмов кэширования.
История развития
Предпосылки создания
Протокол HTTP/1.0, стандартизированный в 1996 году (RFC 1945), имел существенный недостаток: каждое HTTP-соединение открывалось только для одного запроса и одного ответа, после чего закрывалось. При загрузке веб-страницы, содержащей множество ресурсов (изображения, стили, скрипты), браузеру приходилось устанавливать отдельное TCP-соединение для каждого элемента, что приводило к значительным задержкам и повышенной нагрузке на сеть.
Стандартизация
Работы над HTTP/1.1 начались в 1995 году в рамках рабочей группы HTTP (HTTP Working Group) Инженерного совета Интернета (IETF). Основная цель заключалась в устранении недостатков HTTP/1.0 и улучшении производительности. Первая версия спецификации была опубликована в январе 1997 года как RFC 2068, однако окончательная и наиболее широко используемая версия вышла в июне 1999 года как RFC 2616. В 2014 году спецификация была переработана и разделена на несколько документов: RFC 7230 (синтаксис и маршрутизация сообщений), RFC 7231 (семантика и содержимое), RFC 7232 (условные запросы), RFC 7233 (запросы диапазонов), RFC 7234 (кэширование) и RFC 7235 (аутентификация).
Внедрение и распространение
К началу 2000-х годов HTTP/1.1 стал доминирующим протоколом в Интернете. Все основные веб-серверы (Apache HTTP Server, Nginx, Internet Information Services) и браузеры (Internet Explorer, Netscape Navigator, Mozilla Firefox, Google Chrome) поддерживали его. Протокол оставался основным до появления HTTP/2 в 2015 году, но до сих пор используется значительной частью веб-сайтов и серверов.
Основные характеристики
Постоянные соединения (Keep-Alive)
Главное нововведение HTTP/1.1 — возможность использования одного TCP-соединения для нескольких последовательных запросов и ответов. По умолчанию в HTTP/1.1 соединение считается постоянным, если в заголовке не указано Connection: close. Это позволяет браузеру загружать множество элементов страницы через одно соединение, снижая задержки на установку новых соединений и уменьшая нагрузку на сервер.
Конвейерная обработка (Pipelining)
HTTP/1.1 позволяет отправлять несколько запросов на сервер без ожидания ответов на предыдущие. Сервер обязан обрабатывать запросы в порядке их поступления и отправлять ответы в том же порядке. На практике конвейерная обработка не получила широкого распространения из-за проблем с совместимостью (некоторые прокси-серверы и серверы обрабатывали её некорректно) и ограничений (так называемая «проблема головы очереди» — Head-of-Line blocking, когда медленный ответ блокирует все последующие).
Виртуальные хосты (Virtual Hosting)
HTTP/1.1 ввёл обязательный заголовок Host, который указывает имя домена, к которому обращается клиент. Это позволило размещать несколько веб-сайтов на одном IP-адресе и одном веб-сервере. Ранее, в HTTP/1.0, для различения сайтов использовались разные IP-адреса, что было неэффективно.
Механизмы кэширования
Протокол расширил возможности управления кэшированием. Были введены заголовки Cache-Control (с директивами max-age, no-cache, no-store, public, private и другими), ETag (тег объекта для условных запросов), а также уточнены правила работы с заголовками Expires и Last-Modified. Это позволило более гибко управлять временем жизни кэшированных копий ресурсов.
Условные запросы и запросы диапазонов
HTTP/1.1 поддерживает условные запросы (с заголовками If-Modified-Since, If-None-Match), которые позволяют клиенту запрашивать ресурс только в том случае, если он изменился с момента последнего запроса. Также протокол поддерживает запросы диапазонов (заголовок Range), позволяющие загружать часть файла (например, для докачки прерванной загрузки или потокового видео).
Улучшенная аутентификация
В HTTP/1.1 была добавлена поддержка механизма «дайджест-аутентификации» (Digest Access Authentication), более безопасного, чем базовая аутентификация (Basic Access Authentication), так как пароль передаётся не в открытом виде, а в виде хэша.
Структура сообщений
Запрос (Request)
HTTP-запрос состоит из строки запроса, заголовков и тела сообщения (опционально). Строка запроса включает метод (GET, POST, PUT, DELETE и другие), URI (унифицированный идентификатор ресурса) и версию протокола (HTTP/1.1). Пример: `` GET /index.html HTTP/1.1 Host: www.example.com User-Agent: Mozilla/5.0 Accept: text/html ``
Ответ (Response)
HTTP-ответ состоит из строки статуса, заголовков и тела сообщения. Строка статуса включает версию протокола, код состояния (например, 200 OK, 404 Not Found, 500 Internal Server Error) и текстовое описание. Пример: `` HTTP/1.1 200 OK Content-Type: text/html; charset=UTF-8 Content-Length: 1234 Date: Mon, 01 Jan 2024 12:00:00 GMT ``
Заголовки
Заголовки делятся на общие (применимые и к запросу, и к ответу), заголовки запроса, заголовки ответа и заголовки сущности. Ключевые заголовки HTTP/1.1 включают:
Host— обязательный, указывает имя хоста.Connection— управление постоянным соединением (например,keep-aliveилиclose).Content-Length— длина тела сообщения в байтах.Content-Type— тип содержимого (MIME-тип).Transfer-Encoding— кодирование передачи (например,chunkedдля передачи частями).Cache-Control— директивы кэширования.
Методы HTTP/1.1
Протокол определяет несколько методов (глаголов), указывающих желаемое действие с ресурсом:
- GET — запрос содержимого ресурса.
- HEAD — запрос заголовков ресурса без тела.
- POST — отправка данных на сервер для обработки (например, форма).
- PUT — замена ресурса переданными данными.
- DELETE — удаление ресурса.
- OPTIONS — запрос информации о поддерживаемых методах.
- TRACE — отладка, возвращает полученный запрос.
- CONNECT — установка туннеля (например, для HTTPS через прокси).
Коды состояния
Коды состояния HTTP/1.1 группируются по классам:
- 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).
Недостатки и ограничения
Проблема головы очереди (Head-of-Line blocking)
В рамках одного TCP-соединения запросы и ответы обрабатываются строго последовательно. Если ответ на первый запрос задерживается, все последующие запросы вынуждены ждать. Это ограничение существенно снижало производительность при загрузке сложных веб-страниц.
Избыточность заголовков
Каждый запрос и ответ содержат полные заголовки, которые часто дублируются (например, User-Agent, Accept, Cookie). Это увеличивает объём передаваемых данных, особенно при большом количестве мелких запросов.
Отсутствие сжатия заголовков
В отличие от HTTP/2, HTTP/1.1 не поддерживает сжатие заголовков, что приводит к дополнительным накладным расходам.
Ограниченная поддержка потоковой передачи
Протокол не оптимизирован для одновременной передачи множества потоков данных. Для обхода ограничений разработчики использовали такие техники, как склейка ресурсов (CSS sprites, объединение JavaScript-файлов) и шардинг доменов (размещение ресурсов на нескольких поддоменах для увеличения числа параллельных соединений).
Сравнение с другими версиями
HTTP/1.0
- HTTP/1.1 ввёл постоянные соединения (keep-alive) и обязательный заголовок
Host. - HTTP/1.0 не поддерживал конвейерную обработку и запросы диапазонов.
- В HTTP/1.0 кэширование было менее гибким (только заголовки
ExpiresиPragma).
HTTP/2
- HTTP/2 (2015 год) использует двоичный формат вместо текстового, что упрощает синтаксический анализ.
- HTTP/2 поддерживает мультиплексирование (одновременная передача нескольких потоков данных по одному соединению), что устраняет проблему головы очереди.
- HTTP/2 сжимает заголовки (HPACK).
- HTTP/2 поддерживает приоритизацию потоков и серверный push.
- HTTP/1.1 остаётся более простым в реализации и отладке, но уступает в производительности на современных высоконагруженных сайтах.
HTTP/3
- HTTP/3 (2022 год) работает поверх протокола QUIC (основан на UDP), что обеспечивает ещё более низкую задержку и устойчивость к потере пакетов.
- HTTP/1.1 несовместим с QUIC и требует TCP.
Применение в России
В России HTTP/1.1 широко использовался и продолжает использоваться на большинстве веб-сайтов, особенно на небольших и средних. Многие российские хостинг-провайдеры и серверы (например, на базе Nginx и Apache) по умолчанию поддерживают HTTP/1.1. В соответствии с законодательством РФ, передача данных через HTTP/1.1 может подвергаться фильтрации и блокировкам, осуществляемым Роскомнадзором в рамках Единого реестра запрещённых сайтов. При этом протокол не шифрует данные (в отличие от HTTPS), что делает его уязвимым для перехвата трафика.
Источники
- RFC 2616 — Hypertext Transfer Protocol — HTTP/1.1 (1999).
- RFC 7230—7235 — HTTP/1.1 Message Syntax and Routing, Semantics and Content, Conditional Requests, Range Requests, Caching, Authentication (2014).
- RFC 1945 — Hypertext Transfer Protocol — HTTP/1.0 (1996).
- Fielding, R., Gettys, J., Mogul, J., et al. «Hypertext Transfer Protocol — HTTP/1.1». Network Working Group, 1999.
- Gourley, D., Totty, B., Sayer, M., et al. «HTTP: The Definitive Guide». O'Reilly Media, 2002.
- Федеральный закон от 27.07.2006 № 149-ФЗ «Об информации, информационных технологиях и о защите информации».
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →