Установите 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.