Die Verbindung bleibt bestehen, aber der Endpunkt ist tot?

Die Verbindung bleibt bestehen, aber der Endpunkt ist tot?

Hat jemand eine Idee, was dazu führen könnte, dass eine TCP-Verbindung (Clientseite) etwa 24 Stunden lang im Status ESTABLISHED bleibt, obwohl der Server neu gestartet wurde? Der Client-Prozess bleibt beim Recv-Systemaufruf und bleibt so, ohne einen Fehler zu verursachen!

Der Client ist auf einer Ubuntu 11.04-Installation. Das ist mir schon ein paar Mal passiert, aber ich verstehe nicht, warum oder wie ich es lösen kann.

Antwort1

Die Verbindung bleibt auf der einen Seite HERGESTELLT und auf der anderen Seite nicht existent, da dies der Zustand ist, in dem sie sich nach dem Neustart des Servers befand. Der Client hat keine Ahnung, dass der Server neu gestartet wurde, und der Server hat keine Ahnung, dass der Client denkt, er sei noch verbunden. Sofern der Client nicht versucht, die Verbindung zu verwenden, bleibt sie für immer so. (Sofern keine Keepalives aktiviert sind, bleibt sie in diesem Fall normalerweise etwa zwei Tage lang so.)

Warum wartet der Client ewig auf den Server?! Entweder ist der Client oder das Protokoll defekt. Wenn der Client das Protokoll nicht befolgt, ist der Client defekt. Wenn das Protokoll nicht angibt, wie eine tote Verbindung erkannt werden soll, ist das Protokoll defekt.

TCP erkennt keine tote Verbindung für ein Ende, das nicht versucht, Daten zu senden. Daher kann jedes Protokoll, das auf TCP aufsetzt,mussso konzipiert sein, dass dies berücksichtigt wird. Wenn diese hängengebliebene Verbindung kein akzeptables Verhalten ist, dann ist dieses Protokoll defekt, weil es dieses inakzeptable Verhalten zulässt (oder der Client ist defekt, weil er das Protokoll nicht befolgt).

Sagt die Protokollspezifikation wirklich, dass man warten soll?für immerfür Daten? Wenn ja, würde ich die geistige Gesundheit der Entwickler des Protokolls in Frage stellen.

verwandte Informationen