【问题标题】:What happened to the TCP Nagle flush?TCP Nagle 刷新发生了什么?
【发布时间】:2011-10-07 07:07:31
【问题描述】:

根据this Socket FAQ article 的说法,Nagle 的算法是许多算法之一,它可以导致一堆数据位于 TCP 缓冲区中而不会到达网络。 Nagle 算法的延迟最高可达 200 毫秒。

出于某种原因,Nagle 的算法可以完全关闭,但不能只刷新一次。这对我来说真的很令人费解。为什么没有办法说“就这一次,不要等待更多数据。就当Nagle的200ms到了。”

这难道不是很有意义吗?在根本不使用 Nagle、始终使用 Nagle 和从头实现自己的协议之间取得良好的平衡吗?

【问题讨论】:

  • Nagle 的算法不会延迟您的第一个send()。如果第一个send() 的确认尚未到达,它只会延迟您的第二个send()。因此,避免 Nagle 算法造成的延迟的一种方法是将尽可能多的 send() 操作合并为一个。

标签: tcp nagle


【解决方案1】:

好问题。我想没有人真正需要它或者他们绕过它。如果我没记错的话,启用TCP_NODELAY 会立即推送数据。然后你可以禁用它。

当然,这是以两次系统调用“刷新”为代价的。你可以做什么:send(2),在 Unix 实现上有一个flags 参数。您可以实现自己的标志,例如:MSG_JUSTPUSHIT(好吧,也许是另一个名字)并在tcp_output 中考虑它。

【讨论】:

  • 找到another question,它还建议启用/禁用 TCP_NODELAY 以实现 Nagle 刷新。
  • @romkyns 是的,但最好使用send 标志。
  • 抱歉,我的意思是我不知道如何在 Windows 上实现我自己的 send 标志。
  • @romkyns 这可能是不可能的 :-)
【解决方案2】:

在 Nagle 算法引入的延迟是一个问题的性能敏感型应用程序中,通常更容易完全禁用 Nagle 算法并通过使用分散/收集 IO(例如,writev(),或通过实现在需要时在软件中缓冲)。作为额外的好处,这样做可以减少一些系统调用开销。

或者,您可以打开两个单独的套接字并在其中一个上禁用 Nagling。请记住,在一个套接字上发送的数据不一定会与另一个套接字同步。

【讨论】:

  • 我有一个应用程序,它单向发送大量数据,但也每隔几秒进行一次交互通信。这意味着永远开启或永远关闭都不能很好地工作。似乎 Nagle 冲洗将是解决此问题的最简单方法。
  • 在上面的帖子中添加了另一个想法(两个套接字)。
  • 很遗憾这两个进程需要同步。
猜你喜欢
  • 1970-01-01
  • 2023-03-17
  • 2020-08-03
  • 2011-09-16
  • 2021-04-05
  • 2016-02-28
  • 2014-02-28
  • 2010-10-02
  • 2020-03-14
相关资源
最近更新 更多