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

时间:2012-07-29 17:09:58

标签: linux node.js networking tcp tcpdump

我有一个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列是数据包之间经过的时间。

Link to bigger picture.

enter image description here

1 个答案:

答案 0 :(得分:4)

此行为是RFC1122 TCP stack的延迟确认功能。

通常您应该将TCP_QUICKACK选项添加到Linux TCP socketdisable delayed ACK,但我认为使用JavaScript Node.js API并不明显(我只看到了socket.setNoDelay TCP_NODELAY选项)。

所以你应用system-wide change on TCP stack的想法似乎很好,但我发现没有sysctl匹配此套接字选项行为。这是另一个full list with explanation