Wenn eine TCP-Verbindung an einem Ende der Verbindung geschlossen wird, empfängt das andere Ende eine FIN
und antwortet mit einer ACK
. Dieses Ende der Verbindung wechselt dann in den CLOSE_WAIT
Zustand . Sobald close()
an diesem Ende aufgerufen wird, sendet TCP ein FIN
Paket und wechselt in den LAST_ACK
Zustand. Es wechselt jedoch nie in den TIME_WAIT
Zustand .
Nehmen wir nun an, dass Host A close()
den Socket aufruft und ein FIN
Paket an Host B sendet. Host A wechselt in den FIN_WAIT_1
Status. Host B empfängt das FIN
Paket, sendet ein ACK
und wechselt dann in den CLOSE_WAIT
Status. Das ACK wird jedoch irgendwo in einem Upstream-Router gelöscht.
In der Zwischenzeit ruft Host B an close()
(denken Sie daran, dass sich Host B im CLOSE_WAIT
Status befindet) und sendet ein FIN
Paket an Host A. Host B wechselt jetzt in den LAST_ACK
Status. Host A empfängt das FIN
Paket und antwortet mit einem ACK
. Dann wechselt er in den CLOSING
Status.
Am anderen Ende befindet sich Host B immer noch in diesem LAST_ACK
Zustand. Er empfängt dann das ACK
von Host A und wechselt in den CLOSED
Zustand. Denken Sie daran, dass das ACK
von Host B zu Host A unterbrochen wurde und dass Host A sein FIN
Paket nicht erneut gesendet hat. Host A sendet sein FIN
Paket nach Zeitüberschreitung erneut – Host B hat die Verbindung jedoch geschlossen.
Hängt Host A nun in diesem CLOSING
Zustand fest? Kann der Verbindungsabbau fortgesetzt werden? Was passiert als nächstes?
Antwort1
Mein TCP ist etwas eingerostet, aber ich glaube, es funktioniert so:
Wenn Host B anruft close()
und seine sendet , zeigt FIN
die Sequenznummer darauf Host A an, dass ein Paket von Host B verpasst wurde. Host A wird daher die von Host B nicht bestätigen , sondern weiterhin das letzte TCP-Segment bestätigen, das er erfolgreich von Host B empfangen hat. Dadurch wird Host B aufgefordert, die fehlenden erneut zu übertragen .FIN
FIN
ACK
Daher erreicht Host A diesen Zustand nicht CLOSING
, da er den Empfang der Out-of-Order-Nachricht FIN
erst dann als wirklich ansieht, wenn er die ACK
vorhergehende fehlende Nachricht empfängt.