Muss ich einen Herzschlag ausführen, um eine TCP-Verbindung offen zu halten?

94

Ich habe zwei Komponenten, die über TCP / IP kommunizieren. Komponente A fungiert als Server / Listener und Komponente B ist der Client. Die beiden sollten so schnell wie möglich kommunizieren. Es kann immer nur eine Verbindung geben (obwohl dies abgesehen von dieser Frage ist). Ein leitender Entwickler in meinem Unternehmen hat erklärt, dass ich Herzschläge auf Anwendungsebene zwischen den beiden Komponenten verwenden muss, um sicherzustellen, dass die Verbindung offen bleibt.

Ich dachte, die Verbindung mit TCP / IP bleibt offen, aber ich habe eine Reihe von Blogs / Websites gelesen, die besagen, dass es ziemlich üblich ist, zwischen diesen Anwendungen zu schlagen.

Ich kenne einen Teil des Grundes, warum Komponente A Heartbeat-Komponente B ist, damit sie den Support informieren kann, wenn Kommunikationsprobleme mit Komponente B auftreten (entweder ist die Verbindung unterbrochen oder Komponente B läuft nicht). Werden Herzschläge aus einem anderen Grund benötigt? Um sicherzustellen, dass häufig etwas "im Rohr" ist, um es offen zu halten?

Komponente A schlägt derzeit alle 20 Sekunden einen Herzschlag auf Komponente B und schließt die Verbindung, wenn innerhalb von 120 Sekunden nichts von Komponente B zurück empfangen wird. Anschließend wird das Abhören von Verbindungen unter der Annahme fortgesetzt, dass Komponente B regelmäßig versucht, eine erneute Verbindung herzustellen, wenn die Verbindung unterbrochen wird. Dies funktioniert erfolgreich.

Um meine Frage zu wiederholen: Sind Herzschläge erforderlich, um eine TCP / IP-Verbindung aufrechtzuerhalten?

Rob Gray
quelle
1
Könnte dieses Verhalten auch implementierungsabhängig sein? Ist dies im TCP-Standard festgelegt oder wird es als Implementierungsdetail belassen? Hoffentlich kann das auch jemand anderes beantworten.
dss539
1
Es ist ein Implementierungsdetail, das ich sagen würde, da nicht alle TCP / IP-basierten Protokolle so implementiert werden, dass es ganz Ihnen überlassen bleibt.
Lloyd
5
Ja - nicht wegen TCP / IP - aber aufgrund anderer Hardware oder Software kann Ihre Verbindung durchlaufen werden, wie z. B. Firewalls und Heimrouter
Siehe

Antworten:

54

Die Verbindung sollte trotzdem offen bleiben, aber es ist häufig üblich, dass Protokolle einen Heartbeat implementieren, um tote Verbindungen zu erkennen, z. B. IRC mit dem PING- Befehl.

Lloyd
quelle
34
Ein weiterer häufiger Grund für Keepalives ist, die Verbindung über natürliche Gateways offen zu halten. Während TCP selbst keine Keepalives benötigt, um zu funktionieren, ist es üblich, dass Nat-Gateways eine TCP-Verbindung nach einer bestimmten Zeitüberschreitung "trennen".
Nr.
4
Was ist eine normale Zeitüberschreitung? Sekunden, Minuten, Stunden?
MiniGod
@Lloyd Ich "denke" MiniGod meinte: "Wie lange würde eine normale Auszeit dauern ?" (Die Antwort in Sekunden, Minuten, Stunden, ...)
Jeromej
@ JeromeJ Wer weiß, es ist ein paar Jahre her;)
Lloyd
Wenn Ihre Verbindung über einen Proxy hergestellt wird, können Sie auch erwarten, dass Ihre Verbindung unterbrochen wird, wenn sie als veraltet eingestuft wird. Ich denke nicht, dass Keep Alive in diesem Fall helfen würde, da sich dieser Aspekt von TCP nicht auf die Anwendung ausbreitet.
Ghita
49

