Протокол HTTP 1.1Рефераты >> Коммуникации и связь >> Протокол HTTP 1.1
Однако это автоматического повтора производить не следует, если сбой происходит уже во втором запросе.
Серверам всегда следует отвечать по крайней мере на один запрос в соединении, если это возможно. Серверам не следует разрывать соединение в середине передачи ответа, если не предполагается сетевого или клиентского отказа.
8.2 Требования к передаче сообщений.
Общие требования:
- HTTP/1.1 серверам следует поддерживать постоянные соединения и использовать механизмы управления потоком данных TCP в целях уменьшения временных перегрузок, вместо закрытия соединений, которые, как ожидается, могут быть повторно использованы клиентами. Последняя методика может усиливать сетевую загрузку.
- HTTP/1.1 (или более поздним) клиентам, посылающим тело сообщения (message-body) следует контролировать сетевое соединение на предмет ошибок во время передачи запроса. Если клиент обнаруживает ошибку, ему следует немедленно прекратить передачу тела сообщения. Если тело посылается с использованием кодирования "по кускам" ("chunked"), то кусок нулевой длины, и пустой завершитель могут использоваться для индикации преждевременного конца сообщения. Если телу предшествовал заголовок Content-Length, клиент должен закрыть соединение.
- HTTP/1.1 (или более поздний) клиент должен быть готов принять ответ с кодом состояния 100 (Продолжать, Continue), предшествующий основному ответу.
- HTTP/1.1 (или более поздний) сервер, который получает запрос от HTTP/1.0 (или более раннего) клиента не должен отвечать кодом состояния 100 (Продолжать, Continue); ему следует либо ждать пока запрос будет выполнен обычным образом (то есть без использования прерванного запроса), либо преждевременно закрыть соединение.
- После получения метода, подчиненного этим требованиям, от HTTP/1.1 (или более позднего) клиента, HTTP/1.1 (или более поздний) сервер должен либо ответить кодом состояния 100 (Продолжать, Continue) и продолжать чтение входного потока, либо ответить кодом состояния ошибки. Если сервер ответил кодом состояния ошибки, то он может либо закрыть транспортное соединение (TCP), либо продолжать читать и отбрасывать оставшуюся часть запроса. Он не должен выполнять запрошенный метод, если возвратил код состояния ошибки.
Клиентам следует помнить номер версии HTTP, используемой сервером по крайней мере в последний раз; если HTTP/1.1 клиент встречал HTTP/1.1 или более поздний ответ от сервера, и видит закрытие соединения перед получением какого-либо кода состояния от сервера, клиенту следует повторить запрос без взаимодействия с пользователем, если метод запроса идемпотентен; другие методы не должны быть повторены автоматически, хотя агенты пользователя могут предложить оператору повторить запрос. Если клиент повторяет запрос, то он
- должен сначала послать поля заголовка запроса, а затем
- должен либо ожидать ответа сервера с кодом 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 реализована сервером, если клиент получает код состояния ошибки, то он
- не должен продолжать и
- должен закрыть соединение, если он не завершил посылку сообщения.
HTTP/1.1 (или более позднему) клиенту, который обнаруживает закрытие соединения после получения ответа с кодом состояния 100 (Продолжать, Continue), но до получения ответа с другим кодом состояния, следует повторить запрос, но уже не ожидать ответа с кодом состояния 100 (Продолжать, Continue).
9 Определения методов.
Множество общих для HTTP/1.1 методов приводится ниже. Хотя это множество может быть расширено, нельзя считать, что дополнительные методы имеют одиннаковую семантику, если они являются расширениями разных клиентов и серверов.
Поле заголовка запроса Host должно сопровождать все HTTP/1.1 запросы.
9.1 Безопасные и идемпотентные методы.
9.1.1 Безопасные методы.
Программистам следует понимать, что программное обеспечение при взаимодействии с Интернетом представляет пользователя, и программе следует информировать пользователя о любых действиях, которые он может произвести, но которые могут иметь непредсказуемое значение для него или других лиц.
В частности было принято соглашение, что методы GET и HEAD никогда не должны иметь иного значения, кроме загрузки (retrieval). Эти методы следует рассматривать как "безопасные". Это позволяет агенту пользователя представлять другие методы, такие как POST, PUT и DELETE, таким образом, чтобы пользователь был проинформирован о том, что он запрашивает выполнение потенциально опасного действия.
Естественно невозможно гарантировать, что сервер не генерирует побочных эффектов в результате выполнения запроса GET; фактически, некоторые динамические ресурсы содержат такую возможность. Важное различие здесь в том, что не пользователь запрашивает побочные эффекты, и, следовательно, пользователь не может нести ответственность за них.
9.1.2 Идемпотентные методы.
Методы могут также обладать свойством "идемпотентности" ("idempotence") в том смысле, что побочные эффекты от N > 0 идентичных запросов такие же, как от одиночного запроса (за исключение ошибок и проблем устаревания). Методы GET, HEAD, PUT и DELETE обладают данным свойством.
9.2 OPTIONS.
Метод OPTIONS представляет запрос информации об опциях соединения, доступных в цепочке запросов/ответов, идентифицируемой запрашиваемым URI (Request-URI). Этот метод позволяет клиенту определять опции и/или требования, связанные с ресурсом, или возможностями сервера, но не производя никаких действий над ресурсом и не инициируя его загрузку.