Кто-нибудь знает, поддерживает ли Linux параметры сокетов keep-alive при исходящем соединении?
Я установил исходящее соединение с опциями 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 мне их не покажут.
Сначала вам нужно убедиться, что TCP keepalive включен в вашей системе. Вы можете проверить настройки по умолчанию следующим образом:
# 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)
Затем я проверил с помощью wirehark, что keepalive NOP
был отправлен.
Более подробную информацию можно найти в TCP Keepalive HOWTO.
клиент-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 не работает