【发布时间】:2011-04-15 05:55:15
【问题描述】:
我知道他们都禁用了 Nagle 的算法。
什么时候应该/不应该使用它们中的每一个?
【问题讨论】:
我知道他们都禁用了 Nagle 的算法。
什么时候应该/不应该使用它们中的每一个?
【问题讨论】:
这是一种优化,就像任何优化一样:
基本上,目的是避免发送多个可以使用单个帧的帧,使用 sendfile() 及其朋友。
因此,例如,在 Web 服务器中,您发送标头后跟文件内容,标头将在内存中组装,然后文件将直接由内核发送。 TCP_CORK 允许您在单个帧中发送文件头和文件的开头,即使使用 TCP_NODELAY,否则会导致第一个块立即发送出去。
【讨论】:
TCP_CORK 与 TCP_NODELAY 相反。前者强制数据包累积延迟;后者禁用它。
【讨论】:
TCP_CORK 不是 TCP_NODELAY 的反义词。 Nagle 的算法在等待返回 ACK 时聚合数据,后一个选项禁用该返回;前者根据缓冲压力聚合数据。
首先,并非两者都禁用了 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 将被优先考虑。
参考:
【讨论】:
TCP_NODELAY
用于禁用 Nagle 算法以改进 TCP/IP 网络并通过等待收到对先前发送数据的确认以发送累积的数据包来减少数据包的数量。
//来自tcp(7)手册:
TCP_CORK(或在 FreeBSD 中为 TCP_NOPUSH)
如果设置,则不发送部分帧。再次清除该选项时,将发送所有排队的部分帧。这对于在调用 sendfile(2) 之前添加标头或吞吐量优化很有用。正如目前实施的那样,有一个 ** 200 毫秒的上限** 输出被 TCP_CORK 塞住的时间。 如果达到此上限,则会自动传输排队的数据。仅从 Linux 2.5.71 起,此选项才能与 TCP_NODELAY 结合使用。此选项不应在旨在可移植的代码中使用。
【讨论】: