如果在套接字上的每个调用上都设置了TCP_QUICKACK设置,而之前已经设置了TCP_NODELAY,那么QUICKACK选项是否会覆盖NODELAY调用?
连接时:
int i = 1;
setsockopt( iSock, IPPROTO_TCP, TCP_NODELAY, (void *)&i, sizeof(i));
每次写入时:
int i = 1;
setsockopt( iSock, IPPROTO_TCP, TCP_QUICKACK, (void *)&i, sizeof(i));
对TCP_QUICKACK的调用是否会使上一次对TCP_NODELAY的调用为空?
4条答案
按热度按时间fbcarpbf1#
这两个选项之间没有直接的关系,它们只是出于不同的目的。
TCP_NODELAY旨在禁用/启用段缓冲,以便数据可以尽快发送到对等端,因此这通常用于提高网络利用率。TCP_QUICKACK用于在某些协议级别交换下尽早发送确认,而不是延迟,并且它不是稳定/永久的,后续TCP事务(可能发生在后台)可以忽略此选项,具体取决于实际的协议级别处理或用户设置和堆栈行为之间的任何实际分歧。
注意
TCP_NODELAY
可移植,而TCP_QUICKACK
不可移植(仅适用于Linux 2)。4.4+)。bvuwiixz2#
使用TCP_QUICKACK,而不是TCP_NODELAY
打开TCP_NODELAY也有类似的效果,但会降低小写入的吞吐量。如果你写一个循环,它只发送几个字节(最坏的情况下,一个字节)到一个套接字与“写()”,并与TCP_NODELAY禁用Nagle算法,每个写成为一个IP数据包。这将流量增加了40倍,每个有效载荷的IP和TCP报头。如果您有一个正在传输的数据包,Tinygram预防不会让您发送第二个数据包,除非您有足够的数据来填充最大大小的数据包。它在一个往返时间内累积字节,然后发送队列中的所有内容。这几乎总是你想要的。如果您设置了TCP_NODELAY,则需要更加注意缓冲和刷新问题。这些都不适用于批量单向传输,这是当今最常见的HTTP。(我从来没有研究过这对SSL握手的影响,因为这可能很重要。)简短版本:设置TCP_QUICKACK。如果你发现一个让事情变得更糟的案例,让我知道。约翰·内格尔
https://news.ycombinator.com/item?id=10608356
ecr0jaav3#
TCP_QUICKACK
和TCP_NODELAY
影响TCP中的不同操作。tcp(7)
手册页描述了TCP的哪些套接字选项会相互干扰,例如:例如TCP_CORK
和TCP_NODELAY
。cvxl0en24#
简短回答
详情
更多详情请参考this