HTTP

HTTP
�зображение логотипа
Название Hypertext Transfer Protocol
Уровень (по �одели OSI) Прикладной
Се�ейство TCP/IP
Создан в 1990
РџРѕСЂС‚/ID 80/TCP
Спецификация RFC 124, RFC 1945, RFC 2616, RFC 2617, RFC 6266, RFC 7230, RFC 7240, RFC 8446, RFC 9110.
Основные реализации (клиенты) Веб-браузеры, напри�ер, Internet Explorer, Mozilla Firefox, Opera, Google Chrome, Яндекс.�раузер, Microsoft Edge и др.
Основные реализации (серверы) Apache, IIS, nginx, Google Web Server и др.
Логотип Викисклада РњРµРґРёР°С„айлы РЅР° Викискладе

HTTP (англ. HyperText Transfer Protocol вЂ” «протокол передачи гипертекста») вЂ” сетевой протокол прикладного СѓСЂРѕРІРЅСЏ, который изначально предназначался для получения СЃ серверов гипертекстовых РґРѕРєСѓР�ентов РІ форР�ате HTML, Р° СЃ течениеР� РІСЂРµР�ени стал универсальныР� средствоР� взаиР�одействия Р�ежду узлаР�Рё как Р’СЃРµР�РёСЂРЅРѕР№ паутины, так Рё изолированных веб-инфраструктур. Определение РїРѕ РѕСЃРЅРѕРІРЅС‹Р� РґРѕРєСѓР�ентацияР�: HTTP — протокол СѓСЂРѕРІРЅСЏ приложений для распределС�нных, объединС�нных, гиперР�едийных инфорР�ационных систеР�, используеР�ый РІ глобальной инфорР�ационной инициативе Р’СЃРµР�РёСЂРЅРѕР№ паутины СЃ 1990 РіРѕРґР°[1].

Основные свойства

Основой HTTP является технология «клиент-сервер», то есть предполагается существование:

  • Потребителей (клиентов), которые инициируют соединение Р С‘ посылают запрос;
  • Поставщиков (серверов), которые ожидают соединения для получения запроса, РїСЂРѕРёР·РІРѕРґСЏС‚ необходиРС�ые действия Р С‘ возвращают обратно сообщение РЎРѓ результатоРС�.

HTTP РІ настоящее РІСЂРµР�СЏ РїРѕРІСЃРµР�естно используется РІРѕ Р’СЃРµР�РёСЂРЅРѕР№ паутине для получения инфорР�ации СЃ веб-сайтов. Р’ 2006 РіРѕРґСѓ РІ Северной РђР�ерике доля HTTP-трафика превысила долю P2P-сетей Рё составила 46 %, РёР· которых почти половина вЂ” это передача потокового видео Рё Р·РІСѓРєР°[2].

HTTP используется также в качестве «транспорта» для других протоколов прикладного уровня, таких как SOAP, XML-RPC, WebDAV.

РћСЃРЅРѕРІРЅС‹Р� объектоР� Р�анипуляции РІ HTTP является ресурс, РЅР° который указывает URI (Uniform Resource Identifier) РІ запросе клиента. Обычно такиР�Рё ресурсаР�Рё являются хранящиеся РЅР° сервере файлы, РЅРѕ РёР�Рё Р�РѕРіСѓС‚ быть логические объекты или что-то абстрактное. Особенностью протокола HTTP является РІРѕР·Р�ожность указать РІ запросе Рё ответе СЃРїРѕСЃРѕР± представления РѕРґРЅРѕРіРѕ Рё того же ресурса РїРѕ различныР� параР�етраР�: форР�ату, РєРѕРґРёСЂРѕРІРєРµ, языку Рё С‚. Рґ. (РІ частности, для этого используется HTTP-заголовок). Р�Р�енно благодаря РІРѕР·Р�ожности указания СЃРїРѕСЃРѕР±Р° кодирования сообщения клиент Рё сервер Р�РѕРіСѓС‚ РѕР±Р�ениваться двоичныР�Рё данныР�Рё, хотя данный протокол является текстовыР�.

HTTP вЂ” протокол прикладного СѓСЂРѕРІРЅСЏ; аналогичныР�Рё РµР�Сѓ являются FTP Рё SMTP. РћР±Р�ен сообщенияР�Рё РёРґС�С‚ РїРѕ обыкновенной СЃС…РµР�Рµ «запрос-ответ». Для идентификации ресурсов HTTP использует глобальные URI. Р’ отличие РѕС‚ Р�РЅРѕРіРёС… РґСЂСѓРіРёС… протоколов, HTTP РЅРµ сохраняет своего состояния. Это означает отсутствие сохранения РїСЂРѕР�ежуточного состояния Р�ежду параР�Рё «запрос-ответ». РљРѕР�поненты, использующие HTTP, Р�РѕРіСѓС‚ СЃР°Р�остоятельно осуществлять сохранение инфорР�ации Рѕ состоянии, связанной СЃ последниР�Рё запросаР�Рё Рё ответаР�Рё (наприР�ер, «куки» РЅР° стороне клиента, «сессии» РЅР° стороне сервера). Р�раузер, посылающий запросы, Р�ожет отслеживать задержки ответов. Сервер Р�ожет хранить IP-адреса Рё заголовки запросов последних клиентов. Однако СЃР°Р� протокол РЅРµ осведоР�Р»С�РЅ Рѕ предыдущих запросах Рё ответах, РІ РЅС�Р� РЅРµ предусР�отрена внутренняя поддержка состояния, Рє РЅРµР�Сѓ РЅРµ предъявляются такие требования.

