设置 TCP_QUICKACK 和 TCP_NODELAY

新手上路,请多包涵

如果在套接字上的每个调用上设置 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 的调用无效?

原文由 donalmg 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.6k
2 个回答

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

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

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

原文由 Fei 发布,翻译遵循 CC BY-SA 3.0 许可协议

使用 TCP_QUICKACK,而不是 TCP_NODELAY

开启 TCP_NODELAY 也有类似的效果,但会降低小写入的吞吐量。如果你编写一个循环,它只发送几个字节(最坏的情况,一个字节)到一个带有“write()”的套接字,并且使用 TCP_NODELAY 禁用 Nagle 算法,每次写入都会变成一个 IP 数据包。这将流量增加了 40 倍,每个有效负载都有 IP 和 TCP 标头。如果您有一个正在运行的数据包,Tinygram 预防不会让您发送第二个数据包,除非您有足够的数据来填充最大大小的数据包。它累积一个往返时间的字节,然后发送队列中的所有内容。这几乎总是你想要的。如果您设置了 TCP_NODELAY,则需要更加注意缓冲和刷新问题。对于当今大多数 HTTP 的批量单向传输而言,这些都不重要。 (我从来没有研究过这对 SSL 握手的影响,这可能很重要。) 简短版本:设置 TCP_QUICKACK。如果您发现使事情变得更糟的情况,请告诉我。约翰·纳格尔

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

原文由 rofrol 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