我有一个应用程序通过TCP接收相对稀疏的流量而没有应用程序级别的响应。我相信TCP堆栈正在发送延迟的ACK(基于对网络数据包捕获的瞥见)。对于单个套接字,在网络堆栈中禁用延迟ACK的建议方法是什么?我看了TCP_QUICKACK
,但似乎堆栈会在我的脚下改变它。
这是在Linux 2.6内核上运行的,我并不担心可移植性。
答案 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所建议,这不是错误。保留在这里进行记录。