Сети и системы телекоммуникаций. Погонин В.А - 91 стр.

UptoLike

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 примерным временем передачи информации на сервер и
обратно (например на основании времени установления соединения), или постоянным значение в
пять секунд, если время передачи не доступно;
4) вычислить T = R * (2**N), где N – число предыдущих повторов этого запроса;
5) либо дождаться от сервера ответа с кодом ошибки, либо просто выждать T секунд (смотря
что произойдет раньше);
6) если ответа с кодом ошибки не получено, после T секунд передать тело запроса;
7) если клиент обнаруживает, что соединение было закрыто преждевременно, то ему нужно
повторять начиная с шага 1, пока запрос не будет принят, либо пока не будет получен ошибочный
ответ, либо пока у пользователя не кончится терпение и он не завершит процесс повторения.
Независимо от того, какая версия HTTP реализована сервером, если клиент получает код со-
стояния ошибки, то он не должен продолжать и должен закрыть соединение, если он не завершил
посылку сообщения.
HTTP/1.1 (или более позднему) клиенту, который обнаруживает закрытие соединения после
получения ответа с кодом состояния 100 (Продолжать, Continue), но до получения ответа с другим