Клиент отправляет задержанный FIN ACK (~ 500 мс) на сервер

У меня есть клиент node.js(10.177.62.7), запрашивающий некоторые данные из службы http rest с сервера (10.177.0.1). Клиент просто использует метод node.js http.request() (agent = false). Клиент находится в поле Ubuntu 11.10.

Почему клиент отправляет FIN ACK после 475 мс? Почему так медленно? Он должен немедленно отправить FIN ACK. У меня много таких ситуаций. Около 1% всего трафика - запрос с задержкой FIN ACK.

Cpu idle на клиенте составляет около 99%, поэтому ничто не истощает процессор.

Как отладить это? Что бы это могло быть? Есть ли какой-либо параметр sysctl, который мне нужно настроить?

На снимке экрана второй столбец - прошедшее время между пакетами.

Ссылка на увеличенное изображение

enter image description here

Ответ 1

Это поведение Delayed ACK RFC1122 TCP stack.

Обычно вы должны добавить опцию TCP_QUICKACK в TCP-порт Linux для отключить задержку ACK, но я думаю, что это не очевидно с JavaScript Node.js API (я видел только socket.setNoDelay для опции TCP_NODELAY).

Итак, ваша идея применить общесистемное изменение в стеке TCP кажется хорошим, но я не нашел sysctl, соответствующего этому параметру сокета, Вот еще один полный список с объяснением.