don*_*lmg 20 c sockets linux tcp
如果你在套接字上的每个调用上设置了TCP_QUICKACK设置,之前已经设置了TCP_NODELAY,那么QUICKACK选项是否会覆盖NODELAY调用?
在连接上:
int i = 1;
setsockopt( iSock, IPPROTO_TCP, TCP_NODELAY, (void *)&i, sizeof(i));
Run Code Online (Sandbox Code Playgroud)
每次写:
int i = 1;
setsockopt( iSock, IPPROTO_TCP, TCP_QUICKACK, (void *)&i, sizeof(i));
Run Code Online (Sandbox Code Playgroud)
对TCP_QUODACK的调用是否会使先前对TCP_NODELAY的调用无效?
Fei*_*Fei 24
这两个选项之间没有直接的关系,它们只是出于不同的目的.
TCP_NODELAY旨在禁用/启用段缓冲,以便尽快将数据发送到对等方,因此通常用于提高网络利用率.TCP_QUICKACK用于尽早发送确认而不是在某些协议级别交换下延迟,并且它不稳定/永久,后续TCP事务(可能发生在幕后)可以忽略此选项,具体取决于实际协议级别处理或任何实际用户设置和堆栈行为之间的分歧.
注意 TCP_NODELAY
是可移植的而TCP_QUICKACK
不是(仅适用于Linux 2.4.4+).
rof*_*rol 10
使用TCP_QUICKACK,而不是TCP_NODELAY
打开TCP_NODELAY具有类似的效果,但可以使小写入的吞吐量更差.如果你写一个循环只发送几个字节(最坏的情况,一个字节)到一个带有"write()"的套接字,并且使用TCP_NODELAY禁用Nagle算法,则每次写入变成一个IP数据包.这会将流量增加40倍,每个有效负载使用IP和TCP标头.如果您有一个正在运行的数据包,Tinygram预防将不允许您发送第二个数据包,除非您有足够的数据来填充最大尺寸的数据包.它累计一个往返时间的字节,然后发送队列中的所有内容.这几乎总是你想要的.如果设置了TCP_NODELAY,则需要更加了解缓冲和刷新问题.对于批量单向传输而言,这些都不重要,这在今天是大多数HTTP.(我从来没有看过这对SSL握手的影响,它可能很重要.)短版本:设置TCP_QUICKACK.如果您发现导致情况恶化的情况,请告诉我.约翰纳格尔
https://news.ycombinator.com/item?id=10608356
简短回答
\n细节
\n内格尔算法
\n延迟确认
\nNagle 算法和延迟 ACK 在 TCP/IP 网络中不能很好地协同工作
\n如果可以的话,延迟 ACK 会尝试为每个段发送更多数据。但 Nagle 算法的一部分依赖于 ACK 来发送数据。
\nNagle 的算法和延迟的 ACK 一起产生了一个问题,因为延迟的 ACK 正在等待发送 ACK,而 Nagle 的算法正在等待接收 ACK
\nclient: hi! Here\xe2\x80\x99s the first packet\nserver: <silence, waiting for the second packet, well I\xe2\x80\x99ll ack eventually>\nclient: <silence, well I\xe2\x80\x99m waiting for an ACK, maybe there\xe2\x80\x99s network congestion>\nserver: Ok I am bored. Here\xe2\x80\x99s an ack\nclient: Great, here\xe2\x80\x99s the second packet!\nserver: Sweet. we\xe2\x80\x99re done here\n
Run Code Online (Sandbox Code Playgroud)\n如何解决 Nagle 算法和延迟 ACK 引起的问题
\n欲了解更多详细信息,请参阅此
\n