您的位置:首页 > Web前端 > Node.js

TCP_NODELAY 和 TCP_NOPUSH

2019-06-14 16:50 316 查看

参考: https://www.geek-share.com/detail/2700811341.html

tcp DELAY算法,记得说是当tcp传输小于mss的包时不会立即发生,会缓冲一段时间,当之前发生的包被ack后才继续发生缓冲中的小包。
从模块指令的解释中带出来几个问题:

(1)tcp_nodelay的功能是什么?为什么只有在长连接的时候才启用?Only included in keep-alive connections.

(2)tcp_nopush在unix上影响TCP_NOPUSH,在linux上影响TCP_CORK,但估计这只是不同系统上的命名区别,但作用是什么?为什么只在sendfile中才启用?This option is only available when using sendfile.

一、tcp_nodelay的功能是什么

Nagle和DelayedAcknowledgment的延迟问题

在网络拥塞控制领域,我们知道有一个非常有名的算法叫做Nagle算法(Nagle algorithm),这是使用它的发明人John Nagle的名字来命名的,John Nagle在1984年首次用这个算法来尝试解决福特汽车公司的网络拥塞问题(RFC 896),该问题的具体描述是:如果我们的应用程序一次产生1个字节的数据,而这个1个字节数据又以网络数据包的形式发送到远端服务器,那么就很容易导致网络由于太多的数据包而过载。比如,当用户使用Telnet连接到远程服务器时,每一次击键操作就会产生1个字节数据,进而发送出去一个数据包,所以,在典型情况下,传送一个只拥有1个字节有效数据的数据包,却要发费40个字节长包头(即ip头20字节+tcp头20字节)的额外开销,这种有效载荷(payload)利用率极其低下的情况被统称之为愚蠢窗口症候群(Silly Window Syndrome)。可以看到,这种情况对于轻负载的网络来说,可能还可以接受,但是对于重负载的网络而言,就极有可能承载不了而轻易的发生拥塞瘫痪。

通俗来说
Nagle:
假如需要频繁的发送一些小包数据,比如说1个字节,以IPv4为例的话,则每个包都要附带40字节的头,也就是说,总计41个字节的数据里,其中只有1个字节是我们需要的数据。
为了解决这个问题,出现了Nagle算法。它规定:如果包的大小满足MSS,那么可以立即发送,否则数据会被放到缓冲区,等到已经发送的包被确认了之后才能继续发送。
通过这样的规定,可以降低网络里小包的数量,从而提升网络性能。
再看看DelayedAcknowledgment:

假如需要单独确认每一个包的话,那么网络中将会充斥着无数的ACK,从而降低了网络性能。

为了解决这个问题,DelayedAcknowledgment规定:不再针对单个包发送ACK,而是一次确认两个包,或者在发送响应数据的同时捎带着发送ACK,又或者触发超时时间后再发送ACK。

通过这样的规定,可以降低网络里ACK的数量,从而提升网络性能。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: