设置TCP_QUICKACK和TCP_NODELAY

ui7jx7zq  于 2023-04-29  发布在  其他
关注(0)|答案(4)|浏览(311)

如果在套接字上的每个调用上都设置了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的调用为空?

fbcarpbf

fbcarpbf1#

这两个选项之间没有直接的关系,它们只是出于不同的目的。

TCP_NODELAY旨在禁用/启用段缓冲,以便数据可以尽快发送到对等端,因此这通常用于提高网络利用率。TCP_QUICKACK用于在某些协议级别交换下尽早发送确认,而不是延迟,并且它不是稳定/永久的,后续TCP事务(可能发生在后台)可以忽略此选项,具体取决于实际的协议级别处理或用户设置和堆栈行为之间的任何实际分歧。
注意TCP_NODELAY可移植,而TCP_QUICKACK不可移植(仅适用于Linux 2)。4.4+)。

bvuwiixz

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

ecr0jaav

ecr0jaav3#

TCP_QUICKACKTCP_NODELAY影响TCP中的不同操作。tcp(7)手册页描述了TCP的哪些套接字选项会相互干扰,例如:例如TCP_CORKTCP_NODELAY

cvxl0en2

cvxl0en24#

简短回答

  • 要禁用Nagle的缓冲算法,请使用TCP_NODELAY套接字选项。
  • 要禁用延迟确认,请使用TCP_QUICKACK套接字选项。
    详情
  • 内格尔算法
  • Nagle的算法以其创建者John Nagle的名字命名,是一种通过减少网络上发送的小数据包数量来提高TCP效率的机制。
  • 目标是防止节点在应用程序向套接字传递数据相当慢的情况下传输许多小数据包。
  • 如果一个进程导致许多小数据包被传输,它可能会造成过度的网络拥塞。如果分组的有效载荷小于TCP报头数据,则尤其如此。
  • 延迟ACK
  • TCP延迟确认或延迟ACK是由TCP的一些实现方式使用的另一种技术,以努力改善网络性能并减少拥塞。
  • 发明延迟ACK是为了减少确认数据段所需的ACK数量,并减少协议开销。
  • 延迟ACK意味着TCP不会立即确认每个收到的TCP数据段。若干ACK响应可以组合在一起成为单个响应,从而减少协议开销。
  • Nagle算法和延迟ACK在TCP/IP网络中不能很好地配合
  • 如果可以,延迟ACK会尝试在每个数据段发送更多数据。但是Nagle的算法的一部分依赖于ACK来发送数据。
  • Nagle的算法和延迟ACK一起产生了一个问题,因为延迟ACK在等待发送ACK,而Nagle的算法在等待接收ACK
  • Sample
client: hi! Here’s the first packet
server: <silence, waiting for the second packet, well I’ll ack eventually>
client: <silence, well I’m waiting for an ACK, maybe there’s network congestion>
server: Ok I am bored. Here’s an ack
client: Great, here’s the second packet!
server: Sweet. we’re done here
  • 客户端这样做是因为Nagle的算法,而服务器是因为延迟的ACK。
  • 我如何解决由Nagle算法和延迟确认引起的问题
  • 启用TCP_NODELAY以通过服务器上的全局套接字选项禁用Nagle算法
  • 对代理服务器和负载均衡器进行配置文件调整:如果您运行的应用程序或环境有时只有高度交互的流量和聊天协议,这一点尤其重要。通过在负载均衡器级别动态切换Nagle算法和TCP_NODELAY,您甚至可以保持高度异构的流量混合以最佳方式运行。
  • 减少服务器和负载均衡器上的延迟确认计时器。有时,这种优化是在应用程序级别的软件中处理的,但如果不是这种情况,您仍然可以在服务器或负载均衡器级别动态管理ACK计时器。
  • 在进行这些更改时,请仔细观察网络流量,并查看每个调整对拥塞的影响。

更多详情请参考this

相关问题