Лаборатория поисковой оптимизации

Протокол передачи гипертекста


Семенов Ю.А. (ГНЦ ИТЭФ), book.itep.ru


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

Протокол HTTP использован при построении глобальной информационной системы World-Wide Web (начиная с 1990).

Первые версии, такие как HTTP/0.9, представляли собой простые протоколы для передачи данных через Интернет. Версия HTTP/1.0, описанная в RFC-1945 [6], улучшила протокол, разрешив использование сообщений в формате MIME, содержащих метаинформацию о передаваемых данных, и модификаторы для запросов/откликов. Дальнейшее развитие сетей WWW-серверов потребовало новых усовершенствований, которые вряд ли являются последними.

Реальные информационные системы требуют больших возможностей, чем простой поиск и доставка данных. Для описания характера, наименования и места расположения информационных ресурсов введены: универсальный идентификатор ресурса URI (Uniform Resource Identifier), универсальный указатель ресурса URL и универсальное имя ресурса URN. Формат сообщений сходен с используемыми в электронной почте и описанный в стандарте MIME (Multipurpose Internet Mail Extensions).

HTTP используется также в качестве базового протокола для коммуникации пользовательских агентов с прокси-серверами и другими системами Интернет, в том числе и использующие протоколы SMTP, NNTP, FTP, Gopher и Wais. Последнее обстоятельство способствует интегрированию различных служб Интернет. Ниже описаны базовые понятия и термины протокола HTTP.

Прокси

Промежуточная программа, которая выполняет функции, как сервера, так и клиента. Такая программа предназначена для обслуживания запросов так, как если бы это делал первичный сервер. Запросы обслуживаются внутри или переадресуются другим серверам.

Туннель

Промежуточная программа, которая работает как ретранслятор между двумя объектами. Туннель закрывается, когда обе стороны, соединенные им прерывают сессию. Туннель может быть активирован с помощью HTTP-запроса.

Время пригодности объекта (expiration time)

Время, при котором исходный сервер требует, чтобы объект не посылался более кэшем без перепроверки пригодности.

Эвристическое значение времени жизни (heuristic expiration time)

Время пригодности, присваиваемое объекту в кэше, если это время не задано явно.

Возраст

Возраст отклика - время с момента его посылки или проверки его пригодности исходным сервером.

Время жизни (freshness lifetime)

Продолжительность времени с момента генерации отклика до истечения его пригодности.

Свежий

Отклик считается свежим, если его возраст не превысил времени его пригодности.

Устаревший

Отклик считается устаревшим, когда его возраст превысил время жизни.

Семантическая прозрачность

Кэш по отношению к конкретному отклику функционирует в 'семантически прозрачном' режиме, когда его использование не имеет последствий ни для исходного сервера, ни для запрашивающего клиента. Когда кэш семантически прозрачен, клиент получает в точности тот же отклик (за исключением транспортных заголовков), какой он бы получил при непосредственном обращении к исходному серверу.

Валидатор

Протокольный элемент (например, метка объекта или время last-modified), который используется для выяснения того, является ли запись в кэше эквивалентной копией объекта.

Метод

Процедура, выполняемая над ресурсом (get, put, head, post, delete, trace и т.д.).

 Взаимодействие клиента, кэша и исходного сервера в протоколе HTTP

Взаимодействие клиента, кэша и исходного сервера в протоколе HTTP

Кэш может находиться в ЭВМ клиента или агента пользователя, но может размещаться на соседнем континенте. Число прокси между клиентом и исходным сервером может варьироваться и ограничивается сверху только здравым смыслом.

Структура ресурса и объекта

Структура ресурса и объекта

Протокол HTTP представляет собой протокол запросов-откликов. Клиент посылает запрос серверу в форме, определяющей метод, URI и версию протокола. В конце запроса следует MIME-подобное сообщение, содержащее модификаторы, информацию о клиенте и, возможно, другие данные. Сервер откликается, посылая статусную строку, которая включает в себя версию протокола, код результата (успех/неудача) и MIME-подобное сообщение, в котором содержатся данные о сервере и метаинформация.

