禁用TCP延迟ACK

时间:2009-10-23 19:28:26

标签: linux tcp

我有一个应用程序通过TCP接收相对稀疏的流量而没有应用程序级别的响应。我相信TCP堆栈正在发送延迟的ACK(基于对网络数据包捕获的瞥见)。对于单个套接字,在网络堆栈中禁用延迟ACK的建议方法是什么?我看了TCP_QUICKACK,但似乎堆栈会在我的脚下改变它。

这是在Linux 2.6内核上运行的,我并不担心可移植性。

3 个答案:

答案 0 :(得分:16)

您执行setsockopt(sockfd, IPPROTO_TCP, TCP_QUICKACK, (int[]){1}, sizeof(int))recv TCP_QUICKACK。似乎只有在发送或接收数据时才会重置/proc/net/tcp;如果您没有发送任何数据,那么它只会在您收到数据时重置,在这种情况下您只需再次设置即可。

您可以在{{1}}的14 th 字段中查看;如果它不是1,则应立即发送ACK ...如果我正在正确读取TCP代码。 (我也不是这方面的专家。)

答案 1 :(得分:1)

我相信使用setsockopt()功能可以使用TCP_NODELAY来禁用Nagle算法。

修改找到一个链接:http://www.ibm.com/developerworks/linux/library/l-hisock.html

编辑2 汤姆是对的。 Nagle不会影响延迟ACK。

答案 2 :(得分:0)

接受的答案有错误,应该是

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

({SOL_TCP,而不是IPPROTO_TCP

在此处发布以防有人需要。

如@damolp所建议,这不是错误。保留在这里进行记录。