2009-05-14 18 views
78

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 das neben dieser Frage steht). Ein leitender Entwickler in meiner Firma hat gesagt, dass ich Heartbeats auf Anwendungsebene zwischen den beiden Komponenten verwenden muss, um sicherzustellen, dass die Verbindung offen bleibt.Muss ich Heartbeat, um eine TCP-Verbindung offen zu halten?

Ich dachte, die Verbindung bleibt offen mit TCP/IP, aber ich habe eine Reihe von Blogs/Seiten gelesen, die sagen, es ist ziemlich Standard-Praxis zum Herzschlag zwischen diesen Anwendungen.

Ich kenne einen Teil der Grundkomponente Eine Heartbeats-Komponente B ist so, dass sie den Support informieren kann, wenn Kommunikationsprobleme mit Komponente B vorliegen (entweder der Link ist ausgefallen oder Komponente B läuft nicht). Sind Herzschläge aus irgendeinem anderen Grund nötig? Um sicher zu gehen, dass es oft etwas "in der Leitung" gibt, um es offen zu halten?

Die Komponente A tastet alle 20 Sekunden eine Komponente B ab und schließt die Verbindung, wenn in 120 Sekunden kein Signal von Komponente B empfangen wird. Anschließend wird wieder auf Verbindungen gewartet, unter der Annahme, dass Komponente B regelmäßig eine erneute Verbindung versucht, wenn die Verbindung unterbrochen wird. Dies funktioniert erfolgreich.

Um meine Frage zu wiederholen: Sind Heartbeats notwendig, um eine TCP/IP-Verbindung am Leben zu erhalten?

+1

Könnte dieses Verhalten auch implementierungsabhängig sein? Ist das im TCP-Standard spezifiziert oder bleibt es als Implementierungsdetail übrig? Hoffentlich kann auch jemand anderes darauf antworten. – dss539

+0

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

+3

Ja - nicht wegen TCP/IP - aber wegen anderer Hardware oder Software können Sie Verbindungen wie Firewalls und Home-Router durchführen, die dazu neigen, inaktive TCP-Verbindungen zu löschen, siehe: http://stackoverflow.com/questions/ 3907537/keep-alive-tcp-ip-connected-sockets-über-das-internet-wann-wie-und-wie-viel/5149662 # 5149662 – markmnl

Antwort

45

Die Verbindung sollte bleiben unabhängig offen, aber ja, es ist oft gängige Protokolle zu sehen, einen Herzschlag implementieren, um zum Beispiel zu helfen, zu erkennen tote Verbindungen, IRC mit dem PING Befehl.

+31

Ein weiterer häufiger Grund für Keepalives ist, die Verbindung durch Nat-Gateways offen zu halten. Während TCP selbst keine Keepalives benötigt, ist es üblich, dass Nat-Gateways nach einer bestimmten Zeitüberschreitung eine TCP-Verbindung "trennen". – nos

+2

Was ist ein normales Zeitlimit? Sekunden, Minuten, Stunden? – MiniGod

+2

Sekunden normalerweise. – Lloyd

1

Was Sie einen Herzschlag nennen, ist nützlich, wenn Sie Timeouts einstellen möchten. Ihr Socket kann offen erscheinen, aber die Person am anderen Ende kann einen BSOD leiden. Eine der einfachsten Möglichkeiten, um defekte Clients/Server zu finden, besteht darin, eine Zeitüberschreitung festzulegen und sicherzustellen, dass eine Nachricht immer wieder empfangen wird.

Manche Leute nennen sie NOOPs (No Ops).

Aber nein, sie sind nicht notwendig, um die Verbindung lebendig zu halten, nur hilfreich zu wissen, was der Status ist.

+1

Ich denke, FTP hat speziell einen NOOP-Befehl – Lloyd

0

Die Verbindung bleibt geöffnet - es muss kein Heartbeat implementiert werden, und die meisten Anwendungen, die Sockets verwenden, tun dies nicht.

3

Sind Heartbeats erforderlich, um eine TCP/IP-Verbindung am Leben zu erhalten?

Sie sind nützlich für die Erkennung, wenn eine Verbindung gestorben ist.

10

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

Beachten Sie, dass TCP einen optionalen keepalive Mechanismus implementiert, der verwendet werden kann, um eine geschlossene Verbindung rechtzeitig zu identifizieren, anstatt dass Sie Daten zu einem späteren Zeitpunkt senden müssen und erst dann die Verbindung geschlossen wird.

+0

Wie soll es unter Linux arbeiten? Funktioniert es tatsächlich? Kann ich das Timeout auf weniger als 2 Stunden festlegen? zum Beispiel 30 Sekunden? –

