
Глава 8. Взаимодействие HTTP и TCP 315
долго. Подтверждение получения пакета от А очень важно. Ведь компьютер А не
сможет отправить еще одну порцию данных, если получение предыдущего пакета
не было подтверждено. Следовательно, задержка пакета АСК может замедлить пе-
редачу данных от А к В. Чтобы найти компромисс, TCP запускает таймер, который
активизирует передачу АСК, даже если нет никаких данных для отправки. Боль-
шинство реализаций TCP передают АСК через 200 мс, но некоторые увеличивают
задержку до 500 мс. Чтобы избежать задержки пакетов АСК в загруженных соеди-
нениях, TCP требует, чтобы подтверждалось прибытие хотя бы каждого второго
полноразмерного пакета до завершения таймера задержки подтверждения. Напри-
мер,
если сервер передает длинное сообщение клиенту на высокой скорости, то
клиент будет передавать подтверждения после каждого второго пакета данных,
даже если клиент не имеет собственных данных для передачи серверу.
ВЗАИМОДЕЙСТВИЕ ОТЛОЖЕННЫХ АСК С ТРАФИКОМ HTTP
Отложенные АСК уменьшают трафик подтверждений двумя путями: присоеди-
няя АСК к передаваемому пакету данных, а также посылая АСК для каждого вто-
рого пакета данных. Присоединение АСК к пакетам данных несвойственно для
Web-трафика. Обычная передача Web-данных включает в себя короткий НТТР-за-
ирос клиента, после которого следует HTTP-ответ сервера.
Маловероятно, что оба компьютера будут передавать данные одновременно,
если только сервер не посылает ответ, когда клиент посылает последующие запро-
сы из той же последовательности. Задержка передачи пакета АСК редко позволяет
клиенту присоединить его к передаваемому пакету данных. Вместо этого задержка
в 200, а то и 500 мс, вызванная таймером задержки АСК, может снизить скорость
передачи данных. Эта задержка может быть заметной пользователю. Кроме того,
когда скользящее окно сервера заполнено, задержка клиентом передачи подтвер-
ждений приостанавливает передачу сервером оставшейся части ответа.
Механизм отложенных АСК может привести к ненужной задержке Web-трафи-
ка, обусловленной реализацией Web-сервера. Представим себе сервер, который пе-
редает заголовок и тело HTTP-ответа раздельно. Заголовок ответа обычно меньше
MSS.
Операционная система может передать короткий пакет до того, как сервер за-
пишет хоть какие-нибудь дополнительные данные в выходной буфер. Позже сер-
вер начинает записывать тело ответа в выходной буфер. Если на сервере отключен
алгоритм Нагла, операционная система может начать передавать пакеты, содержа-
щие тело ответа. Первый полноразмерный пакет окажется вторым для клиента. Но
клиент не передаст АСК, так как первый пакет (заголовок HTTP) будет меньше
MSS.
Клиент должен подождать, пока закончится отсчет таймера задержки под-
тверждения, прежде чем передаст АСК. В зависимости от размера скользящего
окна сервер может оказаться не в состоянии передать дополнительную порцию
данных до получения АСК, как показано на рис. 8.8. Чтобы избежать такой ситуа-
ции, некоторые операционные системы отключают механизм задержки АСК в на-
чале соединения. Однако это не предотвращает возникновения данной ситуации
при передаче последующих ответных сообщений по тому же соединению.
Алгоритм Нагла достаточно сложно взаимодействует с механизмом отложен-
ных подтверждений, когда клиент и сервер поддерживают долговременное соеди-
нение [Hei97J; такой же феномен наблюдался на сервере NNTP [MSMV99J. Рас-
смотрим сервер, который записал HTTP-ответ в выходной буфер. Операционная
система разделяет сообщение на сегменты, каждый из которых помещается в пакет
IP.
Операционная система пытается передавать данные нолноразмерными пакета-
ми,
хотя последний пакет обычно меньше остальных. Например, сообщение дли-