根据this Socket FAQ article,Nagle的算法是众多算法中的一种,它可以使一堆数据驻留在TCP缓冲区而不会触及线路。 Nagle算法的延迟可达200ms。
出于某种原因,Nagle的算法可以完全关闭 ,但不能只刷一次。这对我来说真是令人费解。为什么没有办法说“只是这一次,不要等待更多的数据。就好像Nagle的200ms一样。”
难道这不是很完美,并且在没有Nagle,Nagle和从头开始实施自己的协议之间取得良好的平衡吗?
答案 0 :(得分:1)
好问题。我想没有人真的需要它或他们绕过它。如果我没记错的话,启用TCP_NODELAY
会立即推送数据。然后你可以禁用它。
当然,这是两次系统调用“冲洗”的高成本。您可以做什么:send(2)
,在Unix实现上有一个flags
参数。您可以实现自己的标志,例如:MSG_JUSTPUSHIT
(好吧,可能是其他名称)并在tcp_output
中考虑它。
答案 1 :(得分:0)
在性能敏感的应用程序中,Nagle算法引入的延迟是一个问题,通常更容易完全禁用Nagle算法并使用分散/聚集IO(例如,writev()
模拟其在软件中的批处理,或者通过在需要的软件中实现缓冲。作为额外的奖励,这样做可以减少一些系统调用开销。
或者,您可以打开两个单独的套接字并在其中一个上禁用Nagling。请记住,在一个套接字上发送的数据不一定会与另一个套接字同步。