ПРОТОКОЛ ПЕРЕДАЧИ ГИПЕРТЕКСТА -- HTTP / 1.1 |
||||
---|---|---|---|---|
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 запросы. |