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?
Antworten:
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.
quelle
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.
quelle
Wenn Ihre Komponenten:
dann brauchen Sie keinen Herzschlag.
Wenn eine dieser Annahmen falsch ist (ich sehe Sie an, GPRS!), Wird ein Herzschlag ziemlich schnell notwendig.
quelle
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.
quelle
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.
quelle
Sie sind nützlich, um zu erkennen, wann eine Verbindung unterbrochen wurde.
quelle
TCP hält die Verbindung aufrecht. Die Anwendungs-Heartbeats dienen Überlegungen zur Anwendungsebene wie Failover, Lastausgleich oder Benachrichtigung von Administratoren über potenzielle Probleme.
quelle
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.
quelle
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.
quelle
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 ...
quelle
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.
quelle
Ich würde sagen, wenn Sie keinen Herzschlag haben, spielt es keine Rolle, ob Ihre TCP / IP-Verbindung offen ist oder nicht.
quelle
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).
quelle
Die Verbindung bleibt offen - es ist nicht erforderlich, einen Heartbeat zu implementieren, und die meisten Anwendungen, die Sockets verwenden, tun dies nicht.
quelle
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
quelle