Р�ольшинство протоколов предусР�атривает установление TCP-сессии, РІ С…РѕРґРµ которой РѕРґРёРЅ раз РїСЂРѕРёСЃС…РѕРґРёС‚ авторизация, Рё дальнейшие действия выполняются РІ контексте этой авторизации. HTTP же устанавливает отдельную TCP-сессию РЅР° каждый запрос; РІ более РїРѕР·РґРЅРёС… версиях HTTP было разрешено делать несколько запросов РІ С…РѕРґРµ РѕРґРЅРѕР№ TCP-сессии, РЅРѕ браузеры обычно запрашивают только страницу Рё включС�нные РІ РЅРµС� объекты (картинки, каскадные стили Рё С‚. Рї.), Р° затеР� сразу разрывают TCP-сессию. Для поддержки авторизованного (неанониР�РЅРѕРіРѕ) доступа РІ HTTP используются cookies; РїСЂРёС‡С�Р� такой СЃРїРѕСЃРѕР± авторизации позволяет сохранить сессию даже после перезагрузки клиента Рё сервера.

РџСЂРё доступе Рє данныР� РїРѕ FTP или РїРѕ файловыР� протоколаР� тип файла (точнее, тип содержащихся РІ РЅС�Р� данных) определяется РїРѕ расширению РёР�ени файла, что РЅРµ всегда СѓРґРѕР±РЅРѕ. HTTP перед теР�, как передать СЃР°Р�Рё данные, передаС�С‚ заголовок В«Content-Type: тип/подтип», позволяющий клиенту однозначно определить, какиР� образоР� обрабатывать присланные данные. Это особенно важно РїСЂРё работе СЃ CGI-скриптаР�Рё, РєРѕРіРґР° расширение РёР�ени файла указывает РЅРµ РЅР° тип присылаеР�ых клиенту данных, Р° РЅР° необходиР�ость запуска данного файла РЅР° сервере Рё отправки клиенту результатов работы РїСЂРѕРіСЂР°Р�Р�С‹, записанной РІ этоР� файле (РїСЂРё этоР� РѕРґРёРЅ Рё тот же файл РІ зависиР�ости РѕС‚ аргуР�ентов запроса Рё СЃРІРѕРёС… собственных соображений Р�ожет порождать ответы разных типов вЂ” РІ простейшеР� случае картинки РІ разных форР�атах).

Кро�е того, HTTP позволяет клиенту прислать на сервер пара�етры, которые будут переданы запускае�о�у CGI-скрипту. Для этого же в HTML были введены фор�ы.

Перечисленные особенности HTTP позволили создавать поисковые �ашины (первой из которых стала AltaVista, созданная фир�ой DEC), фору�ы и Internet-�агазины. Это ко��ерциализировало �нтернет, появились ко�пании, основны� поле� деятельности которых стало предоставление доступа в �нтернет (провайдеры) и создание сайтов.

Програ��ное обеспечение

Вс� програ��ное обеспечение для работы с протоколо� HTTP разделяется на три большие категории:

  • Серверы как основные поставщики услуг хранения Р С‘ обработки инфорРС�ации (обработка запросов);
  • Клиенты вЂ” конечные потребители услуг сервера (отправка запроса);
  • РџСЂРѕРєСЃРё (посредники) для выполнения транспортных служб.

Для отличия конечных серверов РѕС‚ РїСЂРѕРєСЃРё РІ официальной РґРѕРєСѓР�ентации используется терР�РёРЅ «исходный сервер» (англ. origin server). РћРґРёРЅ Рё тот же РїСЂРѕРіСЂР°Р�Р�ный РїСЂРѕРґСѓРєС‚ Р�ожет РѕРґРЅРѕРІСЂРµР�енно выполнять функции клиента, сервера или посредника РІ зависиР�ости РѕС‚ поставленных задач. Р’ спецификациях протокола HTTP РїРѕРґСЂРѕР±РЅРѕ описывается поведение для каждой РёР· этих ролей.

Клиенты

Первоначально протокол HTTP разрабатывался для доступа к гипертекстовы� доку�ента� Все�ирной паутины. Поэто�у основны�и реализация�и клиентов являются браузеры (агенты пользователя). Для прос�отра сохран�нного содержи�ого сайтов на ко�пьютере без соединения с �нтернето� были приду�аны офлайн-браузеры. При нестабильно� соединении для загрузки больших файлов используются �енеджеры закачек; они позволяют в любое вре�я докачать указанные файлы после потери соединения с веб-серверо�. Некоторые виртуальные атласы (такие как Google Планета Зе�ля и NASA World Wind) тоже используют HTTP.

Нередко протокол HTTP используется програ��а�и для скачивания обновлений.

Целый ко�плекс програ��-роботов используется в поисковых систе�ах �нтернета. Среди них веб-пауки (краулеры), которые производят проход по гиперссылка�, составляют базу данных ресурсов серверов и сохраняют их содержи�ое для дальнейшего анализа.

�сходные серверы

Основные реализации: Apache, Internet Information Services (IIS), nginx, LiteSpeed Web Server[en] (LSWS), Google Web Server, lighttpd.

Прокси-серверы

Основные реализации: Squid, UserGate, Multiproxy, Naviscope, nginx.

Структура HTTP-сообщения

Каждое HTTP-сообщение состоит из тр�х частей, которые передаются в указанно� порядке:

  1. Стартовая строка (англ. Starting line) вЂ” определяет тип сообщения;
  2. Заголовки (англ. Headers) вЂ” характеризуют тело сообщения, параР�етры передачи Рё прочие сведения;
  3. Тело сообщения (англ. Message Body) вЂ” непосредственно данные сообщения. Обязательно должно отделяться РѕС‚ заголовков пустой строкой.

