Keep-Alive-Optionen funktionieren unter Linux für eine ausgehende Verbindung nicht

8

Weiß jemand, ob Linux Keep-Alive-Socket-Optionen für eine ausgehende Verbindung unterstützt?

Ich habe eine ausgehende Verbindung mit Keep-Alive-Optionen hergestellt, aber netstat --timers zeigt an (ich gehe davon aus, dass die Timer ausgeschaltet sind):

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

Eingehende Verbindungen mit denselben Socket-Optionen werden angezeigt:

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

Ich wünschte, ich könnte Socket-Optionen sehen, aber weder ss noch lsof zeigen sie mir.

James Hartig
quelle

Antworten:

7

Zuerst müssen Sie sicherstellen, dass TCP Keepalive auf Ihrem System aktiviert ist. Sie können die Standardeinstellungen folgendermaßen überprüfen:

# 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

Stellen Sie dann sicher, dass Sie es in Ihrem Code richtig einstellen. Es sollte ungefähr so ​​aussehen:

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

Wenn ich auf meinem System den obigen Code verwende, um SO_KEEPALIVE auf beiden Seiten festzulegen, sehe ich:

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)

Und dann habe ich mit Wireshark überprüft, ob das Keepalive NOPgesendet wurde.

Weitere Details finden Sie im TCP Keepalive HOWTO .

aculich
quelle
Vielen Dank für die Info, aber ich hatte diese bereits eingestellt und stelle sie genauso ein wie Sie. Ich setze Keepalive in netstat einfach nicht.
James Hartig
1
In diesem Fall veröffentlichen Sie weitere Informationen zu Ihrem System und dem Quellcode (oder einem vereinfachten Testfall), damit ich versuchen kann, das Problem zu reproduzieren. Andernfalls gibt es hier nicht viel zu tun, um Fehler zu beheben.
Aculich
@aculich ist richtig, wenn Sie Keepalive im System eingestellt haben, ist es Ihre Anwendung, die es nicht richtig verwendet. Ich empfehle, das von aculich vorgeschlagene TCP Keepalive HOWTO zu lesen oder den Quellcode der Anwendung zu veröffentlichen oder entweder einen lsof auszuführen, um zu sehen, was passiert
am
0

client-sysctl-Einstellung:

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 halten 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

aber keine Paketerfassung , was bedeutet, dass tcp_keepalive_time nicht funktioniert

user393527
quelle