Установите TCP_QUICKACK и TCP_NODELAY - PullRequest
       8

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

20 голосов
/ 02 сентября 2011

Если вы установите параметр 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?

Ответы [ 3 ]

23 голосов
/ 03 ноября 2012

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

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

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

9 голосов
/ 01 декабря 2015

Использовать 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 голосов
/ 05 октября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...