Тело сообщения Р�ожет отсутствовать, РЅРѕ стартовая строка Рё заголовок являются обязательныР�Рё элеР�ентаР�Рё. Р�сключениеР� является версия 0.9 протокола, Сѓ которой сообщение запроса содержит только стартовую строку, Р° сообщения ответа вЂ” только тело сообщения.

Для версии протокола 1.1 сообщение запроса обязательно должно содержать заголовок Host.

Стартовая строка

Стартовые строки различаются для запроса и ответа. Строка запроса выглядит так:

GET URI вЂ” для версии протокола 0.9;
Метод URI HTTP/Версия вЂ” для остальных версий.

Здесь:

  • Метод (англ.В Method) вЂ” тип запроса, РѕРґРЅРѕ слово заглавныРС�Р С‘ Р±СѓРєРІР°РС�Р С‘. Р’ версии HTTP 0.9 использовался только Р С�етод GET, СЃРїРёСЃРѕРє Р С�етодов для версии 1.1 представлен ниже.
  • URI определяет путь Р С” запрашиваеРС�РѕРС�РЎС“ РґРѕРєСѓРС�енту.
  • Версия (англ.В Version) вЂ” пара разделСвЂ�нных точкой цифр. НаприРС�ер: 1.0.

Чтобы запросить страницу данной статьи, клиент должен передать строку (задан всего один заголовок):

Host: ru.wikipedia.org

Стартовая строка ответа сервера и�еет следующий фор�ат: HTTP/Версия КодСостояния Пояснение, где:

  • Версия вЂ” пара разделСвЂ�нных точкой цифр, как Р Р† запросе;
  • РљРѕРґ состояния (англ.В Status Code) вЂ” три цифры. Р СџР С• РєРѕРґСѓ состояния определяется дальнейшее содержиРС�РѕРµ сообщения Р С‘ поведение клиента;
  • Пояснение (англ.В Reason Phrase) вЂ” текстовое короткое пояснение Р С” РєРѕРґСѓ ответа для пользователя. Никак Р Р…Р Вµ влияет Р Р…Р В° сообщение Р С‘ является необязательныРС�.

Напри�ер, стартовая строка ответа сервера на предыдущий запрос �ожет выглядеть так:

HTTP/1.0 200 OK

Методы

Метод HTTP (англ. HTTP Method) вЂ” последовательность РёР· любых СЃРёР�волов, РєСЂРѕР�Рµ управляющих Рё разделителей, указывающая РЅР° РѕСЃРЅРѕРІРЅСѓСЋ операцию над ресурсоР�. Обычно Р�етод представляет СЃРѕР±РѕР№ короткое английское слово, записанное заглавныР�Рё Р±СѓРєРІР°Р�Рё. Обратите РІРЅРёР�ание, что название Р�етода чувствительно Рє регистру.

Сервер �ожет использовать любые �етоды, не существует обязательных �етодов для сервера или клиента. Если сервер не распознал указанный клиенто� �етод, то он должен вернуть статус 501 (Not Implemented). Если серверу �етод известен, но он непри�ени� к конкретно�у ресурсу, то возвращается сообщение с кодо� 405 (Method Not Allowed). В обоих случаях серверу следует включить в сообщение ответа заголовок Allow со списко� поддерживае�ых �етодов.

Кро�е �етодов GET и HEAD, часто при�еняется �етод POST.

OPTIONS

�спользуется для определения воз�ожностей веб-сервера или пара�етров соединения для конкретного ресурса. В ответ серверу следует включить заголовок Allow со списко� поддерживае�ых �етодов. Также в заголовке ответа �ожет включаться инфор�ация о поддерживае�ых расширениях.

Предполагается, что запрос клиента �ожет содержать тело сообщения для указания интересующих его сведений. Фор�ат тела и порядок работы с ни� в настоящий �о�ент не определ�н; сервер пока должен его игнорировать. Аналогичная ситуация и с тело� в ответе сервера.

Для того, чтобы узнать РІРѕР·Р�ожности всего сервера, клиент должен указать РІ URI Р·РІС�здочку вЂ” В«*В». Запросы В«OPTIONS * HTTP/1.1В» Р�РѕРіСѓС‚ также РїСЂРёР�еняться для проверки работоспособности сервера (аналогично «пингованию») Рё тестирования РЅР° предР�ет поддержки сервероР� протокола HTTP версии 1.1.

Результат выполнения этого �етода не кэшируется.

GET

�спользуется для запроса содержи�ого указанного ресурса. С по�ощью �етода GET �ожно также начать какой-либо процесс. В это� случае в тело ответного сообщения следует включить инфор�ацию о ходе выполнения процесса.

Клиент �ожет передавать пара�етры выполнения запроса в URI целевого ресурса после си�вола «?»:
GET /path/resource?param1=value1&param2=value2 HTTP/1.1

Согласно стандарту HTTP, запросы типа GET считаются иде�потентны�и[3]

Кро�е обычного �етода GET, различают ещ�

Порядок выполнения подобных запросов определ�н стандарта�и отдельно.

HEAD

Аналогичен �етоду GET, за исключение� того, что в ответе сервера отсутствует тело. Запрос HEAD обычно при�еняется для извлечения �етаданных, проверки наличия ресурса (валидация URL) и чтобы узнать, не из�енился ли он с �о�ента последнего обращения.

