在套接字生存期间,我应该设置TCP_QUICKACK选项吗?

时间:2017-10-05 13:41:18

标签: c linux sockets tcp

我知道为什么要使用它,但我不知道在我的套接字代码中将setsockopt放在哪里。

我很清楚它可以通过socket api的内部机制进行修改,但是我应该在什么时候用setsockopt设置TCP_QUICKACK选项?

我应该在套接字创建时设置它,然后在每次接收和发送之后(或之前?)?或者只收到?

我应该检查该选项是否已设置?

1 个答案:

答案 0 :(得分:2)

  

我应该何时设置TCP_QUICKACK选项?

IETF提供TCP Tuning for HTTP, draft-stenberg-httpbis-tcp-03。该文件的第4.4节解释了:

  

延迟ACK [RFC1122]是大多数TCP堆栈中启用的机制   导致堆栈延迟发送确认包作为响应   数据。 ACK被延迟到某个阈值,或直到   对等体有一些数据要发送,在这种情况下,ACK将被发送   以及那些数据。取决于流量和TCP堆栈   这个延迟可能长达500毫秒。

     

这与启用了Nagle算法的同伴交互不佳。   因为Nagle的算法延迟发送直到任何一个MSS的数据   提供,直到收到所有已发送数据的ACK,延迟   ACK可以强制Nagle的算法在没有的情况下缓冲数据包   需要(也就是说,当其他同伴已经处理过   优秀数据)。

     

延迟ACK在合理的情况下非常有用   假设数据包几乎立即(在500ms内)导致   要在另一个方向发送的数据。一般在HTTP / 1.1中   和HTTP / 2这不太可能:因此,禁用延迟ACK可以   提供延迟的改进。

     

然而,TLS握手是这种情况的明显例外。为了   TLS握手的持续时间可能很有用   启用延迟ACK。

     

此外,对于可以保证响应的低延迟服务器   在长时间运行的连接(例如HTTP / 2)上500ms内的请求,   当请求足够小以适应小包时,   保留启用延迟的ACK可能会带来轻微的性能优势。

     

有效使用关闭延迟的ACK需要广泛的   纹

稍后在文档中提供以下内容:

  

在最近的Linux内核上(自Linux 2.4.4起),延迟ACK可以   像这样禁用:

int one = 1;
setsockopt(fd, IPPROTO_TCP, TCP_QUICKACK, &one, sizeof(one));
     

与禁用Nagle算法不同,在Linux上禁用延迟ACK是   不是一次性操作:TCP堆栈内的处理可能导致   延迟ACK重新启用。因此,使用TCP_QUICKACK   有效地需要在设置和取消设置套接字选项期间   连接的生命