TCP implementiert immer Verbindungen mit Status. "Keepalive" benötigst für
TCP-Verbindungen nuraus einem Grund: um zwischen Server und Client vorhandenen Firewalls davon abzuhalten, die Verbindung nach Inaktivität zu löschen, während Server und/oder Client diese noch als "bestehend" ansehen.
Du erkennst einen Verbindungsverlust/abbau von Seiten des Clients auf Serverseite in zwei Fällen: erstens wenn der Client die Verbindung beendet und zweitens, wenn der Server was an den Client schickt und darauf kein ACK bekommt, bis der Retransmission Timer abgelaufen ist. Die Verbindungskontrolle erfolgt dabei auf Protokollebene.
Das Problem dabei ist, daß die Anti-DoS-Mechanismen von Firewalls restriktive Schranken für die Anzahl und Zeitdauer inaktiver Verbindungen haben (Hintergrund dafür ist, daß DDoS-Angriffe mit halboffenen Verbindungen geführt wurden) - was dazu führt, daß die Firewalls
TCP-Verbindungen ohne periodische Aktivität schon nach kurzer Zeit aus der Verbindungsliste schmeißen. Beispiel: Ich hatte mal einen Levelone Router, der aktive
FTP-Sitzung abgebrichen hat, wenn die Übertragung einer einzelnen Datei länger als 10 Minuten gedauert hat - das Ding hat
FTP-DATA offengelassen und
FTP-CONTROL geschlossen. Aufgefallen ist das erst am Ende der Übertragung, bei kleinen dateien ging alles.
Sauberer kannst Du das mit UDP oder auch mit ICMP implementieren, aber das erfordert, daß die Clients nicht hinter einer NAT-Firewall stecken.