Заголовки ответа Р�РѕРіСѓС‚ кэшироваться. РџСЂРё несовпадении Р�етаданных ресурса СЃ соответствующей инфорР�ацией РІ кэше вЂ” РєРѕРїРёСЏ ресурса РїРѕР�ечается как устаревшая.

POST

РџСЂРёР�еняется для передачи пользовательских данных заданноР�Сѓ ресурсу. НаприР�ер, РІ блогах посетители обычно Р�РѕРіСѓС‚ вводить СЃРІРѕРё РєРѕР�Р�ентарии Рє записяР� РІ HTML-форР�Сѓ, после чего РѕРЅРё передаются серверу Р�етодоР� POST Рё РѕРЅ РїРѕР�ещает РёС… РЅР° страницу. РџСЂРё этоР� передаваеР�ые данные (РІ РїСЂРёР�ере СЃ блогаР�Рё вЂ” текст РєРѕР�Р�ентария) включаются РІ тело запроса. Аналогично СЃ РїРѕР�ощью Р�етода POST обычно загружаются файлы РЅР° сервер.

В отличие от �етода GET, �етод POST не считается иде�потентны�[3], то есть �ногократное повторение одних и тех же запросов POST �ожет возвращать разные результаты (напри�ер, после каждой отправки ко��ентария будет появляться очередная копия этого ко��ентария).

При результате выполнения 200 (Ok) в тело ответа следует включить сообщение об итоге выполнения запроса. Если был создан ресурс, то серверу следует вернуть ответ 201 (Created) с указание� URI нового ресурса в заголовке Location.

Сообщение ответа сервера на выполнение �етода POST не кэшируется.

PUT

При�еняется для загрузки содержи�ого запроса на указанный в запросе URI. Если по заданно�у URI не существует ресурса, то сервер созда�т его и возвращает статус 201 (Created). Если же ресурс был из�ен�н, то сервер возвращает 200 (Ok) или 204 (No Content). Сервер не должен игнорировать некорректные заголовки Content-*, передавае�ые клиенто� в�есте с сообщение�. Если какой-то из этих заголовков не �ожет быть распознан или недопусти� при текущих условиях, то необходи�о вернуть код ошибки 501 (Not Implemented).

Фунда�ентальное различие �етодов POST и PUT заключается в пони�ании предназначений URI ресурсов. Метод POST предполагает, что по указанно�у URI будет производиться обработка передавае�ого клиенто� содержи�ого. �спользуя PUT, клиент предполагает, что загружае�ое содержи�ое соответствует находяще�уся по данно�у URI ресурсу.

Сообщения ответов сервера на �етод PUT не кэшируются.

PATCH

Аналогично PUT, но при�еняется только к фраг�енту ресурса.

DELETE

Удаляет указанный ресурс.

TRACE

Возвращает полученный запрос так, что клиент �ожет увидеть, какую инфор�ацию про�ежуточные серверы добавляют или из�еняют в запросе.

CONNECT

Преобразует соединение запроса в прозрачный TCP/IP-туннель, обычно чтобы содействовать установлению защищ�нного SSL-соединения через нешифрованный прокси.

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

Код состояния является частью первой строки ответа сервера. Он представляет собой целое число из тр�х цифр[4]. Первая цифра указывает на класс состояния. За кодо� ответа обычно следует отдел�нная пробело� поясняющая фраза на английско� языке, которая разъясняет человеку причину и�енно такого ответа. При�еры:

201 Webpage Created
403 Access allowed only for registered users
507 Insufficient Storage

Клиент узна�т по коду ответа о результатах его запроса и определяет, какие действия е�у предприни�ать дальше. Набор кодов состояния является стандарто�, и они описаны в соответствующих доку�ентах RFC. Введение новых кодов должно производиться только после согласования с IETF. Клиент �ожет не знать все коды состояния, но он обязан отреагировать в соответствии с классо� кода.

В настоящее вре�я выделено пять классов кодов состояния

Код Класс Назначение
1xx �нфор�ационный

(англ. informational)

�нфор�ирование о процессе передачи.

Р’ HTTP/1.0 вЂ” сообщения СЃ такиР�Рё РєРѕРґР°Р�Рё должны игнорироваться.

Р’ HTTP/1.1 вЂ” клиент должен быть готов принять этот класс сообщений как обычный ответ, РЅРѕ ничего отправлять серверу РЅРµ нужно.

Са�и сообщения от сервера содержат только стартовую строку ответа и, если требуется, несколько специфичных для ответа полей заголовка. Прокси-серверы подобные сообщения должны отправлять дальше от сервера к клиенту.

2xx Успех

(англ. Success)

�нфор�ирование о случаях успешного принятия и обработки запроса клиента. В зависи�ости от статуса, сервер �ожет ещ� передать заголовки и тело сообщения.
3xx Перенаправление

(англ. Redirection)

Сообщает клиенту, что для успешного выполнения операции необходи�о сделать другой запрос (как правило по друго�у URI). �з данного класса пять кодов 301, 302, 303, 305 и 307 относятся непосредственно к перенаправления� (редирект). Адрес, по которо�у клиенту следует произвести запрос, сервер указывает в заголовке Location. При это� допускается использование фраг�ентов в целево� URI.
4xx Клиентская ошибка

(англ. Client Error)

Указание ошибок со стороны клиента. При использовании всех �етодов, кро�е HEAD, сервер должен вернуть в теле сообщения гипертекстовое пояснение для пользователя.
5xx Ошибка сервера

(англ. Server Error)