+0

Damit dies funktioniert, muss die Anwendung Keepalive unterstützen. Einfach nur unter Linux zu aktivieren wird nicht ausreichen. –

-2

Viele Protokolle implementieren einen Herzschlag oder einen Gesundheitszustand Typ der Sache wie Lloyd sagte. Nur damit Sie wissen, dass die Verbindung noch offen ist und wenn Sie etwas verpasst haben

1

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

1

Heartbeat ist keine Notwendigkeit für TCP-Protokolle. Es ist die Implementierung vorhanden, um zu erkennen, ob die andere Seite die Verbindung in der nicht standardmäßigen Weise beendet hat (d. H. Nicht durch den Abreißprozess gegangen ist).

2

TCP wird die Verbindung am Leben erhalten. Die Anwendungs-Heartbeats beziehen sich auf Überlegungen auf Anwendungsebene wie Failover, Load-Balancing oder die Benachrichtigung von Administratoren bei potenziellen Problemen.

44

Wie viele andere hier schon berichtet haben, wird die TCP-Verbindung bleiben, wenn auf sich selbst überlassen. Wenn Sie jedoch ein Gerät in der Mitte der Verbindung haben, das seinen Status verfolgt (z. B. eine Firewall), benötigen Sie möglicherweise Keepalives, damit der Statustabelleneintrag nicht abläuft.

+0

Die TCP-Verbindung wird für immer lebendig sagen? – user7817808

1

TCP/IP als Protokoll nicht geschlossen ist angegeben wird, bis Sie ein wachsames Paket senden. Ich habe Sockets bleiben offen, auch nach dem Pickel Wireless oder Internet-Verbindungen.

Dies ist jedoch sehr abhängig von Implementierungen. Höchstwahrscheinlich wird es ein "Zeitlimit" geben, was die maximale Zeit bedeutet, auf eine Antwort zu warten, bevor die Verbindung als "tot" betrachtet wird. Manchmal basiert dies auf der Anwendung selbst, manchmal auf NAT-Routern.

Daher würde ich sehr empfehlen halten Sie einen „Herzschlag“ zu schlechten Verbindungen zu erkennen und halten sie offen.

3

Der Herzschlag ist eine gute Möglichkeit, dem Server mitzuteilen, dass Sie am Leben sind, wobei ich meine, wenn der Server DoS-Angriffspräventionssysteme verwendet, kann er alle zugewiesenen Ressourcen für diese Verbindung entfernen. nach dem es in Aktivität für einen bestimmten Zeitraum erkannt wurde.
Ihr kein Mandat, um irgendwelche Herzschlagmechanismen zu implementieren.

Aber sein ist gut, wenn Sie eine Anwendung entwerfen, wo die wichtigsten Kriterien Ansprechbarkeit ist. Sie werden keine Zeit für Verbindungseinstellungen, DNS-Lookups und Pfadentdeckungen verschwenden. Es bleibt nur eine Verbindung aufrecht, sendet weiterhin Heartbeats und die Anwendung weiß, dass die Verbindung aktiv ist und Verbindungsaufbau nicht erforderlich ist. Einfach senden und empfangen.

9

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

Das standardmäßige Keep-Alive-Intervall beträgt 2 Stunden.

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

Unter Umständen müssen Sie Ihren eigenen Herzschlag implementieren und deaktivieren TCP-Keep-Alive auf Fenster, wenn das 2 Stunden keep-alive am Leben nicht erwünscht ist.

2

Grundsätzlich eine TCP-Verbindung erstellt Link-Status in Switches entlang Route gespeichert. Um gebrochene Verbindungen zu erkennen (wie wenn ein Gegenstück abstürzt (ohne eine ordnungsgemäße Trennung zu senden)), müssen diese Zustände nach einer Zeit der Inaktivität entfernt werden. Und wenn das 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 von Internetanbietern abhängig zu sein. Ich erinnere mich, dass meine Leerlauf-SSH-Terminalsitzungen schnell (weniger als 15 Minuten Leerlaufzeit) von meinem früheren Internetprovider 1 & 1 geschlossen wurden, während sie mehrere Stunden bei Verwendung eines Kabel-BW-Anschlusses offen standen ...

Ich schließe mit meinen Vorrednern: Ein Herzschlag ist eine gute Möglichkeit zu sagen, ob eine Verbindung noch am Leben und Treten ist ...

17

Wenn Ihre Komponenten:

  • in einem herkömmlichen verdrahteten Netzwerk sind
  • gibt es keine Firewalls oder NAT-Router zwischen ihnen
  • keiner von ihnen abstürzen

dann brauchen Sie nicht einen Herzschlag haben.

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

Verwandte Themen