ПРОТОКОЛ ПЕРЕДАЧИ ГИПЕРТЕКСТА -- HTTP / 1.1

Автор статьи: Алексей Симонов
Сайт Автора: Нет
E-mail Автора: Leshik@omsk.com
Дата публикации: 26.03.2005



8.2 Требования к передаче сообщений.

Общие требования:

o HTTP/1.1 серверам СЛЕДУЕТ поддерживать постоянные соединения и
использовать механизмы управления потоком данных TCP в целях
уменьшения временных перегрузок, вместо закрытия соединений,
которые, как ожидается, могут быть повторно использованы
клиентами. Последняя методика может усиливать сетевую загрузку.

o HTTP/1.1 (или более поздним) клиентам, посылающим тело
сообщения (message-body) СЛЕДУЕТ контролировать сетевое
соединение на предмет ошибок во время передачи запроса. Если
клиент обнаруживает ошибку, ему СЛЕДУЕТ немедленно прекратить
передачу тела сообщения. Если тело посылается с использованием
кодирования "по кускам" ("chunked", раздел 3.6), то кусок
нулевой длины, и пустой завершитель МОГУТ использоваться для
индикации преждевременного конца сообщения. Если телу
предшествовал заголовок Content-Length, клиент ДОЛЖЕН закрыть
соединение.

o HTTP/1.1 (или более поздний) клиент ДОЛЖЕН быть готов принять
ответ с кодом состояния 100 (Продолжать, Continue),
предшествующий основному ответу.

o HTTP/1.1 (или более поздний) сервер, который получает запрос от
HTTP/1.0 (или более раннего) клиента НЕ ДОЛЖЕН передать ответ
с кодом состояния 100 (Продолжать, Continue); ему СЛЕДУЕТ либо
ожидать пока запрос будет выполнен обычным образом (то есть без
использования прерванного запроса), либо преждевременно закрыть
соединение.

После получения метода, подчиненного этим требованиям, от HTTP/1.1
(или более позднего) клиента, HTTP/1.1 (или более поздний) сервер
ДОЛЖЕН либо ответить кодом состояния 100 (Продолжать, Continue) и
продолжать чтение входного потока, либо ответить ошибочным кодом
состояния. Если сервер ответил ошибочным кодом состояния, то он
МОЖЕТ либо закрыть транспортное соединение (TCP), либо продолжать
читать и отбрасывать оставшуюся часть запроса. Он НЕ ДОЛЖЕН
выполнять запрошенный метод, если возвратил код состояния ошибки.

Клиентам СЛЕДУЕТ помнить номер версии HTTP, используемой сервером
по крайней мере в последний раз; если HTTP/1.1 клиент встречал
HTTP/1.1 или более поздний ответ от сервера, и видит закрытие
соединения перед получением какого-либо кода состояния от сервера,
клиенту СЛЕДУЕТ повторить запрос без взаимодействия с
? пользователем, поскольку метод запроса idempotent (смотрите
раздел 9.1.2); другие методы НЕ ДОЛЖНЫ быть повторены
автоматически, хотя агенты пользователя МОГУТ предложить оператору
выбор повторять запрос, или нет. Если клиент повторяет запрос,
то он

o ДОЛЖЕН сначала послать поля заголовка запроса, а затем

o ДОЛЖЕН ожидать ответа сервера с кодом 100 (Продолжать,
Continue), а затем продолжать, или с кодом состояния ошибки.

Если HTTP/1.1 клиент не встречал ответа сервера версии HTTP/1.1
или более поздней, то ему следует считать, что сервер реализует
HTTP/1.0 или более старый протокол и не использовать ответы с
кодом состояния 100 (Продолжать, Continue). Если в такой ситуации
клиент видит закрытие соединения перед получением какого-либо
ответа с кодом состояния от сервера, то ему СЛЕДУЕТ повторить
запрос. Если клиент повторяет запрос к этому HTTP/1.0 серверу, то
? он должен использовать следующий "binary exponential backoff"
алгоритм, чтобы быть уверенным в получении надежного ответа:

1. Инициализировать новое соединение с сервером.

2. Передать заголовки запроса (request-headers).

3. Инициализировать переменную R примерным временем передачи
информации на сервер и обратно (например на основании времени
установления соединения), или постоянным значение в 5 секунд,
если время передачи не доступно.

4. Вычислить T = R * (2**N), где N - число предыдущих повторов
этого запроса.

5. Либо дождаться от сервера ответа с кодом ошибки, либо просто
выждать T секунд (смотря что произойдет раньше).

6. Если ответа с кодом ошибки не получено, после T секунд передать
тело запроса.

7. Если клиент обнаруживает, что соединение было закрыто
преждевременно, то ему нужно повторять начиная с шага 1, пока
запрос не будет принят, либо пока не будет получен ошибочный
ответ, либо пока у пользователя не кончится терпение и он не
завершит процесс повторения.

Независимо от того, какая версия HTTP реализована сервером, если
клиент получает ошибочный код состояния, то он

o НЕ ДОЛЖЕН продолжать и

o ДОЛЖЕН закрыть соединение, если он не завершил посылку
сообщения.

HTTP/1.1 (или более позднему) клиенту, который обнаруживает
закрытие соединения после получения ответа с кодом состояния 100
(Продолжать, Continue), но до получения ответа с другим кодом
состояния, СЛЕДУЕТ повторить запрос, но уже не ожидать ответа с
кодом состояния 100 (Продолжать, Continue) (но он МОЖЕТ сделать
так, если это упрощает реализацию).


9 Определения методов (Method Definitions).

Набор общих методов для HTTP/1.1 приводится ниже. Хотя этот набор
может быть расширен, нельзя считать, что дополнительные методы
имеют одиннаковую семантику, если они являются расширениями
разных клиентов и серверов.

Поле заголовка запроса Host (раздел 14.23) ДОЛЖНО сопровождать
все HTTP/1.1 запросы.



Список похожих статей