Kann eine TCP-Verbindung offen bleiben, wenn der Client die Verbindung getrennt hat?


12

Wir haben eine Serveranwendung, bei der bei rund 4000 Verbindungen Probleme mit der TCP-Erschöpfung auftreten. Dies geschieht alle 3 oder 4 Wochen (ungefähr). Der Anbieter, der diese Serveranwendung erstellt hat, teilt uns nach Prüfung der Ausgabe von netstat -b mit, dass einige Verbindungen auch dann offen bleiben, wenn die Clients unterbrochen wurden.

Ich habe die Aufgabe erhalten zu untersuchen, warum eine bestimmte Clientanwendung die TCP-Verbindung nicht ordnungsgemäß schließt. Ich bin der Überzeugung, dass ein heruntergefahrener Client-Computer möglicherweise NICHT vom Server melden kann, dass mit diesem Client noch eine TCP-Verbindung hergestellt wurde. Leider kann ich keine Informationen finden, um meine Ansicht zu bestätigen. Ich möchte keine Zeit mehr damit verschwenden, ein potenzielles Problem zu untersuchen, von dem ich nicht glaube, dass es überhaupt ein Problem sein kann.

tldr;

Kann ein Server eine hergestellte Verbindung zu einem Computer melden, der ausgeschaltet ist?

Antworten:


13

TCP bemüht sich nicht, eine tote Verbindung zu erkennen, außer auf einer Seite, die Daten überträgt. Es liegt in der Verantwortung des Anwendungscodes, der den TCP-Stack aufruft, dies zu tun. Um welches Protokoll handelt es sich hier? (Der oben auf TCP.)

Es ist eine schrecklich hässliche "Lösung", aber Sie können TCP-Keepalives aktivieren . Es gibt mehr in diesem Artikel .


Sie meinten wahrscheinlich Schicht und es ist die Sitzungsschicht über der Transportschicht, in der sich TCP befindet.
Rilindo

1
@Rilindo: In der Praxis und in diesem speziellen Fall ruft eine Anwendung den TCP-Stack auf. Das Protokoll über TCP (HTTP, POP oder was auch immer) gibt normalerweise an, wie dies zu tun ist, da die Entwickler dieser Protokolle wussten, dass TCP dies nicht selbst tun kann.
David Schwartz

Hoppla, mein Fehler. Also seine Schicht 7.
Rilindo

Ich werde Keepalives derzeit nicht aktivieren, aber es ist praktisch zu wissen, dass die Option vorhanden ist. Dieser Artikel scheint darauf hinzudeuten, dass es bereits eine Auszeit von 2 Stunden gibt. AFAIK, Verbindungen werden für Tage / Wochen offen gehalten.
Josh Smeaton

Keepalives sind höchstwahrscheinlich nicht aktiviert. Ein Teil des Codes muss sie aktivieren. Es hört sich so an, als ob die Anwendung einfach kaputt ist, wenn sie nicht einmal Keepalives aktiviert und keinen Timeout / Reap-Mechanismus hat. Über welches Protokoll sprechen wir? (HTTP? SMTP? FTP?)
David Schwartz

8

Ja, es ist möglich. Wie David und Paul in ihren Antworten angegeben haben, gibt es in TCP keinen Mechanismus (außer TCP-Keep-Alives, die optional sind), um eine halboffene Verbindung zu erkennen. Es ist Sache des Anwendungsherstellers, den Verbindungsstatus zu bestimmen und entsprechende Maßnahmen zu ergreifen.

In Bezug auf TCP gibt es keine Erkennung oder Unterscheidung zwischen einer halboffenen Verbindung und einer langen Leerlaufverbindung.

Sie müssen mit der Fehlerbehebung von Schicht 1 (physisch) des OSI-Modells bis Schicht 7 (Anwendung) beginnen, um herauszufinden, wo das Problem auftritt. Mein Rat wäre, ein Paketerfassungsprogramm auf einem der betroffenen Clients zu installieren und auszuführen, bis das Problem auftritt, und dann die Erfassung zu analysieren, um festzustellen, warum der Client die Verbindung nicht schließt.


3
Oder lassen Sie den Anbieter angemessene Zeitüberschreitungen implementieren :)
Shane Madden

5

Wenn eine Workstation eine Verbindung mit einem Server schließen möchte, sendet sie eine TCP-FIN. Wenn sich der Client nicht ordnungsgemäß verhält und seine Verbindungen nicht schließt, können sie tatsächlich auf dem Server eingerichtet bleiben. Sie können Zeitüberschreitungen für offene Verbindungen auf dem Server festlegen, um diese zu bereinigen. Es ist jedoch besser, die Ursache zu ermitteln. In welchen Port kommen die offenen Verbindungen? Sobald Sie wissen, auf welchen Dienst zugegriffen wird, können Sie möglicherweise die Client-App identifizieren, die auf den Server trifft.


Wir kennen den Kunden, der das offensichtliche Problem ist. Es ist eine Desktop-App, die Hunderte unserer Benutzer täglich verwenden. Ich gehe davon aus, dass das Problem darin besteht, dass die Anwendung abstürzt, ein Hard-Reset oder eine Endaufgabe ausgeführt wird. Ich dachte in all diesen Situationen, dass der Server die unterbrochene Verbindung jedoch bemerken würde.
Josh Smeaton

4
Für den Server ist die Verbindung offen, es sei denn, er erhält eine FIN oder eine RST vom Client. Ohne dies geht der Server davon aus, dass die Verbindung noch hergestellt ist, der Client jedoch keine zu sendenden Daten hat. Für den Server gibt es keinen Unterschied zwischen einer halboffenen Verbindung und einer inaktiven Verbindung.
Joeqwerty

@joeqwerty: Richtig, der Server könnte jedoch entscheiden, dass er eine Verbindung nicht auf unbestimmte Zeit offen halten möchte, und einen Timeout- / Schließmechanismus implementieren. Das meinte David Schwartz in seiner Antwort mit "es liegt in der Verantwortung des Anwendungscodes". Der Server kann also einen Unterschied zwischen einer halboffenen Verbindung und einer inaktiven Verbindung machen, wenn er möchte. Für TCP gibt es jedoch keinen Unterschied zwischen einer halboffenen Verbindung und einer inaktiven Verbindung.
Sleske

@sleske: Einverstanden, dass der Anwendungscode dies tun könnte, TCP jedoch nicht, es sei denn, Keep-Alives sind aktiviert.
Joeqwerty
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.