Отключить ACK с задержкой TCP

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

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

Ответ 1

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

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

Ответ 2

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

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

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