Постоянные соединения
Непостоянные соединения обладают рядом недостатков. Прежде всего для каждого запрашиваемого объекта должно устанавливаться новое соединение. При этом необходимо учитывать, что каждое соединение требует от протокола TCP выделения буфера, а также ряда служебных переменных как на стороне клиента, так и на стороне сервера. Учитывая то, что многие web-серверы параллельно обслуживают сотни клиентов, подобная схема серьезно затрудняет процесс взаимодействия между клиентами и сервером. Кроме того, установление соединения для каждого объекта из-за времени оборота приводит к дополнительным временным затратам.
При постоянном соединении сервер не закрывает ТСР-соединение после обслуживания запроса, что позволяет обслужить несколько запросов в одном соединении. Так, если в нашем примере применить механизм постоянных соединений, то вся web-страница, включающая базовый HTML-файл и 10 изображений, будет передана клиенту через одно ТСР-соединение. Передача web-страниц через одно соединение возможна в случаях, если все объекты находятся на одном и том же хосте. Обычно закрытие TCP-соединения происходит в случае, когда оно не используется в течение некоторого установленного времени (интервала ожидания).
Постоянные соединения делятся на два класса: с конвейеризацией и без конвейеризации. В соединениях без конвейеризации клиент посылает серверу новый запрос после того, как завершается прием текущего объекта. Это позволяет сократить время выполнения запроса на величину времени оборота по сравнению с непостоянными соединениями. Тем не менее даже такой заметный прогресс не является пределом; соединения с конвейеризацией имеют еще меньшее время выполнения запроса. Обратите внимание на еще один недостаток соединений без конвейеризации: после окончания передачи ответа сервер простаивает, ожидая нового запроса. Это приводит к неэкономному расходованию серверных ресурсов.
По умолчанию протокол HTTP 1.1 настроен на использование постоянных соединений с конвейеризацией. В этом режиме клиент формирует запрос сразу после обнаружения ссылки на объект. Это позволяет новому запросу направляться к серверу, не дожидаясь окончания обслуживания других запросов. Аналогично, сервер, получая новые запросы, начинает их немедленное обслуживание. Очевидны достоинства конвейерного механизма: временные расходы на установление соединения сводятся к одной задержке на время оборота для всей web-страницы, а время простоя сервера значительно сокращается. Мы количественно сравним модели постоянных и непостоянных соединений в упражнениях к главам 2 и 3. Заинтересованный читатель может также обратиться к литературе.