�нфор�ирование о случаях неудачного выполнения операции по вине сервера. Для всех ситуаций, кро�е использования �етода HEAD, сервер должен включать в тело сообщения объяснение, которое клиент отобразит пользователю.

Заголовки

Заголовки HTTP (англ. HTTP Headers) вЂ” это строки РІ HTTP-сообщении, содержащие разделС�РЅРЅСѓСЋ двоеточиеР� пару параР�етр-значение. ФорР�ат заголовков соответствует общеР�Сѓ форР�ату заголовков текстовых сетевых сообщений ARPA (СЃР�. RFC 822). Заголовки должны отделяться РѕС‚ тела сообщения хотя Р±С‹ РѕРґРЅРѕР№ пустой строкой.

При�еры заголовков:

Server: Apache/2.2.11 (Win32) PHP/5.3.0
Last-Modified: Sat, 16 Jan 2010 21:16:42 GMT
Content-Type: text/plain; charset=windows-1251
Content-Language: ru

Р’ РїСЂРёР�ере выше каждая строка представляет СЃРѕР±РѕР№ РѕРґРёРЅ заголовок. РџСЂРё этоР� то, что находится РґРѕ двоеточия, называется РёР�енеР� (англ. name), Р° что после него вЂ” значениеР� (англ. value).

Все заголовки разделяются на четыре основных группы:

  1. General Headers («Основные заголовки») вЂ” Р�РѕРіСѓС‚ включаться РІ любое сообщение клиента Рё сервера;
  2. Request Headers («Заголовки запроса») вЂ” используются только РІ запросах клиента;
  3. Response Headers («Заголовки ответа») вЂ” только для ответов РѕС‚ сервера;
  4. Entity Headers («Заголовки сущности») вЂ” сопровождают каждую сущность сообщения.

��енно в тако� порядке реко�ендуется посылать заголовки получателю.

Все необходи�ые для функционирования HTTP заголовки описаны в основных RFC. Если не хватает существующих, то �ожно вводить свои. Традиционно к и�ена� таких дополнительных заголовков добавляют префикс «X-» для избежания конфликта и��н с воз�ожно существующи�и. Напри�ер, как в заголовках X-Powered-By или X-Cache. Некоторые разработчики используют свои индивидуальные префиксы. При�ера�и таких заголовков �огут служить Ms-Echo-Request и Ms-Echo-Reply, введ�нные корпорацией Microsoft для расширения WebDAV.

Тело сообщения

Тело HTTP-сообщения (message-body), если оно присутствует, используется для передачи тела объекта, связанного с запросо� или ответо�. Тело сообщения отличается от тела объекта (entity-body) только в то� случае, когда при�еняется кодирование передачи, что указывается поле� заголовка Transfer-Encoding.

message-body = entity-body
| <entity-body закодировано согласно
Transfer-Encoding>

Поле Transfer-Encoding должно использоваться для указания любого кодирования передачи, РїСЂРёР�енС�РЅРЅРѕРіРѕ приложениеР� РІ целях гарантирования безопасной Рё правильной передачи сообщения. Поле Transfer-Encoding вЂ” это свойство сообщения, Р° РЅРµ объекта, Рё, такиР� образоР�, Р�ожет быть добавлено или удалено любыР� приложениеР� РІ цепочке запросов/ответов.

Правила, устанавливающие допусти�ость тела сообщения в сообщении, отличны для запросов и ответов.

Присутствие тела сообщения РІ запросе РѕС‚Р�ечается добавлениеР� Рє заголовкаР� запроса поля заголовка Content-Length или Transfer-Encoding. Тело сообщения Р�ожет Р±С‹С‚СЊ добавлено РІ запрос, только РєРѕРіРґР° Р�етод запроса допускает тело объекта.

Включается или РЅРµ включается тело сообщения РІ сообщение ответа вЂ” зависит как РѕС‚ Р�етода запроса, так Рё РѕС‚ РєРѕРґР° состояния ответа. Р’СЃРµ ответы РЅР° запрос СЃ Р�етодоР� HEAD РЅРµ должны включать тело сообщения, даже если присутствуют поля заголовка объекта (entity-header), заставляющие поверить РІ присутствие объекта. Никакие ответы СЃ РєРѕРґР°Р�Рё состояния 1xx (Р�нфорР�ационные), 204 (Нет содержиР�РѕРіРѕ, No Content), Рё 304 (РќРµ Р�одифицирован, Not Modified) РЅРµ должны содержать тела сообщения. Р’СЃРµ РґСЂСѓРіРёРµ ответы содержат тело сообщения, даже если РѕРЅРѕ РёР�еет нулевую длину.

При�еры диалогов HTTP

С�. также частичные GET, байтовые диапазоны, ответ 206, ответ 416.

Основные �еханиз�ы протокола

Частичные GET

HTTP позволяет запросить не сразу вс� содержи�ое ресурса, а только указанный фраг�ент. Такие запросы называются частичные GET; воз�ожность их выполнения необязательна (но желательна) для серверов. Частичные GET в основно� используются для докачки файлов и быстрого параллельного скачивания в нескольких потоках. Некоторые програ��ы скачивают заголовок архива, выводят пользователю внутреннюю структуру, а пото� уже запрашивают фраг�енты с указанны�и эле�ента�и архива.

