Ich fand heraus, dass der Grund, warum der aktive Schließer TIME WAIT eingibt, darin besteht, sicherzustellen, dass das endgültige ACK nicht verloren geht. Aber woher weiß es, ob das endgültige ACK verloren geht? Wird der passive Schließer die FIN erneut senden und der aktive Schließer weiß, dass die ACK verloren gegangen ist? Hier ist ein Bild des TCP FSM.
12
Antworten:
Ja. Zitieren aus TCP / IP Illustrated Volume 1 im Abschnitt TCP-Verbindungsverwaltung:
Es gibt eine Zeitüberschreitung. In
LAST_ACK
diesem Fall wird der passive SchließerFIN
bei einer Zeitüberschreitung erneut gesendet , sofern er verloren gegangen ist. Wenn es tatsächlich verloren gegangen ist, wird der aktive Schließer schließlich die erneut übertragene Nachricht empfangenFIN
und eintretenTIME_WAIT
. Wenn dasFIN
nicht verloren war, aber das FinaleACK
verloren war, dann ist der aktive Schließer drinTIME_WAIT
und erhältFIN
wieder. Wenn dies geschieht - Empfangen einesFIN
inTIME_WAIT
- dasACK
ist neu übertragen.Der Timeout-Wert in
TIME_WAIT
wird NICHT für die erneute Übertragung verwendet. Bei einer ZeitüberschreitungTIME_WAIT
wird davon ausgegangen, dass das FinaleACK
erfolgreich übermittelt wurde, da der passive Schließer keineFIN
Pakete erneut übertragen hat. Das Timeout inTIME_WAIT
ist also nur eine Zeitspanne, nach der wir davon ausgehen können, dass das andere Ende nichts gesendet hat, weil es das Finale empfangenACK
und die Verbindung geschlossen hat.quelle
Weil es es nicht innerhalb des Timeout-Zeitraums erhalten hat. Ich weiß, das ist eine "duh" Antwort, aber genau deshalb gibt es diese Zustände und Zeitüberschreitungen.
Nein. Nur wenn weitere Pakete für diesen Stream eintreffen und dies dazu führen würde, dass "RST" (Reset) gesendet wird.
Der gesamte Prozess ist eine komplizierte Zustandsmaschine, um ein ordnungsgemäßes Herunterfahren trotz der Möglichkeit von Netzwerkfehlern auszuführen. Netzwerke brechen ab, bei Verbindungen treten Fehler auf, Verbindungen werden gesättigt und müssen Pakete verwerfen, Geräte fallen aus usw. Führen Sie als Übung den Statusbaum für eine aktive Verbindung aus, wenn einer der Endpunkte gerade verschwindet (z. B. Stromausfall).
TL; DR Dieser Zustandsbaum ist für jeden möglichen Fehlermodus ausgelegt.
quelle
Der Zweck von TIME_WAIT besteht darin, dem Netzwerk die Unterscheidung von Paketen zu ermöglichen, die als zur 'alten, vorhandenen' Verbindung gehörig ankommen, und von einer neuen Verbindung. Es wird empfohlen, den TIME_WAIT-Timer auf die doppelte maximale Segmentlebensdauer (MSL) zu setzen. Auf meinem System beträgt die MSL 1 Minute, sodass Verbindungen 2 Minuten lang im TIME_WAIT-Status verbleiben.
Nach dieser Zeit werden eingehende Pakete nicht mehr der alten Verbindung zugeordnet.
TIME_WAIT wird nicht direkt auf das Senden von ACK-Paketen gewartet. Dies wird durch die Zustände CLOSE_WAIT und FIN_WAIT gesteuert. Wenn Sie zu TIME_WAIT gelangen, ist der Socket bereits geschlossen.
Referenzen: http://www.tcpipguide.com/free/t_TCPConnectionTermination-3.htm https://en.wikipedia.org/wiki/Maximum_segment_lifetime http://www.lognormal.com/blog/2012/09/27/ linux-tcpip-tuning /
quelle