Отключить 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.