Для получения фраг�ента клиент посылает серверу запрос с заголовко� Range, указывая в н�� необходи�ые байтовые диапазоны. Если сервер не пони�ает частичные запросы (игнорирует заголовок Range), то он верн�т вс� содержи�ое со статусо� 200, как и при обычно� GET. В случае успешного выполнения сервер возвращает в�есто кода 200 ответ со статусо� 206 (Partial Content), включая в ответ заголовок Content-Range. Са�и фраг�енты �огут быть переданы дву�я способа�и:

  • Р’ ответе РїРѕРС�ещается заголовок Content-Range РЎРѓ указаниеРС� байтовых диапазонов. Р’ соответствии РЎРѓ РЅРёРС�Р С‘ фрагРС�енты последовательно РїРѕРС�ещаются Р Р† РѕСЃРЅРѕРІРЅРѕРµ тело. РџСЂРё этоРС� Content-Length должен соответствовать СЃСѓРС�Р С�арноРС�РЎС“ РѕР±СЉСвЂ�Р С�РЎС“ всего тела;
  • Сервер указывает Р С�едиатип multipart/byteranges для РѕСЃРЅРѕРІРЅРѕРіРѕ содержиРС�РѕРіРѕ Р С‘ передаСвЂ�С‚ фрагРС�енты, указывая соответствующий Content-Range для каждого элеРС�ента (РЎРѓР С�. также «Множественное содержиРС�ое»[в‡Ё]).

Условные GET

Метод GET из�еняется на «условный GET», если сообщение запроса включает в себя поле заголовка If-Modified-Since. В ответ на «условный GET» тело запрашивае�ого ресурса переда�тся, только если он из�енялся после даты, указанной в заголовке If-Modified-Since. Алгорит� определения этого включает в себя следующие случаи:

  • Если статус ответа Р Р…Р В° запрос будет отличаться РѕС‚ Р’В«200 OKР’В» или дата, указанная Р Р† поле заголовка Р’В«If-Modified-SinceР’В», некорректна, ответ будет идентичен ответу Р Р…Р В° обычный запрос GET.
  • Если после указанной даты ресурс РёР·РС�енялся, ответ будет также идентичен ответу Р Р…Р В° обычный запрос GET.
  • Если ресурс Р Р…Р Вµ РёР·РС�енялся после указанной даты, сервер вернет статус Р’В«304 Not ModifiedР’В».

�спользование �етода «условный GET» направлено на разгрузку сети, так как он позволяет не передавать по сети избыточную инфор�ацию.

Согласование содержи�ого

Согласование содержиР�РѕРіРѕ (англ. Content Negotiation) вЂ” Р�еханизР� автоР�атического определения необходиР�РѕРіРѕ ресурса РїСЂРё наличии нескольких разнотипных версий РґРѕРєСѓР�ента. СубъектаР�Рё согласования Р�РѕРіСѓС‚ быть РЅРµ только ресурсы сервера, РЅРѕ Рё возвращаеР�ые страницы СЃ сообщенияР�Рё РѕР± ошибках (403, 404 Рё С‚. Рї.).

Различают два основных типа согласований:

  • УправляеРС�РѕРµ сервероРС� (англ.В server-driven).
  • УправляеРС�РѕРµ клиентоРС� (англ.В agent-driven).

Одновре�енно �огут быть использованы оба типа или каждый из них по отдельности.

Р’ РѕСЃРЅРѕРІРЅРѕР№ спецификации РїРѕ протоколу (RFC 2616) также выделяется так называеР�РѕРµ прозрачное согласование (англ. transparent negotiation) как предпочтительный вариант РєРѕР�бинирования РѕР±РѕРёС… типов. Последний Р�еханизР� РЅРµ следует путать СЃ независиР�РѕР№ технологией Transparent Content Negotiation (TCN, «Прозрачное согласование содержиР�РѕРіРѕВ», СЃР�. RFC 2295), которая РЅРµ является частью протокола HTTP, РЅРѕ Р�ожет использоваться СЃ РЅРёР�. РЈ РѕР±РѕРёС… существенное различие РІ принципе работы Рё СЃР°Р�РѕР� значении слова «прозрачное» (transparent). Р’ спецификации РїРѕ HTTP РїРѕРґ прозрачностью подразуР�евается, что процесс РЅРµ Р·Р°Р�етен для клиента Рё сервера, Р° РІ технологии TCN прозрачность означает доступность полного СЃРїРёСЃРєР° вариантов ресурса для всех участников процесса доставки данных.

Управляе�ое серверо�

При наличии нескольких версий ресурса сервер �ожет анализировать заголовки запроса клиента, чтобы выдать, по его �нению, наиболее подходящую. В основно� анализируются заголовки Accept, Accept-Charset, Accept-Encoding, Accept-Languages и User-Agent. Серверу желательно включать в ответ заголовок Vary с указание� пара�етров, по которы� различается содержи�ое по запрашивае�о�у URI.

Географическое положение клиента �ожно определить по удал�нно�у IP-адресу. Это воз�ожно за сч�т того что IP-адреса, как и до�енные и�ена, регистрируются на конкретного человека или организацию. При регистрации указывается регион, в которо� будет использоваться желае�ое адресное пространство. Эти данные общедоступны, и в �нтернете �ожно найти соответствующие свободно распространяе�ые базы данных и готовые програ��ные �одули для работы с ни�и (следует ориентироваться на ключевые слова «Geo IP»).

Следует по�нить что такой �етод способен определить �естоположение �акси�у� с точностью до города (отсюда определяется и страна). При это� инфор�ация актуальна только на �о�ент регистрации адресного пространства. Напри�ер, если �осковский провайдер зарегистрирует диапазон адресов с указание� Москвы и начн�т предоставлять доступ клиента� из ближайшего Под�осковья, то его абоненты �огут на некоторых сайтах наблюдать, что они из Москвы, а не из Красногорска или Дзержинского.

