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[англ.] (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.

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

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

Метод 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, различают ещ�

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

Аналогичен �етоду 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. Дата обращения: 10 августа 2020.
  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 года.

Ссылки