我知道为什么要使用它,但我不知道在我的套接字代码中将setsockopt放在哪里。
我很清楚它可以通过socket api的内部机制进行修改,但是我应该在什么时候用setsockopt设置TCP_QUICKACK选项?
我应该在套接字创建时设置它,然后在每次接收和发送之后(或之前?)?或者只收到?
我应该检查该选项是否已设置?
答案 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 有效地需要在设置和取消设置套接字选项期间 连接的生命。