什么时候应该使用TCP_NODELAY,什么时候应该使用TCP_CORK?


72

我知道他们两个都禁用了Nagle的算法。

我什么时候应该/不应该使用它们中的每一个?

Answers:


90

首先,不是所有人都禁用Nagle的算法。

Nagle的算法用于减少有线中更多的小型网络数据包。该算法是:如果数据小于限制(通常是MSS),请等到收到先前发送的数据包的ACK为止,同时累积用户的数据。然后发送累积的数据。

if [ data > MSS ]
    send(data)
else
    wait until ACK for previously sent data and accumulate data in send buffer (data)
    And after receiving the ACK send(data)

这将对telnet等应用程序有所帮​​助。但是,在发送流数据时等待ACK可能会增加延迟。另外,如果接收方实施“延迟的ACK策略”,则将导致暂时的死锁情况。在这种情况下,禁用Nagle算法是更好的选择。

因此,TCP_NODELAY用于禁用Nagle的算法。

TCP_CORK积极累积数据。如果套接字中启用了TCP_CORK,则在缓冲区填充到固定限制之前它不会发送数据。与Nagle的算法类似,它还会累积来自用户的数据,但是直到缓冲区填充到固定限制为止,直到接收到ACK。发送多个数据块时,这将很有用。但是在使用TCP_CORK时必须更加小心。

在2.6内核之前,这两个选项都是互斥的。但是在以后的内核中,它们可以一起存在。在这种情况下,将给予TCP_CORK更多的优先级。

参考:


6
请记住,侯赛因·加拉尔(Hussein Galal)的答案阐明了TCP_CORK在发送数据之前最多仅延迟200毫秒。
b4hand

1
“这将对诸如telnet的应用程序有所帮​​助。”?相反,这是正确的。如果您按下某个键,这将延迟将您的按键发送到另一侧,直到收到最后一次按键的ACK。这会导致按键和发送按键之间的高延迟,我不知道这是理想的情况。
梅基

27

TCP_NODELAY

用于禁用Nagle的算法以改善TCP / IP网络并通过等待接收到先前发送的数据的确认以发送累积的数据包来减少数据包的数量。

//从tcp(7)手册中:

TCP_CORK(或TCP_NOPUSH在FreeBSD中)

如果已设置,请不要发送局部帧。再次清除该选项时,将发送所有排队的部分帧。这对于在调用之前添加标题sendfile(2)或对吞吐量优化很有用。按照目前的执行方式,输出的时间为** 200毫秒上限** TCP_CORK如果达到此上限,则会自动传输排队的数据TCP_NODELAY从Linux 2.5.71开始,此选项只能与该选项组合使用。此选项不应在旨在可移植的代码中使用。


6
感谢您指出许多指南完全错误的地方,即TCP_CORK仅延迟200毫秒(最大),这从字面上看不会阻塞直到被移除。
Orwellophile 2015年

10

这是一种优化,因此就像任何优化一样:

  1. 不要使用它
  2. 等到性能成为问题后,再确定套接字延迟绝对是造成此问题的原因,并且测试证明这一定会解决此问题,这是解决问题的最简单方法。

基本上,目的是避免与sendfile()及其朋友发送多个可以使用单个帧的帧。

因此,例如,在Web服务器中,先发送标头,然后发送文件内容,这些标头将在内存中进行汇编,然后由内核直接发送文件。TCP_CORK允许您在单个帧中发送文件的头和文件的开头,即使使用TCP_NODELAY也是如此,否则将导致立即发送第一个块。


48
Nagle本身是一种优化,因此根据您的逻辑,应将其关闭,并仅在需要时才打开它:-)
camh 2010年

3
默认情况下,Nagle已启用,并且您无需编写任何代码即可启用它,因此无论如何都会发生。不,如果您正在编写自己的TCP堆栈,并且不需要实现Nagle,则不会这样做。
MarkR

7
如果从现在起的几年内发生这种情况,我不会感到惊讶(有人不再实施它了)。大约30或40年前的主要关注点是,人们在telnet上以大约每秒2个字符的速度打字会为每个字符生成一个数据包。如今,带宽越来越高,远程登录在流量方面的作用不大,并且几乎每个远程登录流量都应用了分组密码,这几乎不是问题。您无法使用128位块密码发送少于16个字节的内容(无论如何,如果要在另一端对其进行解码,则不会这样)。
戴蒙2013年

1
@camh我知道你在开玩笑,但是为了防御OP,禁用Nagle的行为有时是对延迟变量的优化。
Mateen Ulhaq

-1

TCP_CORK与TCP_NODELAY相反。前者强制数据包累积延迟;后者禁用它。


17
TCP_CORK与并非相反TCP_NODELAY。Nagle的算法在等待返回ACK的同时聚合数据,后者被禁用。前者根据缓冲压力汇总数据。
joshperry
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.