Установите TCP_QUICKACK и TCP_NODELAY

Если вы устанавливаете параметр TCP_QUICKACK для каждого вызова в сокете, предварительно установив TCP_NODELAY, будет ли опция QUICKACK перезаписывать вызов NODELAY?

Вкл. соединение:

int i = 1;
setsockopt( iSock, IPPROTO_TCP, TCP_NODELAY, (void *)&i, sizeof(i));

На каждой записи:

int i = 1;
setsockopt( iSock, IPPROTO_TCP, TCP_QUICKACK, (void *)&i, sizeof(i));

Будет ли вызов TCP_QUICKACK пустым для предыдущего вызова TCP_NODELAY?

Ответ 1

Нет прямой связи между этими двумя вариантами, они предназначены только для разных целей.

TCP_NODELAY предназначен для отключения/включения буферизации сегментов, поэтому данные могут быть отправлены на одноранговую связь как можно быстрее, поэтому это обычно используется для улучшения использования сети. TCP_QUICKACK используется для отправки подтверждений как можно раньше, чем задержка при обмене на каком-то уровне протокола, и это нестабильные/постоянные последующие транзакции TCP (которые могут произойти под капотом) могут игнорировать эту опцию в зависимости от фактическая обработка уровня протокола или любые фактические разногласия между пользовательскими настройками и поведение стека.

ПРИМЕЧАНИЕ TCP_NODELAY переносится, а TCP_QUICKACK не работает (работает только под Linux 2.4.4 +).

Ответ 2

Используйте TCP_QUICKACK, а не TCP_NODELAY

Включение TCP_NODELAY имеет схожие эффекты, но может обеспечить пропускную способность хуже для небольших записей. Если вы пишете цикл, который отправляет всего несколько байты (наихудший случай, один байт) в сокет с "write()", а Nagle алгоритм отключен с помощью TCP_NODELAY, каждая запись становится одним IP-адресом пакет. Это увеличивает трафик в 40 раз, при этом IP и TCP заголовки для каждой полезной нагрузки. Предотвращение Tinygram не позволит вам отправить второй пакет, если у вас есть один в полете, если у вас недостаточно данных для заполнения пакета максимального размера. Он накапливает байты за один раунд время поездки, а затем отправляет все в очередь. Это почти всегда что ты хочешь. Если у вас установлен TCP_NODELAY, вам нужно быть намного больше осознавая проблемы буферизации и промывки. Ничего из этого не важно односторонняя передача, которая сегодня является большинством HTTP. (Я никогда не смотрел на влияние этого на SSL-квитирование, где это может иметь значение.) Короткий версия: установить TCP_QUICKACK. Если вы найдете случай, когда это делает вещи хуже, дайте мне знать. Джон Нагл

https://news.ycombinator.com/item?id=10608356

Ответ 3

TCP_QUICKACK и TCP_NODELAY влияют на различные операции в TCP. Страница tcp (7) описывает, какие параметры сокетов для TCP мешают друг другу, например. TCP_CORK и TCP_NODELAY.