Ich habe zum ersten Mal Kommunikationsmajor studiert. Nach dem Abschluss gingen meine Klassenkameraden ihre getrennten Wege, um ihre Träume zu verwirklichen, und reisten zwischen Baustellen aller Größen. Haha, nur ein Scherz, es gibt auch einige erstaunliche Menschen, die an einem bestimmten Forschungsinstitut eingetreten sind, oder? Sein Vater ist nicht der Regisseur, also sollte er im Inneren nicht zu dunkel sein. Ich erinnere mich, dass es einen sehr hohen Kurs namens Computernetzwerk gab (wahrscheinlich dieser Name). Es gibt ein Konzept über den Handschlag und überprüfen Sie es nun.
Schauen wir uns zuerst den schematischen Blick an:
TCP ist verbindungsorientiert. Unabhängig davon, in welche Richtung die andere Partei Daten sendet, muss zwischen den beiden Parteien eine Verbindung hergestellt werden. Im TCP/IP -Protokoll bietet das TCP -Protokoll zuverlässige Verbindungsdienste und die Verbindung wird über drei Händedrucke initialisiert. Der Zweck des Drei-Wege-Handschlags besteht darin, die Seriennummer und Bestätigungsnummer sowohl der Parteien zu synchronisieren und die Informationen zu TCP-Fenster zu tauschen.
1. Handshake: Stellen Sie eine Verbindung her. Der Client sendet ein Segment für Verbindungsanforderungen, legt die SYN -Position auf 1 fest und die Sequenznummer ist x; Dann betritt der Client den Syn_Send -Status und wartet darauf, dass der Server bestätigt wird.
2. Second Handshake: Der Server empfängt das SYN -Meldungssegment. Wenn der Server das SYN -Meldungssegment vom Client empfängt, muss er das SYN -Meldungssegment bestätigen und die Bestätigungsnummer auf x+1 festlegen (Sequenznummer+1). Gleichzeitig muss auch die SYN -Anforderungsinformationen gesendet und die SYN -Position auf 1 und die Sequenznummer an y festgelegt. Der Server stellt alle oben genannten Informationen in ein Paketsegment (d. H. Das SYN+ACK -Nachrichtensegment) ein und sendet es zusammen an den Client. Zu diesem Zeitpunkt tritt der Server in den Syn_Recv -Status ein.
3. Der dritte Handshake: Der Client empfängt das SYN+ACK -Paketsegment des Servers. Stellen Sie dann die Bestätigungsnummer auf Y+1 ein und senden Sie ein ACK -Nachrichtensegment an den Server. Nachdem das Nachrichtensegment gesendet wurde, geben sowohl der Client als auch der Server den festgelegten Status ein und vervollständigen den dreimaligen Handschlag.
Nach Abschluss von drei Händeschlägen können Client und Server mit der Übertragung von Daten beginnen. Die oben genannte ist die allgemeine Einführung in den dreimaligen Händedruck von TCP.
Was ist mit diesen vier Wellen?
Nachdem der Client und der Server eine TCP -Verbindung durch drei Handshakes hergestellt haben, muss die TCP -Verbindung unterbrochen werden, wenn die Datenübertragung abgeschlossen ist. Dann gibt es hier eine mysteriöse "vier Wellen" zur Trennung von TCP.
1. Die erste Welle: Host 1 (kann als Client oder als Server verwendet werden), legen Sie die Sequenznummer und die Bestätigungsnummer fest und senden Sie ein FIN -Nachrichtensegment an Host 2. Zu diesem Zeitpunkt tritt Host 1 in den Status Fin_wait_1 ein. Dies bedeutet, dass Host 1 keine Daten an Host 2 gesendet werden soll.
2. Die zweite Welle: Host 2 empfing das vom Host 1 gesendete Fin -Nachrichtensegment und gab ein ACK -Nachrichtensegment an Host 1 zurück. Die Bestätigungsnummer ist die Sequenznummer plus 1; Host 1 tritt in den Status fin_wait_2 ein; Host 2 teilt Host 1 mit, dass ich keine Daten zu senden habe, damit ich die Verbindung schließen kann.
3. Die dritte Welle: Host 2 sendet ein FIN -Nachrichtensegment an Host 1, wobei er um die Schließung der Verbindung und gleichzeitig den Status von Host 2 in den Status Close_wait eingeht.
V. Nachdem Host 2 das ACK -Nachrichtensegment von Host 1 empfangen hat, schließt es die Verbindung; Zu diesem Zeitpunkt erhält Host 1 nach dem Warten auf 2MSL immer noch keine Antwort. Es zeigt, dass die Serverseite normal geschlossen wurde. Es ist also in Ordnung, Host 1 kann auch die Verbindung schließen.
Zu diesem Zeitpunkt wurden die vier Wellen von TCP glücklich abgeschlossen. Wenn Sie dies sehen, haben Sie viele Fragen im Kopf, verstehen viele nicht und es fühlt sich chaotisch an. Es ist okay, lasst uns weiter zusammenfassen.
Warum müssen Sie dreimal die Hand schütteln?
Der sogenannte Drei-Wege-Handshake bedeutet, eine TCP-Verbindung herzustellen. Dies bedeutet, dass der Client und der Server beim Aufbau einer TCP-Verbindung insgesamt 3 Pakete senden müssen, um die Aufstellung der Verbindung zu bestätigen. In der Socket -Programmierung wird dieser Vorgang vom Client ausgelöst, der Connect ausführt.
Warum müssen wir dreimal die drei Händedrucke von TCP zusammengefasst haben? Warum können wir es in zweimal vervollständigen? Warum muss TCP also drei Verbindungen herstellen? Dies hat Xie Xiren in "Computernetzwerk" gesagt:
Um zu verhindern, dass das Segment für fehlgeschlagene Verbindungsanforderung plötzlich auf den Server übertragen wird, tritt ein Fehler auf.
Im Buch wird wie folgt ein Beispiel gegeben:
Die Erzeugung von "fehlgeschlagenem Verbindungsanforderungsegment" befindet sich in einem solchen Fall: Das vom Client gesendete erste Verbindungsanforderungsegment geht nicht verloren.
Stattdessen bleibt es lange in einem bestimmten Netzwerkknoten, was zu Verzögerungen führt, bis eine bestimmte Zeit nach der Veröffentlichung der Verbindung vor dem Erreichen des Servers. Dies war ursprünglich ein
Vor langer Zeit fehlgeschlagene Nachrichtensegment. Nachdem der Server dieses Segment für ungültige Verbindungsanforderungsnachrichten erhalten hatte
Verbindungsanfrage. Daher wurde das Bestätigungssegment an den Kunden gesendet und vereinbart, die Verbindung herzustellen. Unter der Annahme, dass "dreimaliger Handshake" nicht übernommen wird, dann nur der Server
Ausgeben eine Bestätigung und die neue Verbindung wird hergestellt. Da der Client keine Anfrage zur Herstellung einer Verbindung herausgegeben hat, wird die Bestätigung des Servers nicht ignoriert.
Es werden auch keine Daten an den Server gesendet. Der Server glaubte jedoch, dass die neue Transportverbindung hergestellt worden sei und darauf wartete, dass der Client Daten sendet. Also,
Viele der Ressourcen des Servers werden verschwendet. Das obige Phänomen kann durch die Verwendung des "dreimaligen Handschlags" verhindert werden. Zum Beispiel die Situation gerade jetzt,
Der Client wird der Bestätigung des Servers nicht bestätigt. Da der Server die Bestätigung nicht empfangen kann, weiß er, dass der Client nicht verlangt, dass die Verbindung hergestellt wird. "
Dies ist sehr klar, was verhindert, dass der Server die Warten und die Verschwendung von Ressourcen verhindert.
Warum musst du viermal winken?
Warum winktst du viermal?
Das sogenannte Vier-Wege-Wellenhand beendet die TCP-Verbindung, was bedeutet, dass der Client und der Server, wenn eine TCP-Verbindung nicht verbunden ist, insgesamt 4 Pakete senden muss, um die Trennung der Verbindung zu bestätigen. Bei der Socket -Programmierung wird dieser Vorgang entweder vom Client oder vom Server ausgelöst, der die Schließung ausführt.
Das TCP-Protokoll ist ein verbindungsorientiertes, zuverlässiges Byte-Stream-basierter Transportschichtkommunikationsprotokoll. TCP ist der vollständige Duplex -Modus, was bedeutet, dass beim Senden von Host 1 ein FIN -Segment nur bedeutet, dass Host 1 keine Daten zugesandt. Host 1 teilt Host 2 mit, dass seine Daten gesendet wurden; Zu diesem Zeitpunkt kann Host 1 jedoch weiterhin Daten von Host 2 akzeptieren. Wenn Host 2 das ACK -Segment zurückgibt, bedeutet dies, dass Host 1 nicht gesendet werden muss, Host 2 jedoch weiterhin an Host 1 senden kann. Wenn Host 2 auch ein FIN -Segment sendet, bedeutet dies, dass Host 2 keine Daten gesendet werden müssen, und es wird Host 1 angezeigt, dass ich keine Daten zugesandt habe, und dann wird einander diese TCP -Verbindung glücklich unterbricht. Wenn Sie das Prinzip von vier Wellen korrekt verstehen möchten, müssen Sie die Änderungen im Staat während der vier Wellen verstehen.
FIN_WAIT_1: Dieser Zustand muss sorgfältig erklärt werden. In der Tat besteht die wahre Bedeutung der Staaten Fin_WAIT_1 und Fin_WAIT_2, beide auf die FIN -Nachricht der anderen Partei zu warten. Der Unterschied zwischen diesen beiden Zuständen ist: Der Status Fin_wait_1 besteht tatsächlich darin, dass Socket im etablierten Zustand die Verbindung aktiv schließen und eine Fin -Nachricht an die andere Partei senden möchte. Zu diesem Zeitpunkt tritt der Socket in den Status Fin_wait_1 ein. Wenn die andere Partei auf die ACK -Nachricht antwortet, tritt sie in den Status Fin_wait_2 ein. Natürlich sollte die ACK -Nachricht unter tatsächlichen normalen Umständen, unabhängig von der anderen Partei, sofort auf die ACK -Nachricht beantwortet werden. Daher ist der Status finn_wait_1 im Allgemeinen schwer zu erkennen, und der Status Fin_WAIT_2 ist häufig mit Netstat zu sehen. (Aktive Partei)
FIN_WAIT_2: Dieser Zustand wurde oben ausführlich erklärt. In der Tat bedeutet Socket im Bundesstaat Fin_WAIT_2 eine Halbverbindung, dh eine Partei benötigt eine enge Verbindung, teilt aber auch der anderen Partei mit, dass ich vorerst einige Daten übertragen werden soll (ACK-Informationen) und dann die Verbindung später schließen. (Aktive Partei)
Close_wait: Die Bedeutung dieses Zustands ist tatsächlich darauf, zu schließen. Wie versteht man? Wenn die andere Partei einen Sockel schließt und eine Flosserklärung an sich selbst sendet, wird Ihr System zweifellos auf eine ACK -Nachricht an die andere Partei reagieren und dann in den Status close_wait eingeben. Als nächstes müssen Sie wirklich in Betracht ziehen, um zu überprüfen, ob Sie noch Daten an die andere Partei senden müssen. Wenn nicht, können Sie den Socket schließen und FIN -Nachrichten an die andere Partei senden, dh die Verbindung. Wenn Sie also im Status von Close_wait sind, müssen Sie darauf warten, dass Sie die Verbindung schließen. (Passive Seite)
Last_ack: Dieser Zustand ist relativ leicht zu verstehen. Es schließt passiv die ACK -Nachricht der anderen Partei nach dem Senden der FIN -Nachricht. Nach Erhalt der ACK -Nachricht können Sie den verfügbaren geschlossenen Zustand eingeben. (Passive Seite)
TIME_WAIT: Dies bedeutet, dass die FIN -Nachricht der anderen Partei empfangen wurde und die ACK -Nachricht gesendet wurde. Warten Sie einfach, bis 2MSL in den verfügbaren geschlossenen Zustand zurückkehrt. Wenn Sie in Finwait1 Status eine Nachricht mit der anderen Partei sowohl mit der Flossenflagge als auch mit der ACK -Flag erhalten, können Sie den Status Time_wait direkt eingeben, ohne den Status Fin_WAIT_2 zu durchlaufen. (Aktive Partei)
Geschlossen: Zeigt an, dass die Verbindung unterbrochen wird.
Zusammenfassen
Das obige ist der gesamte Inhalt dieses Artikels über das Prinzip und die Prozessanalyse von drei Handshakes und vier Händeschlägen im TCP/IP -Protokoll. Ich hoffe, es wird für alle hilfreich sein. Wenn es Mängel gibt, hinterlassen Sie bitte eine Nachricht und freuen Sie sich auf Ihre wertvollen Meinungen.