什么时候应该使用 TCP_NODELAY,什么时候应该使用 TCP_CORK?

新手上路,请多包涵

我知道他们俩都禁用了 Nagle 的算法。

我什么时候应该/不应该使用它们中的每一个?

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

阅读 691
2 个回答

首先,并非他们都禁用了 Nagle 算法。

Nagle 的算法用于减少线路中更多的小型网络数据包。该算法是:如果数据小于限制(通常是 MSS),则等待直到收到先前发送的数据包的 ACK,同时累积来自用户的数据。然后发送累积的数据。

 if [ data > MSS ]
    send(data)
else
    wait until ACK for previously sent data and accumulate data in send buffer (data)
    And after receiving the ACK send(data)

这将有助于 telnet 等应用程序。但是,在发送流数据时等待 ACK 可能会增加延迟。此外,如果接收方实施“延迟 ACK 策略”,则会导致暂时的死锁情况。在这种情况下,禁用 Nagle 算法是更好的选择。

因此 TCP_NODELAY 用于禁用 Nagle 算法。

TCP_CORK 积极地积累数据。如果在套接字中启用了 TCP_CORK,它将不会发送数据,直到缓冲区填充到固定限制。与 Nagle 的算法类似,它也从用户那里累积数据,但直到缓冲区填充到固定限制,直到收到 ACK。这在发送多个数据块时很有用。但是在使用 TCP_CORK 时必须更加小心。

直到 2.6 内核,这两个选项都是互斥的。但是在后来的内核中,它们可以同时存在。在这种情况下,将优先考虑 TCP_CORK。

参考:

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

TCP_NODELAY

用于禁用 Nagle 算法以改进 TCP/IP 网络并通过等待收到对先前发送的数据的确认以发送累积的数据包来减少数据包的数量。

//来自 tcp(7) 手册:

TCP_CORK (或 TCP_NOPUSH 在 FreeBSD 中)

如果设置,则不发送部分帧。再次清除该选项时,将发送所有排队的部分帧。这对于在调用 sendfile(2) 或吞吐量优化之前添加标头很有用。按照目前的实施,输出被 TCP_CORK 阻塞的时间有 200 毫秒的上限如果达到此上限,则自动传输排队的数据。此选项只能与 TCP_NODELAY 结合使用,仅从 Linux 2.5.71 开始。此选项不应在旨在可移植的代码中使用。

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

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