Отключить задержанные TCP ACK - PullRequest
       23

Отключить задержанные TCP ACK

17 голосов
/ 23 октября 2009

У меня есть приложение, которое получает относительно разреженный трафик по TCP без ответов на уровне приложения. Я полагаю, что стек TCP отправляет отложенные ACK (основываясь на взгляде на захват сетевого пакета). Каков рекомендуемый способ отключить задержку ACK в сетевом стеке для одного сокета? Я посмотрел на TCP_QUICKACK, но похоже, что стек все равно изменит его под моими ногами.

Это работает на ядре Linux 2.6, и я не беспокоюсь о переносимости.

Ответы [ 3 ]

16 голосов
/ 24 октября 2009

Вы можете setsockopt(sockfd, IPPROTO_TCP, TCP_QUICKACK, (int[]){1}, sizeof(int)) после каждого recv, который вы выполняете. Похоже, что TCP_QUICKACK сбрасывается только при наличии данных, отправляемых или получаемых; если вы не отправляете никаких данных, они будут сброшены только при получении данных, и в этом случае вы можете просто установить их заново.

Вы можете проверить это в поле 14 th /proc/net/tcp; если это не 1, ACK должны быть отправлены немедленно ... если я правильно читаю код TCP. (Я тоже не эксперт в этом.)

1 голос
/ 26 августа 2010

Я считаю, что с помощью функции setsockopt () вы можете использовать TCP_NODELAY, который отключит алгоритм Нейгла.

Редактировать Найдена ссылка: http://www.ibm.com/developerworks/linux/library/l-hisock.html

Редактировать 2 Том прав.Nagle не влияет на задержанные ACK.

0 голосов
/ 22 июня 2018

В принятом ответе есть ошибка, она должна быть

flags = 0;
flglen = sizeof(flags);
setsockopt(sfd, SOL_TCP, TCP_QUICKACK, &flags, flglen)

(SOL_TCP, а не IPPROTO_TCP)

Публикуйте здесь, если это кому-то нужно.

Как подсказал @damolp, это не ошибка. Держите это здесь для записи.

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