根据这篇Socket FAQ文章,Nagle的算法是众多算法中的一种,它可以使一堆数据驻留在TCP缓冲区而不会触及线路.Nagle算法的延迟可达200ms.
出于某种原因,Nagle的算法可以完全关闭,但不能只刷一次.这对我来说真是令人费解.为什么没有办法说"只是这一次,不要等待更多的数据.就好像Nagle的200ms一样."
这不是完美的意义,并且在没有Nagle,Nagle和从头开始实现自己的协议之间取得良好的平衡吗?
好问题。我想没有人真正需要它或者他们回避它。如果我没记错的话,启用会TCP_NODELAY立即推送数据。然后你可以禁用它。
当然,这是以两次系统调用“刷新”的高昂成本为代价的。你可以做什么:send(2),在 Unix 实现上有一个flags参数。您可以实现自己的标志,例如:(MSG_JUSTPUSHIT好吧,也许是另一个名称)并在tcp_output.