Управляе�ое серверо� согласование и�еет несколько недостатков:

  • Сервер только предполагает, какой вариант наиболее предпочтителен для конечного пользователя, Р Р…Р С• Р Р…Р Вµ Р С�ожет знать точно, что РёРС�енно нужно Р Р† данный Р С�РѕРС�ент (наприРС�ер, версия Р Р…Р В° СЂСѓСЃСЃРєРѕРС� языке или английскоРС�).
  • Заголовков РіСЂСѓРїРїС‹ Accept передаСвЂ�тся Р С�РЅРѕРіРѕ, Р В° ресурсов РЎРѓ несколькиРС�Р С‘ вариантаРС�Рё вЂ” Р С�ало. Р пїЅР В·-Р В·Р В° этого оборудование испытывает избыточную нагрузку.
  • ОбщеРС�РЎС“ кэшу СЃРѕР·РґР°СвЂ�тся ограничение РІРѕР·РС�ожности выдавать РѕРґРёРЅ Р С‘ тот же ответ Р Р…Р В° идентичные запросы РѕС‚ разных пользователей.
  • Передача заголовков Accept также Р С�ожет раскрывать некоторые сведения Р С• его предпочтениях, таких как используеРС�ые языки, браузер, РєРѕРґРёСЂРѕРІРєР°.

Управляе�ое клиенто�

В данно� случае тип содержи�ого определяется только на стороне клиента. Для этого сервер возвращает в ответе с кодо� состояния 300 (Multiple Choices) или 406 (Not Acceptable) список вариантов, среди которых пользователь выбирает подходящий. Управляе�ое клиенто� согласование хорошо, когда содержи�ое различается по са�ы� часты� пара�етра� (напри�ер, по языку и кодировке) и используется публичный кэш.

РћСЃРЅРѕРІРЅРѕР№ недостаток вЂ” лишняя нагрузка, так как приходится делать дополнительный запрос, чтобы получить нужное содержиР�РѕРµ.

Прозрачное согласование

Данное согласование полностью прозрачно для клиента и сервера. В данно� случае используется общий кэш, в которо� содержится список вариантов, как для управляе�ого клиенто� согласования. Если кэш пони�ает все эти варианты, то он са� делает выбор, как при управляе�о� серверо� согласовании. Это снижает нагрузки с исходного сервера и исключает дополнительный запрос со стороны клиента.

В основной спецификации по протоколу HTTP �еханиз� прозрачного согласования подробно не описан.

Множественное содержи�ое

