TCP Half-Open Connections

· Funktionen

Sobald die Verbindung hergestellt ist, werden keine Pakete über das Netz gesendet, wenn kein Peer Daten überträgt. TCP ist ein passives Protokoll und geht davon aus, dass die Verbindung aktiv ist.

Gründe für Verbindungsabbrüche

Halb offene Verbindungsabbrüche erkennen 

Du kannst versuchen, Verbindungsabbrüche mit den folgenden Methoden zu erkennen 

Zweite Verbindung

Du kannst versuchen, eine zweite Verbindung zu öffnen, aber das hat einige Nachteile: Du verbrauchst mehr Ressourcen, legst neue Threads an... und wenn der andere Peer neu gestartet wurde, funktioniert die zweite Verbindung, aber die erste nicht.

Anderen Peer pingen

Versuchst du, einen Ping oder eine beliebige Nachricht über eine halb offene Verbindung zu senden, siehst du, dass kein Fehler auftritt.

KeepAlive auf TCP-Socket-Ebene aktivieren

Ein TCP-Keep-Alive-Paket ist einfach ein ACK mit einer Sequenznummer, die um eins kleiner ist als die aktuelle Sequenznummer der Verbindung. Ein Host, der so ein ACK empfängt, antwortet mit einem ACK für die aktuelle Sequenznummer. Keep-Alives können verwendet werden, um zu überprüfen, ob der Rechner am Remote-Ende einer Verbindung noch verfügbar ist. TCP-Keep-Alives können alle TCPKeepAlive.Time gesendet werden (Standard: 7.200.000 Millisekunden bzw. zwei Stunden), wenn keine anderen Daten oder Keep-Alives höherer Ebenen über die TCP-Verbindung gelaufen sind. Gibt es keine Antwort auf ein Keep-Alive, wird es einmal alle TCPKeepAlive.Interval-Sekunden wiederholt. KeepAliveInterval steht standardmäßig auf 1000 Millisekunden.

Du kannst KeepAlive pro Verbindung aktivieren und das TCP-Protokoll prüfen lassen, ob die Verbindung aktiv ist oder nicht. Das ist die bevorzugte Methode, wenn du abgebrochene Verbindungen erkennen willst (zum Beispiel beim Abziehen eines Netzwerkkabels). Ab sgcWebSockets 4.3.7 kannst du die Eigenschaft TCPKeepAlive aktivieren, um solche halb offenen Verbindungen zu erkennen.

oClient := TsgcWebSocketClient.Create(nil);
oClient.TCPKeepAlive.Enabled := True;
oClient.TCPKeepAlive.Time := 3000;
oClient.TCPKeepAlive.Interval := 1000;