Протокол HTTP 1.1

entity-body := Content-Encoding( Content-Type( data ) )

Тип содержимого (Content-Type) определяет медиатип лежащих в основе данных. Кодирование содержимого (Content-Encoding) может использоваться для указания любых дополнительных кодирований содержимого, примененных к данным (обычно с целью сжатия). Кодирование содержимого (Content-Encoding) является свойством запрошенного ресурса. По умолчанию никакого кодирования не задано.

В любое HTTP/1.1 сообщение, содержащее тело объекта (entity-body) включает поле заголовка Content-Type, определяющее медиатип этого тела. В том и только в том случае, когда медиатип не указан в поле Content-Type, получатель може попытаться самостоятельно определить медиатип, проверяя содержимое и/или расширение (расширения) в URL, используемого для идентификации ресурса. Если медиатип остался нераспознан, получателю следует обрабатывать его как тип "application/octet-stream".

7.2.2 Длина.

Длина тела объекта (entity-body) - это длина тела сообщения (message-body), полученного после декодирования всех кодирований передачи.

8 Соединения (Connections).

8.1 Постоянные соединения (Persistent Connections).

8.1.1 Цель.

До введения в протокол постоянных соединений для запроса каждого URL устанавливалось отдельное TCP соединение, что увеличивало нагрузку на HTTP сервера и вызывало перегрузку сетей. Использование встроенных изображений и других связанных данных часто требует от клиента инициировать несколько запросов к одному серверу за короткий промежуток времени.

Постоянные HTTP соединения имеют ряд преимуществ:

- Открытие и закрытие меньшего количества TCP соединений экономит время центрального процессора и память, используемую для управляющих блоков протокола TCP.

- HTTP запросы и ответы может быть конвейеризованы в соединении. Конвейерная обработка позволяет клиенту делать несколько запросов не ожидая ответа на каждый, позволяет пользоваться единственным TCP соединением более эффективно, с меньшими затратами времени.

- Загрузка сети уменьшается с уменьшением числа пакетов, необходимых для открытия TCP соединений, и, следовательно, предоставляет протоколу TCP достаточно времени для определения состояния перегрузки сети.

- HTTP может развиваться более элегантно; так как ошибки можно сообщать без закрытия TCP соединения в качестве штрафа. Клиенты, использующие будущие версии HTTP могли бы оптимистично пробовать новые возможности, а при связи со старым сервером, повторять запрос, используя старую семантику после сообщения об ошибке.

8.1.2 Общее описание.

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

Постоянные соединения обеспечивают механизм, согласно которому клиент и сервер могут сообщить о разрыве TCP соединения. Это сигнализируется путем использования поля заголовка Connection.

8.1.2.1 Обсуждение (Negotiation).

HTTP/1.1 сервер в праве считать, что HTTP/1.1 клиент не поддерживает постоянное соединение, если посланный в запросе заголовок Connection содержит лексему соединения (connection-token) "close". Если сервер решает закрыть соединение немедленно после посылки ответа, то ему необходимо послать заголовок Connection, который содержит лексему соединения (connection-token) "close".

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

Если клиент или сервер посылает лексему закрытия соединения "close" в заголовке Connection, то запрос становится последним в соединении.

Чтобы соединение оставалось постоянным, все сообщения, передаваемые по нему должны иметь самоопределенную (self-defined) длину (то есть, не определяемую закрытием соединения).

8.1.2.2 Конвейерная обработка (Pipelining).

Клиент, который поддерживает постоянные соединения умеет производить "конвейерную обработку" запросов (то есть посылать несколько запросов не ожидая ответа на каждый из них). Сервер должен послать ответы на эти запросы в том же самом порядке, в каком были получены запросы.

Клиенты, которые поддерживают постоянные соединения и производят конвейерную обработку немедленно после установления соединения, должны быть готовы повторить соединение, если первая попытка конвейерной обработки дала сбой. Если клиент производит такой повтор, он не должен производить конвейерную обработку прежде чем узнает, что соединение постоянно. Также клиенты должны быть готовы повторить запросы, если сервер закрывает соединение перед посылкой всех соответствующих ответов.

8.1.3 Прокси-сервера (Proxy Servers).

Очень важно, чтобы прокси-сервера правильно реализовывали свойства полей заголовка Connection.

Прокси-сервер должен сообщать о постоянных соединениях отдельно своим клиентам и отдельно первоначальным серверам (или другим прокси-серверам), которые с ним соединены. Каждое постоянное соединение применяется только к одной транспортной связи.

Прокси-сервер не должен устанавливать постоянных соединений с HTTP/1.0 клиентом.

8.1.4 Практические соображения.

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

Когда у клиента или сервера истекло время ожидания, ему необходимо произвести закрытие транспортного соединения. Как клиентам, так и серверам надлежит постоянно наблюдать за другой стороной на предмет закрытия соединения и отвечать соответственно. Если клиент или сервер не сразу обнаруживает закрытие соединения другой стороной, то это вызывает не оправданную трату ресурсов сети.

Клиент, сервер, или прокси-сервер в праве закрыть транспортное соединение в любое время. Например, клиент может начать посылать новый запрос в то время, когда сервер решает закрыть "бездействующее" соединение. С точки зрения сервера, соединение закрывается, в то время как оно было неактивно, но с точки зрения клиента, запрос произошел.

Это означает, что клиенты, серверы, и прокси-серверы должны быть в состоянии обрабатывать асинхронные события закрытия. Программному обеспечению клиента следует вновь открыть транспортное соединение и повторно передать прерванный запрос без взаимодействия с пользователем, если метод запроса идемпотентен; другие методы не должны быть повторены автоматически, хотя агенты пользователя могут предложить оператору повторить запрос.


Страница: