TCP Nagle同花顺怎么了?

时间:2011-07-17 21:18:59

标签: tcp nagle

根据this Socket FAQ article,Nagle的算法是众多算法中的一种,它可以使一堆数据驻留在TCP缓冲区而不会触及线路。 Nagle算法的延迟可达200​​ms。

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

难道这不是很完美,并且在没有Nagle,Nagle和从头开始实施自己的协议之间取得良好的平衡吗?

2 个答案:

答案 0 :(得分:1)

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

当然,这是两次系统调用“冲洗”的高成本。您可以做什么:send(2),在Unix实现上有一个flags参数。您可以实现自己的标志,例如:MSG_JUSTPUSHIT(好吧,可能是其他名称)并在tcp_output中考虑它。

答案 1 :(得分:0)

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

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