Up TCP

Keep Alive bei TCP

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.

Links und Literatur

http://tldp.org/HOWTO/html_single/TCP-Keepalive-HOWTO/
tcp(7)
Beschreibung bei Microsoft MSDN

Test mit bischlauch

Server:
./bischlauch -keepalive 2000
Client:
./bischlauch -keepalive jolkipalki 2000
Folgende 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 down
Dann liefert das select(2) bzw. das read(2) auf dem socket ein -1 mit errno= ETIMEDOUT (Connection timed out).
Rudolf Weber Informatik- und Netzwerkverein Ravensburg e.V