Алгоритм Нагла

Иигерактивные приложения, такие как Rlogin и Telnet, Обычно передают мпого небольших пакетов с клавиатурными командами пользователя и короткими ответами на пих. уменьшает число небольших пакетов, задерживая передачу данных [Nag84]. Описав причины ограничения числа небольших пакетов, мы расскажем, как алгоритм Нагла снижает производительность особепио при использовании долговременных соединений. Потом мы расскажем, как Web-сервер может предотвратить передачу небольших пакетов, даже если алгоритм Нагла отключеп.

УМЕНЬШЕНИЕ ЧИСЛА НЕБОЛЬШИХ ПАКЕТОВ

Рассмотрим пример приложения Telnet, позволяющего пользователю взаимодействовать с удаленным Компьютером. Это приложение координирует передачу команд пользователя удаленному компьютеру и ответов в обратном направлении. Быстрые ответы нужны, чтобы у пользователя создавалось ощущение непосредственного взаимодействия с удаленным Компьютером. Но отправитель ТСР-пакетов на Компьютере с клиентом Telnet не должен генерировать отдельный IP-пакет для каждой клавиатурной команды. Иначе команда, содержащая единственный символ, приведет передаче 41-байтпого пакета: 20-байтный заголовок IP, 20-байтный заголовок TCP и один байт данных. Передача 41 байта на каждый байт данных  приводит к значительным накладным расходам, что, в свою очередь, приведет к чрезмерному увеличению трафика в сети. Получив данные, операционная система осуществляет накопление данных перед тем, как их передать. Интерактивные приложения не терпят задержек, поэтому операционная система не должна откладывать передачу дан- пых надолго. предназначен для поиска компромисса. Алгоритм гарантирует, что отправитель не передает более одного короткого пакета за одно RTT. В этом коитексте пебольшой пакет — это пакет, содержащий меньше байтов, чем максимальный размер сегмента (MSS — Maximum Segment Size) для данного TCP-соединения (например, 536 или 1460 байтов).

Предположим, что отправитель пакетов TCP передал пакет и ждег подтверждения от получателя. Отправитель не передает небольших пакетов, пока не получит подтверждения о доставке всех уже переданных пакетов. К этому времени отправитель мог накопить дополнительные данные. В глобалыюй сети для соединений с большим RTT алгоритм Нагла предотвращает наличие нескольких небольших пакетов в сети в одно и то же время. В локальных сетях для соединений с небольшим RTT пакеты с подтверждениями почти всегда приходят до того, как у отправителя появляются новые данные для передачи. Ограничение числа небольших пакетов в пути не вносит дополнительной задержки перед передачей следующего пакета. В дополнение к этому алгоритм Нагла не влияет на работу приложений, осуществляющих передачу по сети больших объемов данных, потому что пересылка больших файлов обычно производится полпоразмерными сегментами. Этот подход оказывает наибольшее влияние там, где это нужно — в интерактивных приложениях, использующих соединения с большими RTT.

АЛГОРИТМ НАГЛА И ДОЛГОВРЕМЕННЫЕ СОЕДИНЕНИЯ

может отрицательно сказаться на работе Web, если передача данных осуществляется небольшими пакетами. Представим себе Web-сервер, который передает HTTP-ответ, записывая заголовок и тело ответа в буфер по отдельности. Операционная система может передать заголовок отдельным небольшим пакетом до того, как сервер запишет тело ответа в выходной буфер. Предположим, что тело ответа тоже меньше максимального размера сегмента. Теоретически, операционная система отложила бы отправку тела ответа, надеясь накопить еще данных. Но если сервер инициирует закрытие соединения, то операционная система не будет ожидать от него дополнительных данных. Тогда операционная система произведет отправку небольшого пакета независимо от того, прибыло ли подтверждение о предыдущем пакете или нет. Если сервер не закрывает соединение, операционная система не посылает второй небольшой пакет до тех пор, пока не придет подтверждение о получении первого пакета. В дополнение к промежутку времени, за который подтверждение ACK может достичь сервера, операционная система на клиентском компьютере может дополнительно задержать отправку пакета подтверждения, как описано ниже в разделе 8.2.3.

