我有一个应用程序,通过TCP接收相对稀疏的stream量,没有应用程序级响应。 我相信TCP堆栈正在发送延迟的ACK(基于对networking数据包捕获的扫描)。 什么是推荐的方法来禁用单个套接字的networking堆栈中的延迟ACK? 我已经看了TCP_QUICKACK
,但似乎堆栈会改变它在我的脚下。
这是在Linux 2.6内核上运行的,我并不担心可移植性。
您可以在每次执行recv
后使用setsockopt(sockfd, IPPROTO_TCP, TCP_QUICKACK, (int[]){1}, sizeof(int))
。 看起来TCP_QUICKACK
只有在有数据被发送或接收的时候才被重置, 如果您没有发送任何数据,那么只有当您收到数据时才会重置,在这种情况下,您可以简单地重新设置。
你可以在/proc/net/tcp
第 14 个字段中检查这个。 如果不是1,则应立即发送ACK …如果我正确读取TCP代码。 (我也不是这方面的专家)
我相信使用setsockopt()函数,您可以使用TCP_NODELAY
将禁用Nagle算法。
编辑找到一个链接: http : //www.ibm.com/developerworks/linux/library/l-hisock.html
编辑2汤姆是正确的。 Nagle不影响延迟的ACK。