【发布时间】:2009-10-23 19:28:25
【问题描述】:
我有一个应用程序通过 TCP 接收相对稀疏的流量,没有应用程序级响应。我相信 TCP 堆栈正在发送延迟的 ACK(基于对网络数据包捕获的浏览)。在单个套接字的网络堆栈中禁用延迟 ACK 的推荐方法是什么?我看过TCP_QUICKACK,但似乎堆栈无论如何都会在我脚下改变它。
这是在 Linux 2.6 内核上运行的,我不担心可移植性。
【问题讨论】:
我有一个应用程序通过 TCP 接收相对稀疏的流量,没有应用程序级响应。我相信 TCP 堆栈正在发送延迟的 ACK(基于对网络数据包捕获的浏览)。在单个套接字的网络堆栈中禁用延迟 ACK 的推荐方法是什么?我看过TCP_QUICKACK,但似乎堆栈无论如何都会在我脚下改变它。
这是在 Linux 2.6 内核上运行的,我不担心可移植性。
【问题讨论】:
你可以在每次recv 执行后setsockopt(sockfd, IPPROTO_TCP, TCP_QUICKACK, (int[]){1}, sizeof(int))。似乎TCP_QUICKACK 仅在有数据发送或接收时才会重置;如果你没有发送任何数据,那么它只会在你收到数据时被重置,在这种情况下你可以简单地重新设置它。
您可以在/proc/net/tcp的第14th字段中查看;如果不是 1,则应立即发送 ACK……如果我正确读取了 TCP 代码。 (我也不是这方面的专家。)
【讨论】:
TCP_QUICKACK如果有任何需要确认的东西,就会立即发送一个ACK,所以我认为这就足够了。
send()ing。但正如我所说,我没有回复收到的消息。我去看看/proc/net/tcp。
010310AC:9C4C 计为两个字段,而我将其计为一个并跳过了初始的46: 标识符。
我相信使用setsockopt() 函数可以使用TCP_NODELAY,这将禁用Nagle 算法。
编辑找到一个链接:http://www.ibm.com/developerworks/linux/library/l-hisock.html
编辑 2 汤姆是正确的。 Nagle 不影响延迟 ACK。
【讨论】:
接受的答案有bug,应该是
flags = 0;
flglen = sizeof(flags);
setsockopt(sfd, SOL_TCP, TCP_QUICKACK, &flags, flglen)
(SOL_TCP,不是IPPROTO_TCP)
在这里发帖以防有人需要。
正如@damolp 所建议的,这不是错误。留在这里作记录。
【讨论】:
SOL_TCPIPPROTO_TCP。我不会将此称为错误,因为手册页 (man tcp) 指出 call getsockopt(2) to read or setsockopt(2) to write the option with the option level argument set to IPPROTO_TCP。