TCP kann auch einen Alive-Check.
Dieses kann für folgendes nützlich sein:
Da nicht alle Applikationen diesen Mechanismus brauchen können, ist die spezifische Einstellung via setsockopt(2) sinnvoll.
Insbesondere langlebige Verbindungen mit niedriegen oder sporadischen Daten
für Überwachungen
können diesen Mechanismus nutzen.
Zu beachten ist, dass zusätzlicher Netzverkehr erzeugt wird.
./bischlauch -keepalive 2000Client:
./bischlauch -keepalive jolkipalki 2000Folgende Parameter sind voreingestellt:
SO_KEEPALIVE | OFF |
TCP_KEEPCNT | 9 |
TCP_KEEPIDLE | 7200 s |
TCP_KEEPINTVL | 75 s |
Wenn nur das SO_KEEPALIVE auf ON gesetzt wird, dauert es ca. 2 Stunden, bis der Socket als tot erkannt wird.
Folgende Werte führen zu einem schnellen erkennen einer abgerissenen Verbindung:
SO_KEEPALIVE | ON |
TCP_KEEPCNT | 5 |
TCP_KEEPIDLE | 2 s |
TCP_KEEPINTVL | 1 s |
Selbst wenn keine Nutzdaten transportiert werden, geht folgendes über die Leitung:
# tcpdump -i lo -n tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on lo, link-type EN10MB (Ethernet), capture size 96 bytes 14:40:13.184098 IP 127.0.0.2.51668 > 127.0.0.2.2000: Flags [.], ack 1123649520, win 1025, options [nop,nop,TS val 1756546 ecr 1756046], length 0 14:40:13.184128 IP 127.0.0.2.2000 > 127.0.0.2.51668: Flags [.], ack 1, win 1024, options [nop,nop,TS val 1756546 ecr 1756046], length 0 14:40:13.184140 IP 127.0.0.2.2000 > 127.0.0.2.51668: Flags [.], ack 1, win 1024, options [nop,nop,TS val 1756546 ecr 1756046], length 0
Ein Verbindungsabriss kann z.B. durch herausziehen eines Netzwerksteckes oder ganz einfach über das Abschalten des Netzinterface, hier das lokale lo, erreicht werden:
# ifconfig lo downDann liefert das select(2) bzw. das read(2) auf dem socket ein -1 mit errno= ETIMEDOUT (Connection timed out).