Большинство HTTP-обменов инициируются пользователем и состоят из запросов ресурсов, имеющихся на определенном сервере. В простейшем случае такой запрос может быть реализован путем соединения пользовательского агента (UA) и базового сервера.

Более сложная ситуация возникает, когда присутствует один или более посредников в цепочке обслуживания запроса/отклика. Существует три стандартные формы посредников: прокси, туннель и внешний порт (gateway). Прокси представляет собой агент переадресации, получающий запрос для URI, переписывающий все сообщение или его часть и отправляющий переделанный запрос серверу, указанному URI. Внешний порт (gateway) представляет собой приемник, который работает на уровень выше некоторых других серверов и транслирует, если необходимо, запрос нижележащему протоколу сервера. Туннель действует как соединитель точка-точка и не производит каких-либо видоизменений сообщений. Туннель используется тогда, когда нужно пройти через какую-то систему (например, Firewall) в условиях, когда эта система не понимает (не анализирует) содержимое сообщений.

Запрос -------------------------------------->
UA -----v----- A -----v----- B -----v----- C -----v----- O
<------------------------------------- отклик

Рис. 4.5.6.1.3 UA - агент пользователя

На рисунке показаны три промежуточные ступени (A, B, и C) между агентом пользователя (UA) и базовым сервером (O). Запрос или отклик, двигаясь по этой цепочке, должен пройти четыре различных соединительных сегмента. Это обстоятельство крайне важно, так как некоторые опции HTTP применимы только для ближайших соединений. Хотя схема линейна, на практике узлы могут участвовать в большом числе других взаимодействий. Например, B может получать запросы от большого числа клиентов помимо A, и переадресовывать запросы к другим серверам кроме C.

Любой участник обмена, который не используется в качестве туннеля, может воспользоваться кэшем для запоминания запросов. Буфер может сократить длину цепочки в том случае, если у одного из участников процесса имеется в буфере отклик для конкретного запроса, что может, кроме прочего, заметно снизить требования к пропускной способности канала. Не все запросы могут записываться в кэш, некоторые из них могут содержать модификаторы работы с кэшем.

В действительности имеется широкое разнообразие архитектур и конфигураций буферных запоминающих устройств и прокси, разрабатываемых в настоящее время или уже доступных через World Wide Web. Эти системы включают иерархии прокси-серверов национального масштаба, задачей которых является сокращение трансокеанского трафика, системы, которые обслуживают широковещательные и мультикастинговые обмены, организации, распространяющие фрагменты информации с CD-ROM, занесенной в кэши и т. д.. HTTP-системы, используются в корпоративных сетях Интранет с большими пропускными способностями и перемежающимися соединениями. Целью HTTP/1.1 является поддержка широкого разнообразия уже существующих систем и расширение возможностей будущих приложений в отношении надежности и адаптируемости.

Коммуникации HTTP обычно реализуются через соединения TCP/IP. Порт по умолчанию имеет номер 80, но и другие номера портов вполне допустимы. Это не исключает использования HTTP поверх любого другого протокола в Интернет, или других сетей. HTTP предполагает надежное соединение; применим любой протокол, который может гарантировать корректную доставку сообщений.

В HTTP/1.0, большинство приложений используют новое соединение для каждого обмена запрос/отклик. В HTTP/1.1, соединение может быть использовано для одного или более обменов запрос/отклик, хотя соединение может быть разорвано по самым разным причинам.