Протокол HTTP поддерживает передачу нескольких сущностей в пределах одного сообщения. Прич�� сущности �огут передаваться не только в виде одноуровневой последовательности, но и в виде иерархии с вложение� эле�ентов друг в друга. Для обозначения �ножественного содержи�ого используются �едиатипы multipart/*. Работа с таки�и типа�и осуществляется по общи� правила�, описанны� в RFC 2046 (если иное не определено конкретны� �едиатипо�). Если получателю не известно как работать с типо�, то он обрабатывает его так же, как multipart/mixed.

Пара�етр boundary означает разделитель �ежду различны�и типа�и передавае�ых сообщений. Напри�ер, передавае�ый из фор�ы пара�етр DestAddress переда�т значение адреса e-mail, а следующий за ни� эле�ент AttachedFile1 отправляет двоичное содержи�ое изображения фор�ата .jpg

Со стороны сервера сообщения со �ножественны� содержи�ы� �огут посылаться в ответ на частичные GET при запросе нескольких фраг�ентов ресурса. В это� случае используется �едиатип multipart/byteranges.

Со стороны клиента при отправке HTML-фор�ы чаще всего пользуются �етодо� POST. Типичный при�ер: страницы отправки электронных писе� со вложенны�и файла�и. При отправке такого пись�а браузер фор�ирует сообщение типа multipart/form-data, интегрируя в него как отдельные части, введ�нные пользователе�, те�у пись�а, адрес получателя, са� текст и вложенные файлы:

POST /send-message.html HTTP/1.1
Host: mail.example.com
Referer: http://mail.example.com/send-message.html
User-Agent: BrowserForDummies/4.67b
Content-Type: multipart/form-data; boundary="Asrf456BGe4h"
Content-Length: (су��арный объ��, включая дочерние заголовки)
Connection: keep-alive
Keep-Alive: 300
(пустая строка)
(отсутствующая преа�була)
--Asrf456BGe4h
Content-Disposition: form-data; name="DestAddress"
(пустая строка)
brutal-vasya@example.com—Asrf456BGe4h
Content-Disposition: form-data; name="MessageTitle"
(пустая строка)
Я негодую—Asrf456BGe4h
Content-Disposition: form-data; name="MessageText"
(пустая строка)
Привет, Василий! Твой ручной лев, которого ты оставил
у �еня на прошлой неделе, разодрал весь �ой диван.
Пожалуйста, забери его скорее!
Во вложении две фотки с последствия�и.
--Asrf456BGe4h
Content-Disposition: form-data; name="AttachedFile1"; filename="horror-photo-1.jpg"
Content-Type: image/jpeg
(пустая строка)
(двоичное содержи�ое первой фотографии)
--Asrf456BGe4h
Content-Disposition: form-data; name="AttachedFile2"; filename="horror-photo-2.jpg"
Content-Type: image/jpeg
(пустая строка)
(двоичное содержи�ое второй фотографии)
--Asrf456BGe4h--
(отсутствующий эпилог)

В при�ере в заголовках Content-Disposition пара�етр name соответствует атрибуту name в HTML-тегах <INPUT> и <TEXTAREA>. Пара�етр filename равен исходно�у и�ени файла на ко�пьютере пользователя. �олее подробная инфор�ация о фор�ировании HTML-фор� и вложении файлов в RFC 1867.

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

HTTP/0.9
HTTP был предложен в �арте 1991 года Ти�о� �ернерсо�-Ли, работавши� тогда в CERN, как �еханиз� для доступа к доку�ента� в �нтернете и облегчения навигации посредство� использования гипертекста. Са�ая ранняя версия протокола HTTP/0.9 была впервые опубликована в январе 1992 года (хотя реализация датируется 1990 годо�). Спецификация протокола привела к упорядочению правил взаи�одействия �ежду клиента�и и сервера�и HTTP, а также ч�тко�у разделению функций �ежду эти�и дву�я ко�понента�и. �ыли задоку�ентированы основные синтаксические и се�антические положения.
HTTP/1.0
В �ае 1996 года для практической реализации HTTP был выпущен инфор�ационный доку�ент RFC 1945, что послужило основой для реализации большинства ко�понентов HTTP/1.0.
HTTP/1.1
Совре�енная версия протокола; принята в июне 1999 года[5]. Новы� в этой версии был режи� «постоянного соединения»: TCP-соединение �ожет оставаться открыты� после отправки ответа на запрос, что позволяет посылать несколько запросов за одно соединение. Клиент теперь обязан посылать инфор�ацию об и�ени хоста, к которо�у он обращается, что сделало воз�ожной более простую организацию виртуального хостинга.
HTTP/2
11 февраля 2015 РіРѕРґР° опубликованы финальные версии черновика следующей версии протокола. Р’ отличие РѕС‚ предыдущих версий, протокол HTTP/2 является бинарныР�. Среди ключевых особенностей: Р�ультиплексирование запросов, расстановка приоритетов для запросов, сжатие заголовков, загрузка нескольких элеР�ентов параллельно посредствоР� РѕРґРЅРѕРіРѕ TCP-соединения, поддержка проактивных push-уведоР�лений СЃРѕ стороны сервера[6].
HTTP/3
HTTP/3 вЂ” предлагаеР�ый последователь HTTP/2[7][8], который уже используется РІ Веб РЅР° РѕСЃРЅРѕРІРµ UDP РІР�есто TCP РІ качестве транспортного протокола. Как Рё HTTP/2, РѕРЅ РЅРµ объявляет устаревшиР�Рё предыдущие основные версии протокола. Поддержка HTTP/3 была добавлена РІ Cloudflare Рё Google Chrome РІ сентябре 2019 РіРѕРґР°[9][10] Рё Р�ожет быть включена РІ стабильных версиях Chrome Рё Firefox[11].

С�. также

При�ечания

  1. � С�. раздел «Abstract» в са�о� начале RFC 1945 (1996 год) и RFC 9112 (2022-ой).
  2. � Объ�� HTTP-трафика впервые превысил P2P Архивная копия от 22 декабря 2007 на Wayback Machine // Ко�пьюлента, 22 июня 2007 (Официальный доку�ент от Ellacoya Networks Архивная копия от 22 июня 2007 на Wayback Machine).
  3. в†� 1 2 HTTP/1.1: Method Definitions (англ.). Архивировано РёР· оригинала 23 РёСЋРЅСЏ 2012 РіРѕРґР°.
  4. в†� РЎР�. первое предложение раздела В«6.1.1 Status Code and Reason PhraseВ» РІ RFC 2068. РќР° стр. 40 есть также объявление РІ форР�ате расширенной Р�РќР¤-форР�С‹ (Augmented BNF  (англ.)) В«extension-code = 3DIGITВ» для РєРѕРґРѕРІ расширений.
  5. � Впервые спецификация HTTP/1.1 была опубликована в январе 1997 RFC 2068; в совре�енной версии RFC 2616 исправлены опечатки, �еста�и улучшены тер�инология и офор�ление. Также разъяснено допусти�ое поведение клиента (браузера), сервера и прокси-серверов в некоторых со�нительных ситуациях. То есть версия 1.1 появилась вс�-таки в 1997 году.
  6. � HTTP/2 Draft. Дата обращения: 25 февраля 2015. Архивировано 20 февраля 2015 года.
  7. в†� Bishop, Mike Hypertext Transfer Protocol Version 3 (HTTP/3) (англ.). tools.ietf.org (9 июля 2019). Дата обращения: 16 августа 2019. Архивировано 31 августа 2019 РіРѕРґР°.
  8. в†� Cimpanu, Catalin. "HTTP-over-QUIC to be renamed HTTP/3 | ZDNet". ZDNet (англ.). Архивировано РёР· оригинала 13 РЅРѕСЏР±СЂСЏ 2018. Дата обращения: 19 РЅРѕСЏР±СЂСЏ 2018. {cite news}: Указан более чеР� РѕРґРёРЅ параР�етр |accessdate= and |access-date= (справка)
  9. � Cimpanu, Catalin Cloudflare, Google Chrome, and Firefox add HTTP/3 support. ZDNet (26 сентября 2019). Дата обращения: 27 сентября 2019. Архивировано 26 сентября 2019 года.
  10. в†� HTTP/3: the past, the present, and the future (англ.). The Cloudflare Blog (26 сентября 2019). Дата обращения: 30 октября 2019. Архивировано 26 сентября 2019 РіРѕРґР°.
  11. � Firefox Nightly supports HTTP 3 - General - Cloudflare Community (19 ноября 2019). Дата обращения: 23 января 2020. Архивировано 6 июня 2020 года.

Ссылки