Nginx tcp_nopush

Nginx tcp_nopush配置

Nginx 中,当使用 sendfile 函数时,tcp_nopush 才起作用,它和指令 tcp_nodelay 是互斥的。

tcp_nopush配置详解

语法

tcp_nopush on | off

默认配置

tcp_nopush off

使用环境

http,server.location

原理

tcp_nopush 在 Linux 下是 tcp_cork, 是 linux 下 tcp/ip 传输的一个标准了,这个标准的大概的意思是,一般情况下,在 tcp 交互的过程中,当应用程序接收到数据包后马上传送出去,不等待,而 tcp_cork 选项是数据包不会马上传送出去,等到数据包最大时,一次性的传输出去,这样有助于解决网络堵塞,已经是默认了。

也就是说 tcp_nopush = on 会设置调用 tcp_cork 方法,这个也是默认的,结果就是数据包不会马上传送出去,等到数据包最大时,一次性的传输出去,这样有助于解决网络堵塞。

以快递投递举例说明一下,当快递东西时,快递员收到一个包裹,马上投递,这样保证了即时性,但是会耗费大量的人力物力,在网络上表现就是会引起网络堵塞,而当快递收到一个包裹,把包裹放到集散地,等一定数量后统一投递,这样就是 tcp_cork 的选项干的事情,这样的话,会最大化的利用网络资源,虽然有一点点延迟。

对于 nginx 配置文件中的 tcp_nopush,默认就是 tcp_nopush,不需要特别指定,这个选项对于 www,ftp 等大文件很有帮助。

tcp_nodelay配置详解

语法

tcp_nodelay on | off

默认配置

tcp_nodelay off

使用环境

http,server.location

原理

TCP_NODELAY 和 TCP_CORK 基本上控制了包的 “Nagle 化”,Nagle 化在这里的含义是采用 Nagle 算法把较小的包组装为更大的帧。 John Nagle 是 Nagle 算法的发明人,后者就是用他的名字来命名的,他在 1984 年首次用这种方法来尝试解决福特汽车公司的网络拥塞问题(欲了解详情请参看 IETF RFC 896)。他解决的问题就是所谓的silly window syndrome,中文称 “愚蠢窗口症候群”,具体含义是,因为普遍终端应用程序每产生一次击键操作就会发送一个包,而典型情况下一个包会拥有一个字节的数据载荷以及 40 个字节长的包头,于是产生 4000% 的过载,很轻易地就能令网络发生拥塞,。 Nagle 化后来成了一种标准并且立即在因特网上得以实现。它现在已经成为缺省配置了,但在我们看来,有些场合下把这一选项关掉也是合乎需要的。

现在让我们假设某个应用程序发出了一个请求,希望发送小块数据。我们可以选择立即发送数据或者等待产生更多的数据然后再一次发送两种策略。如果我们马上发送数据,那么交互性的以及客户/服务器型的应用程序将极大地受益。如果请求立即发出那么响应时间也会快一些。以上操作可以通过设置套接字的 TCP_NODELAY = on 选项来完成,这样就禁用了 Nagle 算法。

另外一种情况则需要我们等到数据量达到最大时才通过网络一次发送全部数据,这种数据传输方式有益于大量数据的通信性能,典型的应用就是文件服务器。应用 Nagle 算法在这种情况下就会产生问题。但是,如果你正在发送大量数据,你可以设置 TCP_CORK 选项禁用 Nagle 化,其方式正好同 TCP_NODELAY 相反(TCP_CORK 和 TCP_NODELAY 是互相排斥的)。