web-dev-qa-db-de.com

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

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 zu jeder Zeit immer nur eine Verbindung geben (abgesehen von dieser Frage). Ein leitender Entwickler in meinem Unternehmen sagte, ich müsse Heartbeats auf Anwendungsebene zwischen den beiden Komponenten verwenden, um sicherzustellen, dass die Verbindung offen bleibt.

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

Ich kenne einen Teil des Grunds, warum Komponente A die Heartbeats-Komponente B ist, damit der Support benachrichtigt werden kann, wenn Kommunikationsprobleme mit Komponente B vorliegen (entweder ist die Verbindung unterbrochen oder Komponente B wird nicht ausgeführt). Werden Herzschläge aus einem anderen Grund benötigt? Zum Beispiel, um sicherzustellen, dass häufig etwas "in der Pipe" ist, um es offen zu halten?

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

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

90
Rob Gray

Die Verbindung sollte ungeachtet dessen offen bleiben, aber ja, es ist häufig zu beobachten, dass Protokolle einen Heartbeat implementieren, um tote Verbindungen zu erkennen, IRC zum Beispiel mit dem Befehl PING .

52
Lloyd

Wie viele andere angemerkt haben, bleibt die TCP - Verbindung auf ihren eigenen Geräten bestehen. 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.

47
Gerald Combs

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 zu haben.

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

21
Eero Aaltonen

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

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

10
Brian Agnew

Wenn Sie Windows verwenden, achten Sie auf die TCP Keepalive. Standardmäßig ist sie deaktiviert, es sei denn, Sie aktivieren sie 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 das 2-stündige Keep-Alive nicht erwünscht ist.

9
Andrew Keith

Der Herzschlag ist eine gute Möglichkeit, dem Server mitzuteilen, dass Sie am Leben sind. Wenn der Server DoS-Angriffsverhinderungssysteme verwendet, kann er (der Server) alle zugewiesenen Ressourcen für diese bestimmte Verbindung entfernen, nachdem er sie erkannt hat Inaktivität für einen bestimmten Zeitraum.
Sie haben kein Mandat, irgendwelche Heartbeat-Mechanismen zu implementieren.

Aber es ist gut, wenn Sie eine Anwendung entwerfen, bei der das Hauptkriterium die Reaktionsfähigkeit ist. Sie möchten keine Zeit für Verbindungsaufbau, DNS-Suche und Pfadermittlung verschwenden. Halten Sie einfach die ganze Zeit über eine Verbindung aufrecht, senden Sie weiterhin Heartbeats, und die Anwendung weiß, dass die Verbindung besteht und dass kein Verbindungsaufbau erforderlich ist. Einfach senden und empfangen.

3
Vivek Sharma

Sind Heartbeats erforderlich, um eine TCP/IP-Verbindung aufrechtzuerhalten?

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

3
ChrisW

Grundsätzlich erzeugt eine TCP Verbindung Verbindungszustände, die in Switches entlang der Route gespeichert sind. Um unterbrochene Verbindungen zu erkennen (wie wenn ein Gegenüber abstürzt (ohne eine ordnungsgemäße Trennung zu senden)), müssen diese Zustände entfernt werden nach einer Zeit der Inaktivität. Und wenn dies passiert, wurde Ihre TCP Verbindung geschlossen. Obwohl ich nicht genau sagen kann, wie lange diese Timeouts sind, scheinen sie von den Geräteherstellern und/oder abhängig zu sein Ich erinnere mich, dass meine inaktiven SSH-Terminalsitzungen von meinem früheren 1 & 1-Internetanbieter schnell geschlossen wurden (weniger als 15 Minuten inaktiv), während sie bei Verwendung einer von Kabel-BW bereitgestellten Verbindung mehrere Stunden offen blieben ...

Abschließend möchte ich mit meinen Vorrednern abschließen: Ein Herzschlag ist eine gute Methode, um festzustellen, ob eine Verbindung noch besteht und besteht ...

2
Mayday

TCP hält die Verbindung aufrecht. Die Anwendungsherzschläge beziehen sich auf Überlegungen auf Anwendungsebene wie Failover, Lastenausgleich oder das Benachrichtigen von Administratoren über potenzielle Probleme.

2
Duck

Heartbeat ist keine Notwendigkeit für TCP Protokolle. Die Implementierung dient dazu festzustellen, ob die andere Seite die Verbindung auf eine nicht standardmäßige Weise beendet hat (d. H. Den Abbauprozess nicht durchlaufen hat).

1
Dark Star1

TCP/IP als Protokoll wird so festgelegt, dass es erst geschlossen wird, wenn Sie ein Abschlusspaket senden. Ich hatte Steckdosen offen, auch nachdem ich eine fleckige WLAN- oder Internetverbindung hatte.

Dies ist jedoch alles sehr abhängig von Implementierungen. 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 Router.

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

1
Unknown

Was Sie als Heartbeat bezeichnen, ist nützlich, wenn Sie versuchen, Timeouts festzulegen. Ihre Steckdose scheint offen zu sein, aber die Person am anderen Ende leidet möglicherweise an einem BSOD. Eine der einfachsten Methoden zum Erkennen defekter Clients/Server besteht darin, ein Timeout festzulegen und sicherzustellen, dass von Zeit zu Zeit eine Nachricht empfangen wird.

Einige Leute nennen sie NOOPs (No Ops).

Aber nein, sie sind nicht erforderlich, um die Verbindung aufrechtzuerhalten. Sie sind nur hilfreich, um den Status zu ermitteln.

1
Kekoa

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

1
D. Patrick

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

0
anon