Wie viele andere angemerkt haben, bleibt die TCP-Verbindung bestehen, wenn sie ihren eigenen Geräten überlassen wird. Wenn sich jedoch ein Gerät in der Mitte der Verbindung befindet, das seinen Status verfolgt (z. B. eine Firewall), benötigen Sie möglicherweise Keepalives, damit der Eintrag in der Statustabelle nicht abläuft.

Gerald Combs
quelle
Die TCP-Verbindung wird für immer lebendig sagen?
user7817808
22

Wenn Ihre Komponenten:

  • sind in einem herkömmlichen kabelgebundenen Netzwerk
  • Es gibt keine Firewalls oder NAT-Router zwischen ihnen
  • keiner von ihnen stürzt ab

dann brauchen Sie keinen Herzschlag.

Wenn eine dieser Annahmen falsch ist (ich sehe Sie an, GPRS!), Wird ein Herzschlag ziemlich schnell notwendig.

Eero Aaltonen
quelle
1
Dies ist jedoch im Allgemeinen eine Vernetzung. Betrachten Sie die Irrtümer von Peter Deutsch beim verteilten Rechnen. Wir wissen, dass Netzwerke von Natur aus unzuverlässig sind und daher als fast sicherer Fehlerpunkt in Ihrer Anwendung behandelt werden sollten. In diesem Zusammenhang, ob herkömmliches kabelgebundenes Netzwerk oder nicht, gehen Sie davon aus, dass irgendwann ein Fehler auftritt, und entwerfen Sie Ihre Anwendung so, dass sie dieses Szenario bewältigt.
Steven Bakhtiari
11

Sie müssen selbst keinen Herzschlag senden. Die TCP-Verbindung bleibt unabhängig von der Verwendung geöffnet.

Beachten Sie, dass TCP einen optionalen Keepalive- Mechanismus implementiert , mit dem eine geschlossene Verbindung rechtzeitig identifiziert werden kann, anstatt dass Sie Daten zu einem späteren Zeitpunkt senden müssen und erst dann feststellen müssen, dass die Verbindung geschlossen ist.

Brian Agnew
quelle
1
Wie soll man unter Linux arbeiten? funktioniert es tatsächlich? Kann ich das Timeout auf weniger als 2 Stunden festlegen? zum Beispiel 30 Sekunden?
Itay Levin
Damit dies funktioniert, muss die Anwendung Keepalive unterstützen. Es reicht nicht aus, es nur unter Linux zu aktivieren.
Mike Vella
9

Wenn Sie Windows verwenden, seien Sie vorsichtig mit dem TCP Keep-Alive. Standardmäßig ist es deaktiviert, es sei denn, Sie aktivieren es entweder global mit der Windows-Registrierung oder über setsockopt.

Das Standard-Keep-Alive-Intervall beträgt 2 Stunden.

http://msdn.microsoft.com/en-us/library/ms819735.aspx

Möglicherweise müssen Sie Ihren eigenen Herzschlag implementieren und TCP Keep-Alive unter Windows deaktivieren, wenn die 2-stündige Keep-Alive-Funktion nicht wünschenswert ist.

Andrew Keith
quelle
3

Sind Herzschläge erforderlich, um eine TCP / IP-Verbindung aufrechtzuerhalten?

Sie sind nützlich, um zu erkennen, wann eine Verbindung unterbrochen wurde.

ChrisW
quelle
3

TCP hält die Verbindung aufrecht. Die Anwendungs-Heartbeats dienen Überlegungen zur Anwendungsebene wie Failover, Lastausgleich oder Benachrichtigung von Administratoren über potenzielle Probleme.

Ente
quelle
3

Der Herzschlag ist eine gute Möglichkeit, dem Server mitzuteilen, dass Sie am Leben sind. Ich meine, wenn der Server DoS-Angriffspräventionssysteme verwendet, kann er (der Server) alle zugewiesenen Ressourcen für diese bestimmte Verbindung entfernen, nachdem er erkannt wurde Inaktivität für einen bestimmten Zeitraum.
Sie haben kein Mandat, Herzschlagmechanismen zu implementieren.

