Опции поддержки активности не работают в Linux для исходящего соединения

8

Кто-нибудь знает, поддерживает ли Linux опции поддержки активности на исходящем соединении?

Я установил исходящее соединение с опциями keep-alive, но netstat --timers показывает (я предполагаю, что таймеры выключены):

tcp 0 0 localhost.localdomain:44307 172.16.0.15:2717 ESTABLISHED off (0.00/0/0)

Входящие соединения с такими же параметрами сокетов показывают:

tcp 0 0 172.16.0.3:8585 localhost.localdomain:21527 ESTABLISHED keepalive (29.26/0/0)

Хотелось бы увидеть опции сокетов, но ни ss, ни lsof не покажут их мне.

Джеймс Хартиг
источник

Ответы:

7

Прежде всего вам необходимо убедиться, что в вашей системе включена поддержка активности TCP. Вы можете проверить настройки по умолчанию, как это:

# sysctl net.ipv4.tcp_keepalive_time net.ipv4.tcp_keepalive_probes net.ipv4.tcp_keepalive_intvl
net.ipv4.tcp_keepalive_time = 7200
net.ipv4.tcp_keepalive_probes = 9
net.ipv4.tcp_keepalive_intvl = 75

Затем убедитесь, что вы правильно настроили его в своем коде. Это должно выглядеть примерно так:

int optval = 1;
if (setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, &optval, sizeof(optval)) < 0) {
    perror("setsockopt()");
    close(s);
    exit(EXIT_FAILURE);
}

В моей системе, когда я использую приведенный выше код для установки SO_KEEPALIVE с обеих сторон, я вижу:

tcp        0      0 127.0.0.1:48591         127.0.0.1:5555          ESTABLISHED keepalive (6958.37/0/0)
tcp        0      0 127.0.0.1:5555          127.0.0.1:48591         ESTABLISHED keepalive (6958.37/0/0)

А потом я проверил с помощью wireshark, что сообщения активности NOPотправлялись.

Более подробную информацию можно найти в TCP Keepalive HOWTO .

aculich
источник
Спасибо за информацию, но у меня уже были эти наборы, и я устанавливаю их точно так же, как вы, я просто не устанавливаю keepalive в netstat.
Джеймс Хартиг
1
В этом случае опубликуйте больше информации о вашей системе и исходном коде (или упрощенном тестовом примере), чтобы я мог попытаться воспроизвести проблему, в противном случае здесь не так много места для отладки.
aculich
@aculich прав, если вы установили keepalive в системе, это ваше приложение не использует его должным образом. Я советую прочитать TCP Keepalive HOWTO, как предложено aculich, или опубликовать исходный код приложения, или либо попытаться выполнить lsof, чтобы посмотреть, что произойдет
tmow
0

клиент-Sysctl устанавливающее:

sudo /sbin/sysctl -a|grep keep
net.ipv4.tcp_keepalive_time = 20
net.ipv4.tcp_keepalive_probes = 1
net.ipv4.tcp_keepalive_intvl = 1

клиент хранит tcpdump :

sudo /usr/sbin/tcpdump  -nn -vv -i bond0 tcp and host 10.201.126.72 and port 8001
tcpdump: listening on bond0, link-type EN10MB (Ethernet), capture size 65535 bytes

но не захват любого пакета, что означает, что tcp_keepalive_time не работает

user393527
источник