根据此套接字常见问题文章的说法,Nagle的算法是许多算法中的一种,它可以使一堆数据位于TCP缓冲区中,而不会碰到线路。Nagle算法的延迟可达200 up。
由于某些原因,Nagle的算法可以完全关闭,但不能只刷新一次。这真让我费解。为什么没有办法说:“就这一次,不要再等更多的数据了,就像Nagle的200 is已经用完了一样。”
这难道不是很有道理的,并且在没有名古屋、总是名古屋和从无到有地实现自己的协议之间达成了一个很好的平衡吗?
发布于 2011-07-17 21:31:24
问得好。我想没有人真正需要它或者他们绕过了它。如果我没记错的话,启用TCP_NODELAY会立即推送数据。那你就可以把它关掉了。
当然,这是以两个系统需要“同花顺”的高成本来实现的。您可以做什么: Unix实现上的send(2)有一个flags参数。您可以实现自己的标记,比如:MSG_JUSTPUSHIT (好的,也许是另一个名称),然后在tcp_output中考虑它。
发布于 2011-07-17 21:34:04
在性能敏感的应用程序中,Nagle的算法引入的延迟是一个问题,通常只需完全禁用Nagle算法并通过使用分散/收集IO (例如,writev()或在需要时在软件中实现缓冲)来模拟其批处理就更容易了。作为额外的奖励,这样做可以减少一些系统调用开销。
或者,您可以打开两个单独的套接字,并禁用其中之一的Nagling。请记住,在一个套接字上发送的数据不一定与另一个套接字同步。
https://stackoverflow.com/questions/6726832
复制相似问题