Даже если сервер записывает весь ответ в выходиой буфер за один шаг, алгоритм Нагла может уменьшить эффективность долговременных соединений [Hei97J. Представим себе Web-сервер, который записывает HTTP-ответ в выходной буфер. В буфер добавится сравнительно большой объем данных (скажем, 8-12 Кбайт) за короткое время. Операционная система будет передавать такой ответ как серию полноразмерных пакетов. В большинстве случаев, в зависимости от размера сообщения, в конце сообщения может быть один небольшой пакет. Например, сообщение длиной 6000 байтов передается по соединению с MSS, равным 1460 байтам. Сообщение займет четыре 1460-байтных пакета и один 160-байтный. Операционная система пошлет последовательность полноразмерных пакетов и отложит отправку небольшого пакета. Отправка последнего пакета будет произведена, если выполнится одно из следующих условий:

• Запись дополнительных данных в выходной буфер. Сервер может добавить данные в выходной буфер, что приведет к отправке еще одного полпоразмер- ного пакета, как показано на рис. 8.6. Пакет содержит конец первого сообщения и начало второго. Однако у сервера не всегда найдутся данные для пересылки клиенту. Например, у сервера отсутствуют запросы, ответы на которые нужно передать по данному соединению.

Рис 8.6. Сервер передает полноразмерный пакет, содержащий конец ответа

• Получение подтверждений на все переданные пакеты. Могут прийти подтверждения о прибытии всех пакетов, переданных получателю, что позволит операционной системе передать заключительный неполный пакет. На рис. 8.7 показан пример, когда начальный размер скользящего окпа на сервере равеп длине двух полноразмерпых пакетов, сервер получает пакет ACK на каждый второй пакет данных. Ожидание подтверждений обусловливает задержку, равную RTT. Для небольших ответов задержка передачи небольшого заключительного пакета может быть значительной.

Рис 8.7. Сервер передает небольшой пакет после получения подтверждений

Отключение алгоритма Нагла — простой способ избежать этих потерь производительности. Отключение производится заданием соответствующих параметров во время открытия соединения. Например, в операционной системе UNIX есть функция setsockopt() для выполнения различных пастроек. Установленный флаг TCP_NODELAY при вызове функции setsockopt() отключает алгоритм Нагла. Web-серверы, поддерживающие долговременные соединения, обычно отключают алгоритм Нагла. Web-клиенты также могут отключить алгоритм Нагла, так как в противном случае передача больших запросов, таких как PUT и POST, может привести к снижению производительности.

НЕДОСТАТКИ ОТКЛЮЧЕНИЯ АЛГОРИТМА НАГЛА

На первый взгляд отключение алгоритма Нагла не будет оказывать никакого отрицательного эффекта на работу Web. На самом деле алгоритм Нагла заметно улучшает работу тогда, когда приложение пишет данные в выходной буфер маленькими порциями. Представим себе Web-cepвep, который но отдельности (с помощью вызовов системной функции) записывает каждую строку заголовка HTTP- ответа. Когда алгоритм Нагла отключен, каждый вызов функции write() создает отдельный пакет. Это было бы крайне неэффективно. Например, 300-байтовый заголовок ответа состоит из десяти строк. Он может поместиться в один IP-накет. Помимо этого, в пакет поместится начало тела ответа, если таковое имеется. Запись строк по одной приведет к передаче десяти пакетов вместо одного, если алгоритм Нагла отключеп. Эта проблема была характерной для ранних версий Web-cepBepa NCSA, который вызывал системную функцию для выдачи каждой строки заголовков HTTP. Подобный феномен имеется и в протоколе Network News Transfer Protocol (NNTP) [MSMV99].

Вероятность передачи строк заголовка отдельными пакетами зависит от загрузки сервера. Сильно загруженный сервер менее склонеп передавать большое число коротких пакетов. Представим себе загруженный сервер, который генерирует и передает сотпи ответов одновременно. Передача IP-пакетов ограничена пропускной способностью подключения сервера к сети. При большой нагрузке оиерационпая система создает очередь данных, передаваемых сервером. Рассмотрим серверный процесс, который делает десять системных вызовов для записи десяти строк заголовка ответа. На загруженном компьютере вторая строка может быть записана в буфер до того, как будет передана первая. Операционная система соединит эти две строки в один пакет. Таким образом, операционная система может передать все десять строк заголовка в одном пакете. Если бы сервер был менее загружен, то операционная система передала бы все десять строк заголовка в виде отдельных пакетов, каждый из которых содержал бы по 40 байтов заголовков протоколов IP и TCP.

Сервер может избежать передачи небольших пакетов без привлечения алгоритма Нагла, создав сначала весь заголовок и однократно вызвав write(), чтобы записать полученпый заголовок в выходной буфер. Это гарантирует, что операциониая система не будет создавать отдельный пакет для каждой строки заголовка, это также позволит уменьшить число системных вызовов. Сервер может произвести всего один системный вызов, чтобы поместить в буфер заголовок и тело ответа, что будет более подробно описано позже в разделе 8.4.1.

Источник: Web-протоколы. Теория и практика. — M.: ЗАО «Издательство БИНОМ», 2002 г. – 592 c.: ил.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100