【问题标题】:Set TCP_QUICKACK and TCP_NODELAY设置 TCP_QUICKACK 和 TCP_NODELAY
【发布时间】:2011-11-09 08:07:07
【问题描述】:

如果您在套接字上的每个调用上设置 TCP_QUICKACK 设置,之前设置了 TCP_NODELAY,QUICKACK 选项会覆盖 NODELAY 调用吗?

连接时:

int i = 1;
setsockopt( iSock, IPPROTO_TCP, TCP_NODELAY, (void *)&i, sizeof(i));

每次写入时:

int i = 1;
setsockopt( iSock, IPPROTO_TCP, TCP_QUICKACK, (void *)&i, sizeof(i));

对 TCP_QUICKACK 的调用是否会使先前对 TCP_NODELAY 的调用无效?

【问题讨论】:

  • 当您执行此操作并使用 Wireshark 之类的工具监控行为时发生了什么?
  • 使用getsockopt,我已经验证TCP_QUICKACK不会覆盖TCP_NODELAY。
  • 为什么每次写都这样?每个接收到的数据包都会发送一个 ACK​​,所以 TCP_QUICKACK 应该在每次接收后设置,否则我错过了什么
  • 为什么需要 quickack 和 nodelay?设置 nodelay 通常应该可以解决问题。
  • @lxgr TCP_QUICKACK 影响接收器; TCP_NODELAY 影响发件人。如果您无法控制这两个端点,则可能需要同时设置这两个设置才能获得所需的网络性能。

标签: c linux sockets tcp


【解决方案1】:

这两个选项之间没有直接关系,它们只是用于不同的目的。

TCP_NODELAY 旨在禁用/启用段缓冲,以便可以尽快将数据发送到对等方,因此这通常用于提高网络利用率。 TCP_QUICKACK 用于尽早发送确认,而不是在某些协议级别交换下延迟发送,并且它不是稳定/永久的,后续 TCP 事务(可能在后台发生)可以忽略此选项,具体取决于实际的协议级处理或用户设置和堆栈行为之间的任何实际分歧。

注意 TCP_NODELAY 可移植,而TCP_QUICKACK 不可移植(仅适用于 Linux 2.4.4+)。

【讨论】:

    【解决方案2】:

    使用 TCP_QUICKACK,而不是 TCP_NODELAY

    开启TCP_NODELAY也有类似的效果,但是可以使吞吐量 小写更糟。如果你编写一个只发送几个 字节(最坏情况下,一个字节)到带有“write()”的套接字,以及 Nagle TCP_NODELAY 禁用算法,每次写入成为一个 IP 包。这使流量增加了 40 倍,使用 IP 和 TCP 每个有效负载的标头。 Tinygram 预防不会让你发送 第二个数据包,如果你有一个在飞行中,除非你有足够的数据 填充最大大小的数据包。它为一轮累积字节 行程时间,然后发送队列中的所有内容。这几乎总是 你想要什么。如果你设置了 TCP_NODELAY,你需要更多 了解缓冲和刷新问题。这些对于散装都无关紧要 单向传输,这是当今大多数 HTTP。 (我没看过 这对 SSL 握手的影响,这可能很重要。)简短 版本:设置 TCP_QUICKACK。如果你发现一个案例可以使事情发生 更糟糕的是,让我知道。约翰·纳格尔

    https://news.ycombinator.com/item?id=10608356

    【讨论】:

      【解决方案3】:

      TCP_QUICKACKTCP_NODELAY 影响 TCP 中的不同操作。 tcp(7) 手册页描述了 TCP 的哪些套接字选项相互干扰,例如TCP_CORKTCP_NODELAY

      【讨论】:

        猜你喜欢
        • 2019-09-20
        • 1970-01-01
        • 2021-03-26
        • 1970-01-01
        • 1970-01-01
        • 2012-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多