【问题标题】:Disable TCP Delayed ACKs禁用 TCP 延迟 ACK
【发布时间】:2009-10-23 19:28:25
【问题描述】:

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

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

【问题讨论】:

    标签: linux tcp


    【解决方案1】:

    你可以在每次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
    • 真的是第14场吗?请参阅 herethe explanations of all fields in the kernel documentation。在我看来更像是第 19 个字段。
    • @nh2 该图将010310AC:9C4C 计为两个字段,而我将其计为一个并跳过了初始的46: 标识符。
    【解决方案2】:

    我相信使用setsockopt() 函数可以使用TCP_NODELAY,这将禁用Nagle 算法。

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

    编辑 2 汤姆是正确的。 Nagle 不影响延迟 ACK。

    【讨论】:

    • 禁用 Nagle 的算法不会影响延迟确认(至少,不会影响我所知道的任何实现)。
    • 不,禁用 nagle 会影响延迟 ack,至少我可以在 linux 最新的 3.17 内核中确认。
    • 这取决于您的意思是“nagle 不会影响延迟的 ACK”?它们是独立的选项,这是真的,但两者的结合会产生相当大的影响,这可能会导致 TCP 网络不必要的停顿,请阅读更多内容,由 Nagel 本人撰写 - news.ycombinator.com/item?id=10608356 并在此处进行更正式的讨论: extrahop.com/company/blog/2016/…
    【解决方案3】:

    接受的答案有bug,应该是

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

    SOL_TCP,不是IPPROTO_TCP

    在这里发帖以防有人需要。

    正如@damolp 所建议的,这不是错误。留在这里作记录。

    【讨论】:

    • 这两个宏在linux上实际上是相同的值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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-02
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 2016-07-11
    相关资源
    最近更新 更多