Aber es ist gut, wenn Sie eine Anwendung entwerfen, bei der das Hauptkriterium die Reaktionsfähigkeit ist. Sie möchten keine Zeit mit Verbindungsaufbauten, DNS-Suchvorgängen und Pfaderkennungen verschwenden. Halten Sie einfach die ganze Zeit eine Verbindung aufrecht, senden Sie weiterhin Herzschläge, und die Anwendung weiß, dass die Verbindung aktiv ist und kein Verbindungsaufbau erforderlich ist. Einfach senden und empfangen.

Vivek Sharma
quelle
2

TCP / IP als Protokoll wird als nicht geschlossen angegeben, bis Sie ein geschlossenes Paket senden. Ich hatte Steckdosen offen, auch nach fleckigen WLAN- oder Internetverbindungen.

Dies alles hängt jedoch stark von den Implementierungen ab. Höchstwahrscheinlich tritt ein "Timeout" auf, dh die maximale Wartezeit auf eine Antwort, bevor die Verbindung als "tot" eingestuft wird. Manchmal basiert dies auf der Anwendung selbst, manchmal auf NAT-Routern.

Daher würde ich Ihnen wärmstens empfehlen, einen "Herzschlag" zu halten, um schlechte Verbindungen zu erkennen und offen zu halten.

Unbekannt
quelle
2

Grundsätzlich erstellt eine TCP-Verbindung Verbindungsstatus, die in Switches entlang der Route gespeichert sind. Um unterbrochene Verbindungen zu erkennen (z. B. wenn ein Gegenstück abstürzt (ohne eine ordnungsgemäße Trennung zu senden)), müssen diese Zustände nach einer gewissen Zeit der Inaktivität entfernt werden. In diesem Fall wurde Ihre TCP-Verbindung geschlossen. Obwohl ich nicht genau sagen kann, wie lange diese Zeitüberschreitungen dauern, scheinen sie von den Geräteherstellern und / oder von Internetanbietern abzuhängen. Ich erinnere mich, dass meine inaktiven SSH-Terminalsitzungen von meinem früheren 1 & 1-Internetprovider schnell (weniger als 15 Minuten Leerlaufzeit) geschlossen wurden, während sie bei Verwendung einer von Kabel-BW bereitgestellten Verbindung mehrere Stunden lang geöffnet blieben ...

Abschließend schließe ich mit meinen Vorrednern: Ein Herzschlag ist ein guter Weg, um festzustellen, ob eine Verbindung noch besteht und funktioniert ...

Maifeiertag
quelle
1

Was Sie als Herzschlag bezeichnen, ist nützlich, wenn Sie versuchen, Zeitüberschreitungen festzulegen. Ihre Steckdose scheint offen zu sein, aber die Person am anderen Ende leidet möglicherweise an einem BSOD. Eine der einfachsten Möglichkeiten, nicht mehr funktionierende Clients / Server zu erkennen, besteht darin, ein Zeitlimit festzulegen und sicherzustellen, dass von Zeit zu Zeit eine Nachricht empfangen wird.

Einige Leute nennen sie NOOPs (No Ops).

Aber nein, sie sind nicht notwendig, um die Verbindung aufrechtzuerhalten, sondern nur hilfreich, um den Status zu kennen.

Kekoa
quelle
1

Ich würde sagen, wenn Sie keinen Herzschlag haben, spielt es keine Rolle, ob Ihre TCP / IP-Verbindung offen ist oder nicht.

D. Patrick
quelle
1

Herzschlag ist keine Notwendigkeit für TCP-Protokolle. Die Implementierung dient dazu, festzustellen, ob die andere Seite die Verbindung auf nicht standardmäßige Weise beendet hat (dh den Abrissprozess nicht durchlaufen hat).

Dunkler Stern1
quelle
0

Die Verbindung bleibt offen - es ist nicht erforderlich, einen Heartbeat zu implementieren, und die meisten Anwendungen, die Sockets verwenden, tun dies nicht.


quelle
-2

Viele Protokolle implementieren einen Herzschlag oder einen Gesundheitszustand, wie Lloyd sagte. Nur damit Sie wissen, dass die Verbindung noch offen ist und Sie möglicherweise etwas verpasst haben

ist_lion
quelle