
264 Часть III. Web-протоколы
Хотя сервер и может попытаться предложить более эффективную последова-
тельность передачи ответов, избегая в некоторых случаях блокировки «первый
в очереди», протокол требует, чтобы ответы посылались в том порядке, в котором
были получены запросы. Это самое простое, что может сделать сервер. Специфика-
ции протоколов предпочитают ошибаться «по простоте своей».
СЛУЧАИ НЕПРЕДВИДЕННОГО ЗАКРЫТИЯ ПОТОКА
КОНВЕЙЕРИЗИРОВАННЫХ ЗАПРОСОВ
Существует множество причин, по которым HTTP-соединение может завер-
шиться аварийно. Пользователь может намеренно прервать соединение, нажав
кнопку браузера Stop или щелкнув мышью на гиперссылке, когда текущая страни-
ца продолжает загружаться. Сервер может прервать соединение, если решит, что
его ресурсы пытаются использовать неправильно. В сети может произойти сбой,
ведущий к разрыву текущего соединения.
Долговременные соединения страдают от всех помех, связанных с аварийными
завершениями соединений, как и простые запросы, по добавляются и дополнитель-
ные проблемы. В случае, когда аварийно завершается одиночный запрос, пользова-
тель может просто повторить его (если он сам не инициировал этого завершения)
или проигнорировать неудачный запрос (особенно если сам вызвал его заверше-
ние).
В этом случае аварийное завершение не порождает проблем сохранения со-
стояния для таких методов как GET и HEAD. Однако в случае методов PUT и
POST может осуществляться попытка обгювления содержания на сервере. Пусть
последовательность запросов представляет собой конвейер, и пользователь завер-
шает эти запросы до того, как будут получены все ответы. Агент пользователя дол-
жен установить, на какие запросы получены ответы, и повторно передать все ос-
тальные запросы.
Протокол предписывает, что клиенты должны иметь возможность восстанавли-
вать закрытое соединение, независимо от причины закрытия. Например, возможно,
что клиент должен вновь открыть соединение и отправить все запросы, которые не
были обработаны. Обычно это не является проблемой. Однако если сама последо-
вательность запросов имеет существегнюе значение (то есть существует зависи-
мость от того порядка, в котором обрабатывались запросы), агенту пользователя
возможно потребуется согласовать свои действия с пользователем и повторно пе-
редать прерванные запросы. Например, обработанная часть потока запросов воз-
можно требует обязательной повторной передачи всей совокупности запросов.
Отсутствие взаимодействия между транспортным и прикладным уровнями явля-
ется причиной неудовлетворительного аварийного завершения соединения в процес-
се обработки конвейера запросов. Если бы в HTTP имелось бы средство зафиксиро-
вать разрыв, не закрывая соединения транспортного уровня, то тогда эту проблему
удалось бы преодолеть. Однако зависимость протокола прикладного уровня от про-
токолов нижних уровней является некорректным проектным решением. Эта тема
обсуждается более подробно в главе 8 (раздел 8.2.1).
7.5.5.
Закрытие долговременных соединений
При установлении долговременного соединения рождается естественный во-
прос,
когда это соединение закрывать. Протокол в принятии такого решения не иг-
рает никакой роли, оставляя его на усмотрение компонентов, участву10ш;их в со-
единении. Единственная рекомендация протокола гласит, что соединения по умол-
чанию должно быть долговременным. Это вынуждает клиента или сервер явно