Das Einrichten von TCP erfordert einen Drei-Wege-Handshake zum Einrichten und einen Vier-Wege-Handshake zum Trennen. Der gesamte Vorgang ist in der folgenden Abbildung dargestellt:
Sehen wir uns zunächst an, wie eine Verbindung hergestellt wird.
【Aktualisiert am 04.01.2017】Dieser Teil des Inhalts enthält falsche Bilder, bitte verzeihen Sie mir. Die richtigen Bilder sind wie folgt , falsch Die beigefügten Bilder werden nicht gelöscht. Zum besseren Verständnis können Sie sie vergleichen. Tut mir leid, dass die Aktualisierung so lange gedauert hat! !
Das falsche Bild ist wie folgt:
Zuerst sendet der Client eine Verbindungsanforderungsnachricht. Nachdem das Serversegment die Verbindung akzeptiert hat, antwortet es mit einer ACK-Nachricht und weist Ressourcen für diese Verbindung zu. Nach Erhalt der ACK-Nachricht sendet der Client auch eine ACK-Nachricht an das Serversegment und weist Ressourcen zu, sodass die TCP-Verbindung hergestellt wird.
Wie trenne ich die Verbindung? Der einfache Vorgang ist wie folgt:
[Hinweis] Das Verbindungsende kann das Client-Ende oder das Server-Ende sein.
Angenommen, der Client initiiert eine Verbindungsunterbrechungsanforderung, also das Senden einer FIN-Nachricht. Nachdem der Server die FIN-Nachricht empfangen hat, heißt es: „Mein Client hat keine Daten, die er an Sie senden kann “, aber wenn Sie noch Daten haben, die nicht gesendet wurden, müssen Sie sich nicht beeilen, die zu schließen Socket und Sie können fortfahren. Sie senden also zuerst eine Bestätigung: „Sagen Sie dem Kunden, dass ich Ihre Anfrage erhalten habe, aber noch nicht bereit bin. Bitte warten Sie weiterhin auf meine Nachricht “. Zu diesem Zeitpunkt wechselt der Client in den Status FIN_WAIT und wartet weiterhin auf die FIN-Nachricht vom Server. Wenn der Server feststellt, dass die Daten gesendet wurden, sendet er eine FIN-Nachricht an den Client: „ sagt dem Client, okay, meine Daten wurden gesendet und ich bin bereit, die Verbindung zu schließen “. Nachdem der Client die FIN-Nachricht empfangen hat, weiß „“, dass die Verbindung geschlossen werden kann, aber er vertraut dem Netzwerk immer noch nicht und befürchtet, dass der Server nicht weiß, dass er sie schließen soll, sodass er nach dem Senden in den Status TIME_WAIT wechselt die ACK. Wenn der Server die ACK nicht empfängt, können Sie erneut übertragen, und nachdem der Server die ACK empfangen hat, „ erfährt, dass die Verbindung getrennt werden kann “. Der Client hat nach dem Warten auf 2MSL immer noch keine Antwort erhalten, was beweist, dass der Server normal geschlossen wurde. Nun, mein Client kann die Verbindung auch schließen. Ok, die TCP-Verbindung wird so geschlossen! Der Status, den der Client während des gesamten Prozesses erlebt, ist wie folgt:
Der Prozess, den der Server erlebt, ist wie folgt:
[Hinweis] Wenn im TIME_WAIT-Status die letzte vom TCP-Client gesendete Bestätigung verloren geht, wird sie erneut gesendet. Die im TIME_WAIT-Zustand benötigte Zeit ist von der Implementierung abhängig. Typische Werte sind 30 Sekunden, 1 Minute und 2 Minuten. Nach dem Warten wird die Verbindung offiziell geschlossen und alle Ressourcen (einschließlich Portnummern) werden freigegeben.
[Frage 1] Warum gibt es beim Verbinden einen Drei-Wege-Handschlag, beim Schließen jedoch einen Vier-Wege-Handschlag?
Antwort: Denn wenn der Server die SYN-Verbindungsanforderungsnachricht vom Client empfängt, kann er die SYN+ACK-Nachricht direkt senden. Die ACK-Nachricht wird zur Antwort und die SYN-Nachricht zur Synchronisierung verwendet. Beim Schließen der Verbindung ist es jedoch wahrscheinlich, dass der SOCKET nicht sofort geschlossen wird, wenn der Server die FIN-Nachricht empfängt. Daher kann er zunächst nur mit einer ACK-Nachricht antworten und dem Client mitteilen: „Ich habe die von Ihnen gesendete FIN-Nachricht erhalten.“ " Erst wenn alle Nachrichten auf meiner Serverseite gesendet wurden, kann ich die FIN-Nachricht senden, sie kann also nicht zusammen gesendet werden. Daher ist ein vierstufiger Handshake erforderlich.
[Frage 2] Warum muss der TIME_WAIT-Zustand 2MSL (maximale Segmentüberlebenszeit) überschreiten, bevor er in den CLOSE-Zustand zurückkehren kann?
Antwort: Obwohl es naheliegend ist, dass alle vier Nachrichten gesendet wurden und wir direkt in den CLOSE-Zustand wechseln können, müssen wir so tun, als wäre das Netzwerk unzuverlässig und die letzte ACK könnte verloren gehen. Daher wird der Status TIME_WAIT verwendet, um möglicherweise verlorene ACK-Nachrichten erneut zu senden.
Das obige ist der detaillierte Inhalt vonWas bedeuten der Drei-Wege-Handshake und der Vier-Wege-Handshake in TCP?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!