1Соглашения по нотации и общая грамматика
1.1Расширенные BNF
1.2Основные правила
2Параметры протокола
2.1Версия HTTP
2.2Универсальные идентификаторы ресурсов (URI)
2.2.1Общий синтаксис
2.2.2HTTP URL
2.2.3Сравнение URI
2.3Форматы даты/времени
2.3.1Полная дата
2.3.2Интервалы времени в секундах
2.4Наборы символов
2.5Кодировки содержимого
2.6Транспортное кодирование
2.7Типы среды
2.7.1Канонизация и текст по умолчанию
2.7.2Составные типы
2.8Лексемы (token) продукта
2.9Значения качества (Quality values)
2.10Языковые метки
2.11Метки объектов
2.12Структурные единицы
3http сообщение
3.1Типы сообщений
3.2Заголовки сообщений
3.3Тело сообщения
3.4Длина сообщения
3.5Общие поля заголовка
4Запрос
4.1Строка запроса
4.1.1Метод
4.1.2URI запроса
4.2Ресурс, идентифицируемый запросом
4.3Поля заголовка запроса
5Отклик
5.1Статусная строка
5.1.1Статусный код и словесный комментарий
5.2Поля заголовка отклика
6Объект (Entity)
6.1Поля заголовка объекта
6.2Тело объекта
6.2.1Тип
6.2.2Длина
7Соединения
7.1Постоянные соединения
7.1.1Цель
7.1.2Общие процедуры
7.1.2.1Согласование
7.1.2.2Буферизация
7.1.3Прокси-серверы
7.1.4Практические соображения
7.2Требования к передаче сообщений
8Метод определений
8.1Безопасные и idempotent методы
8.1.1Безопасные методы
8.1.2Подобные методы
8.2Опции
8.3Метод GET
8.4Метод HEAD
8.5Метод POST
8.6Метод PUT
8.7Метод DELETE
8.8Метод TRACE
9Определения статусных кодов
9.11xx Info
9.1.1100 Continue
9.1.2101 Switching Protocols
9.22xx Successful
9.2.1200 OK
9.2.2201 Created
9.2.3202 Accepted
9.2.4203 Non-Authoritative Information
9.2.5204 No Content
9.2.6205 Reset Content
9.2.7206 Partial Content
9.33xx Redirection
9.3.1300 Multiple Choices
9.3.2301 Moved Permanently
9.3.3302 Moved Temporarily
9.3.4303 See Other
9.3.5304 Not Modified
9.3.6305 Use Proxy
9.44xx Client Error
9.4.1400 Bad Request
9.4.2401 Unauthorized
9.4.3402 Payment Required
9.4.4403 Forbidden
9.4.5404 Not Found
9.4.6405 Method Not Allowed
9.4.7406 Not Acceptable
9.4.8407 Proxy Authentication Required
9.4.9408 Request Timeout
9.4.10409 Conflict
9.4.11410 Gone
9.4.12411 Length Required
9.4.13412 Precondition Failed
9.4.14413 Request Entity Too Large
9.4.15414 Request-URI Too Long
9.4.16415 Unsupported Media Type
9.55xx Server Error
9.5.1500 Internal Server Error
9.5.2501 Not Implemented
9.5.3502 Bad Gateway
9.5.4503 Service Unavailable
9.5.5504 Gateway Timeout
9.5.6505 HTTP Version Not Supported
10Идентификация доступа
10.1Базовая схема идентификации (Authentication)
10.2Краткое изложение схемы авторизации
11Согласование содержимого
11.1Согласование, управляемое сервером
11.2Согласование, управляемое агентом (Agent-driven Negotiation)
11.3Прозрачное согласование (Transparent Negotiation)
12Кэширование в HTTP
12.1Корректность кэша
12.2Предупреждения
12.3Механизмы управления кэшем
12.4Прямые предупреждения агента пользователя
12.5Исключения для правил и предупреждений
12.6Работа под управлением клиента
12.7Модель истечения срока
12.7.1Определение срока годности под управлением сервера
12.7.2Эвристический контроль пригодности
12.7.3Вычисление возраста
12.7.4Вычисление времени жизни (Expiration)
12.7.5Устранение неопределенности значений времени жизни
12.7.6Неопределенность из-за множественных откликов
12.8Модель проверки пригодности
12.8.1Даты последней модификации
12.8.2Валидаторы кэша для меток объектов (Entity Tag Cache Validators)
12.8.3Слабые и сильные валидаторы
12.8.4Правила того, когда использовать метки объекта и даты последней
12.8.5Условия пригодности
12.9Кэшируемость отклика
12.10Формирование откликов кэшей
12.10.1Заголовки End-to-end (точка-точка) и Hop-by-hop (шаг-за-шагом)
12.10.2Немодифицируемые заголовки
12.10.3Комбинирование заголовков
12.10.4Комбинирование байтовых фрагментов
12.11Кэширование согласованных откликов
12.12Кэши коллективного и индивидуального использования
12.13Ошибки и поведение кэша при неполном отклике
12.14Побочные эффекты методов GET и HEAD
12.15Несоответствие после актуализации или стирания
12.16Обязательная пропись (Write-Through Mandatory)
12.17Замещения в кэше
12.18Списки предыстории
13Определения полей заголовка
13Определения полей заголовка
13.1Поле Accept
13.2Поле Accept-Charset
13.3Поле Accept-Encoding
13.4Поле Accept-Language
13.5Поле Accept-Ranges
13.6Поле Age
13.7Поле Allow
13.8Авторизация
13.9Поле Cache-Control
13.9.1Что допускает кэширование?
13.9.2Что может быть записано в память кэша?
13.9.3Модификации базового механизма контроля времени жизни
13.9.4Управление перепроверкой пригодности и перезагрузкой
13.9.5Директива No-Transform
13.9.6Расширения управления кэшем
13.10Соединение
13.11Content-Base
13.12Кодирование содержимого
13.13Язык содержимого
13.14Длина содержимого
13.15Поле Content-Location
13.16Content-MD5
13.17Фрагмент содержимого
13.18Тип содержимого
13.19Дата
13.20Поле ETag
13.21Поле Expires
13.22Поле From
13.23Поле Host
13.24Поле If-Modified-Sinc
13.25Поле If-Match
13.26Поле If-None-Match
13.27Заголовок If-Range
13.28Поле If-Unmodified-Since
13.29Поле Last-Modified
13.30Поле Location
13.31Поле Max-Forwards
13.32Поле Pragma
13.33Поле Proxy-Authenticate
13.34Поле Proxy-Authorization
13.35Поле Public
13.36Фрагмент
13.36.1Фрагменты байт
13.36.2Запросы получения фрагментов
13.37Поле Referer
13.38Поле Retry-After
13.39Поле Server
13.40Поле Transfer-Encoding (Транспортное кодирование)
13.41Заголовок Upgrade (Актуализация)
13.42Поле User-Agent (Агент пользователя)
13.43Поле Vary
13.44Поле Via
13.45Поле Warning (Предупреждение)
13.46Поле WWW-Authenticate
14Соображения безопасности
14.1Аутентификация клиентов
14.2Предложение выбора схемы идентификации
14.3Злоупотребление служебными (Log) записями сервера
14.4Передача конфиденциальной информации
14.5Атаки, основанные на именах файлов и проходов
14.6Персональная информация
14.7Аспекты конфиденциальности, связанные с заголовками Accept
14.8Фальсификация DNS
14.9Заголовки Location и мистификация
15Библиография
16Приложения
16.1Интерентовский тип среды "message/http"
16.2Тип среды Интернет "multipart/byteranges"
16.3Толерантные приложения
16.4Различие между объектами HTTP и MIME
16.4.1Преобразование к канонической форме
16.4.2Преобразование форматов даты
16.4.3Введение кодирования содержимого
16.4.4No Content-Transfer-Encoding
16.4.5Поля заголовка в многофрагментных телах
16.4.6Введение транспортного кодирования
16.4.7MIME-Version
16.5Изменения по отношению HTTP/1.0
16.5.1Изменения с целью упрощения распределенных WWW-сервером и экономии IP адресов
16.6Дополнительные функции
16.6.1Дополнительные методы запросов
16.6.1.1Метод PATCH
16.6.1.2Метод LINK
16.6.1.3Метод UNLINK
16.6.2Определения дополнительных полей заголовка
16.6.2.1Поле Alternates
16.6.2.2Поле Content-Version
16.6.2.3Поле Derived-From
16.6.2.4Поле Link
16.6.2.5Поле URI
16.7Совместимость с предыдущими версиями
16.7.1Совместимость с постоянными соединениями HTTP/1.0
16.7.1.1Заголовок Keep-Alive