Opzioni keep-alive che non funzionano su Linux per una connessione in uscita


8

Qualcuno sa se Linux supporta le opzioni socket keep-alive su una connessione in uscita?

Ho effettuato una connessione in uscita con le opzioni keep-alive ma netstat --timers si mette in mostra (suppongo che i timer siano disattivati):

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

Le connessioni in entrata con le stesse opzioni socket applicate mostrano:

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

Vorrei poter vedere le opzioni socket, ma né ss né lsof mi mostreranno.

Risposte:


7

Per prima cosa devi assicurarti che TCP keepalive sia abilitato sul tuo sistema. Puoi controllare le impostazioni predefinite in questo modo:

# 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

Quindi assicurati di impostarlo correttamente nel tuo codice. Dovrebbe assomigliare a qualcosa di simile a questo:

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

Sul mio sistema quando uso il codice sopra per impostare SO_KEEPALIVE su entrambi i lati vedo:

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 poi ho verificato con WireShark che il keepalive NOPveniva inviato.

Maggiori dettagli sono disponibili nel TCP Keepalive HOWTO .


Grazie per le informazioni, ma avevo già impostato quelle e le sto impostando esattamente come te, non sto impostando keepalive in netstat.
James Hartig,

1
In tal caso, pubblica ulteriori informazioni sul tuo sistema e sul codice sorgente (o un caso di test semplificato) in modo che io possa provare a riprodurre il problema, altrimenti non c'è molto da fare qui per il debug.
aculich,

@aculich ha ragione, se hai impostato keepalive nel sistema, è la tua applicazione che non lo usa correttamente. Consiglio di leggere il TCP Keepalive HOWTO come suggerito da Aculich o di pubblicare il codice sorgente dell'applicazione o di provare a eseguire un lsof per vedere cosa succede
tra il

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

client mantenere 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

ma nessuna acquisizione di pacchetti , significa che tcp_keepalive_time non funziona

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.