Opções keep-alive não estão funcionando no Linux para uma conexão de saída

8

Alguém sabe se o Linux suporta opções de soquete de manutenção em uma conexão de saída?

Eu fiz uma conexão de saída com as opções keep-alive, mas netstat --timers mostra (suponho que os timers estejam desligados):

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

Conexões de entrada com as mesmas opções de socket aplicadas show:

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

Eu gostaria de poder ver as opções de socket, mas nem o ss nem o lsof me mostram.

    
por James Hartig 08.12.2011 / 22:06

2 respostas

7

Primeiro, você precisa ter certeza de que o TCP keepalive esteja ativado em seu sistema. Você pode verificar as configurações padrão assim:

# 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

Depois, verifique se você está configurando corretamente no seu código. Deve ser algo como isto:

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

No meu sistema, quando uso o código acima para definir SO_KEEPALIVE em ambos os lados, vejo:

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)

E então eu verifiquei com o wireshark que o keepalive NOP estava sendo enviado.

Mais detalhes podem ser encontrados no TCP Keepalive HOWTO .

    
por 11.12.2011 / 07:14
0

client-sysctl-setting:

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

cliente mantém 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

mas não qualquer captura de pacote, o que significa que tcp_keepalive_time não funciona

    
por 05.01.2017 / 09:09