Назад | Перейти на главную страницу

Как установить тайм-аут nagle в ядре Linux?

мы знаем Алгоритм Нагла. Интересно, как изменить тайм-аут по умолчанию в 200 мс. Есть ли способ в Linux установить этот параметр?

Алгоритм Нэгла предотвращает отправку небольших неполноразмерных пакетов, если есть данные в пути, которые еще не были подтверждены. Как только будет получено подтверждение всех ожидающих данных или в буфере будет достаточно новых данных для создания полноразмерного пакета, будет отправлен новый пакет. В алгоритме Нэгла нет тайм-аута.

Описываемое вами поведение может быть Отложенное подтверждение что позволяет отправлять ACKS для каждого 2-го полученного пакета. Если второй пакет не получен в течение тайм-аута, отправляется ACK. Или это может быть TCP Corking, который похож на Nagle, но вместо того, чтобы бесконечно ждать ACK незавершенных данных перед отправкой новых небольших пакетов, TCP Corking предотвратит отправку нового пакета, пока буфер не заполнится или не истечет тайм-аут (200 мс).

В зависимости от используемого вами дистрибутива Linux вы можете изменить значение тайм-аута отложенного подтверждения с помощью sysctl. Например, чтобы уменьшить время ожидания в RHEL:

echo 1 > /proc/sys/net/ipv4/tcp_delack_min

Однако эта опция может быть недоступна в других версиях Linux.

В качестве альтернативы, если у вас есть программный доступ, вы можете изменить свое приложение для использования TCP_QUICKACK tcp человек что фактически отключит функцию отложенного ACK и заставит приложение отправлять ACK для каждого полученного пакета.

Чтобы отключить TCP Corking, вам необходимо изменить вызовы сокетов, чтобы установить TCP_CORK параметр - я не знаю ни одного способа включить его глобально.

Эти 200 мс не исходят из алгоритма Нэгла, но задерживают ACK.

Вы можете отключить отложенные ACK, используя setsocketopt, как предложил Марк, или используя IP-маршруты, например:

ip route change ROUTE quickack 1

Я не знаю ни одного метода для установки абсолютного тайм-аута для отложенных ACK в "обычных" (в основном не в реальном времени) ядрах.