客户端向服务器发送延迟的FIN ACK(~500ms)

Ter*_*ska 10 linux networking tcp tcpdump node.js

我有一个node.js客户端(10.177.62.7)从服务器(10.177.0.1)请求来自http rest服务的一些数据.客户端只是使用node.js http.request()方法(agent = false).客户端在Ubuntu 11.10框上.

为什么客户端在475ms后发送FIN ACK?为何这么慢?他应该立即发送FIN ACK.我有很多这样的情况.大约1%的整个流量是带有延迟FIN ACK的请求.

客户端上的Cpu空闲大约是99%,所以没有什么能耗尽CPU.

如何调试?会是什么呢?我需要调整任何sysctl选项吗?

屏幕截图第2列是数据包之间经过的时间.

链接到更大的图片.

在此输入图像描述

Yve*_*tin 4

此行为是RFC1122 TCP 堆栈的延迟 ACK 功能。

TCP_QUICKACK通常,您应该向Linux TCP 套接字添加选项以禁用延迟 ACK,但我认为这对于 JavaScript Node.js API 来说并不明显(我只看到了socket.setNoDelay选项TCP_NODELAY)。

因此,您在 TCP 堆栈上应用系统范围的更改的想法似乎不错,但我发现没有sysctl匹配此套接字选项行为。这是另一个带有解释的完整列表