Vorwort: Was ist Socket? Socket TCP stellt eine Verbindung her
dreimal In welchen Funktionen des Sockets findet der Handshake statt?
Wie trennt sich Socket TCP?
Wenn es um das Internet geht, denkt jeder sicher an TCP, UDP, HTTP, Three-Handle-Four -wave usw. Aber wenn es um Socket geht, sind alle vielleicht etwas verwirrt. Sie wissen nur, dass es im Netzwerk verwendet wird, aber was genau ist ein Socket? Warum ist das Netzwerk untrennbar mit Sockets verbunden?
Was ist Socket?
Socket ist eigentlich ein Socket, dass es eine einfache Netzwerkkommunikation implementieren kann, aber welche praktischen Auswirkungen hat es? Erscheinen? Socket ist ein Werkzeug zur Entwicklung der Portkommunikation und liegt auf einer niedrigeren Ebene.
Socket ähnelt eigentlich einem Geschirrspüler. Ohne ihn muss das Geschirr möglicherweise manuell gespült werden (manueller Aufruf verschiedener APIs zwischen der Transportschicht und der Anwendungsschicht), aber mit ihm Sie müssen nur auf den Schalter klicken und die Dauer anpassen (die API ist nicht gekapselt, aber ohne sie wird das Geschirrspülen (die Interaktion zwischen der Anwendungsschicht und der Transportschicht) sehr umständlich.
Eine vollständige Netzwerkkommunikation muss über das Netzwerkkabel und die Netzwerkkarte der physischen Transportschicht erfolgen. Das IP-Protokoll der Netzwerktransportschicht kann wissen, an welchen Computer die Daten übertragen werden sollen, es läuft jedoch anders ab Computersystemprozess: Wie kann festgestellt werden, für welchen Prozess die Netzwerkdaten auf der Netzwerkkarte bestimmt sind? Dies ist eigentlich das, wofür Socket entwickelt wurde.
Socket ist „eine Kapselung des TCP/IP- oder UDP/IP-Protokolls“ Socket selbst ist eigentlich eine aufrufende Schnittstelle. Durch diese Schnittstelle müssen wir uns bei der Entwicklung von Netzwerkanwendungen keine Gedanken darüber machen, wie die zugrunde liegende Schicht implementiert wird, wodurch die Schwierigkeit der Entwicklung verringert wird.
Socket -laufer Prozess (auf TCP
socket () basiert: bedeutet, einen Socket zu erstellen, und die untere Ebene generiert einen Dateideskriptor, um die darzustellen socket
bind(): Der Port und die Adresse, die zum Binden des Dienstes verwendet werden, sind hier im Allgemeinen festgelegt, da sie angegeben werden müssen, wenn der Client eine Verbindung herstellt.
listen(): Nachdem die Bindung abgeschlossen ist, überwacht listen die Datenpakete dieses Ports
accept(): entspricht einem Schalter und zeigt an, dass ich bereit bin, die Anfrage anzunehmen, sie wird jedoch blockiert, bis die Clientverbindung erfolgreich ist
read(): Lies den Inhalt vom Client gesendet
write(): Der Client schreibt die zurückzugebenden Daten
close(): Verbindung trennen, "viermal winken"
Client
socket(): bedeutet, dass ein Socket erstellt wird, und die unterste Ebene generiert einen Dateideskriptor, der den Socket darstellt.
connet(): bedeutet, dass eine Verbindung zur angegebenen Adresse hergestellt wird. Davor wird zufällig ein eigener Port, TCP, erstellt „Der Drei-Wege-Handshake beginnt hier.“ : trennen, „Viermal winken“
, Trennungsinformationen an den Client senden
Basierend auf UDP
Tatsächlich sind sie ähnlich, wie Sie dem Flussdiagramm entnehmen können. Da UDP zustandslos ist, gibt es keine Verbindung für Der Server empfängt die Anfrage des Clients, nachdem er die Recvfrom()-Methode aufgerufen hat. Wie stellt TCP eine Verbindung her? berühmter Dreier-Handschlag
Erster Handshake: Der TCP-Prozess von A erstellt einen Übertragungssteuerblock TCB und sendet dann ein Verbindungsanforderungssegment an B. Setzen Sie dann das Synchronisationsbit SYN auf 1 und wählen Sie eine anfängliche Sequenznummer seq=x. Zu diesem Zeitpunkt wechselt Client A in den Status SYN-SENT (Synchronisation gesendet).
Zweiter Handshake: B empfängt das Verbindungsanforderungssegment. Wenn es dem Verbindungsaufbau zustimmt, sendet es eine Bestätigung an A. Im Bestätigungsnachrichtensegment werden auch das Synchronisationsbit SYN = 1, das Bestätigungsbit ACK = 1, die Bestätigungsnummer ack = x + 1 und eine anfängliche Sequenznummer seq = y ausgewählt. Zu diesem Zeitpunkt tritt Server B ein den SYN-RCVID-Status.
Der dritte Handschlag: Nachdem A die Bestätigung von B erhalten hat, sendet er eine Bestätigung an B. Bestätigungsnachricht ACK=1, Bestätigungsnummer ack=y+1. Zu diesem Zeitpunkt tritt A in den Status ESTAB-LISHED ein. Wenn B die Bestätigung von A erhält, wechselt es ebenfalls in den Status ESTAB-LISHED. Die Verbindung wird hergestellt
In welchen Funktionen des Sockets findet der Drei-Wege-Handshake statt?
Wenn der Client connect aufruft, wird eine Verbindungsanfrage ausgelöst und ein SYN-Signal gesendet Zum Server. Zu diesem Zeitpunkt wechselt die Verbindung in den Blockierungsstatus.
Der Server überwacht die Verbindungsanforderung, ruft die Akzeptanzfunktion auf und wechselt in den Blockierungsstatus Am besten verwenden Sie die Socket-, Bind- und Listen-Funktionen und geben dann die relevanten Syn- und ack-Signale zurück.
Der Client empfängt die Informationen vom Server. Zu diesem Zeitpunkt ist die Verbindung abgeschlossen und der Blockierungsstatus wird freigegeben. und das Bestätigungssignal wird an den Server gesendet.
Der Server empfängt die Sperrung und stellt die Verbindung her. Danach wurde connect() ausgeführt Der Server kann Daten an den Client senden.
Wie trennt Socket TCP die Verbindung?
Die erste Welle: A sendet zuerst das Verbindungsfreigabenachrichtensegment, das Beendigungssteuerbit FIN=1 im Segmentheader und die Sequenznummer seq=u (gleich vor A. Die letzte Sequenznummer der gesendeten Daten wird um 1 erhöht. Anschließend wechselt A in den Status FIN-WAIT-1 (Beenden des Wartens 1) und wartet auf die Bestätigung von B.
Die zweite Welle: Nachdem B das Verbindungsfreigabe-Nachrichtensegment von A empfangen hat, sendet es sofort ein Bestätigungsnachrichtensegment, die Bestätigungsnummer ack=u+1, die Sequenznummer seq=v (gleich der letzten Sequenznummer der Daten). von B vor Add 1 gesendet); dann wechselt B in den CLOSE-WAIT-Zustand (Close Wait).
Die dritte Welle: A tritt in den FIN-WAIT-2-Zustand (Beendigungswartezeit 2) ein, nachdem er das Bestätigungsnachrichtensegment von B erhalten hat, und wartet weiterhin darauf, dass B ein Verbindungsfreigabenachrichtensegment sendet Wenn keine Daten mehr gesendet werden müssen, sendet B ein Nachrichtensegment zur Verbindungsfreigabe an A. Das Beendigungssteuerbit FIN = 1 im Segmentheader und die Sequenznummer seq = w (einige Daten werden möglicherweise im halbgeschlossenen Zustand gesendet ) und die Bestätigungsnummer ack=u+ 1. Zu diesem Zeitpunkt wechselt B in den Status LAST-ACK (letzte Bestätigung) und wartet auf die Bestätigung von A.
Die vierte Welle: A empfängt das Verbindungsfreigabe-Nachrichtensegment von B und sendet eine Bestätigung. Das Bestätigungsbit im Bestätigungssegment ist ACK=1, die Bestätigungsnummer ack=w+1 und die Sequenznummer seq=u+ 1; dann A Geben Sie den TIME-WAIT-Status (Zeitwartezeit) ein. Wenn B das Bestätigungssegment erneut empfängt, wechselt B in den GESCHLOSSEN-Zustand.
Warum nach der vierten Welle auf 2MSL warten?
Zuallererst beginnt die Zeit von 2MSL ab dem Zeitpunkt, an dem der Kunde (A) die FIN erhält und die ACK sendet. Wenn der Client (A) innerhalb der TIME-WAIT-Zeit die vom Server (B) erneut gesendete FIN-Nachricht empfängt, da die ACK des Clients (A) nicht an den Server (B) übertragen wird, beträgt die 2MSL-Zeit Zurücksetzen. Die Gründe für das Warten auf 2MSL sind wie folgt: 1. Das Datenpaket der ursprünglichen Verbindung verschwindet. Wenn B kein eigenes ACK erhält, wird es eine Zeitüberschreitung geben und FiN erneut übertragen FIN erneut und wird erneut ACK senden.
Wenn B seine ACK erhält, wird er keine Nachrichten mehr senden
Nach der letzten Welle weiß A nicht, ob B seine Nachricht erhalten hat.
Einschließlich ACK muss A auf beide oben genannten Situationen warten, um den maximalen Wert der Wartezeit der beiden Situationen zu nutzen, um das Worst-Case-Szenario zu bewältigen. Das Worst-Case-Szenario ist: die maximale Überlebenszeit der Ziel-ACK-Nachricht . (MSL) + Maximale Überlebenszeit (MSL) eingehender FIN-Nachrichten. Das sind genau 2MSL, was ausreichend Zeit ist, um das ursprünglich verbundene Datenpaket im Netzwerk verschwinden zu lassen.
2. Stellen Sie sicher, dass die ACK vom Server empfangen werden kann, um die Verbindung korrekt zu schließen.
Denn diese ACK kann verloren gehen, was dazu führt, dass der Server die FIN-ACK-Bestätigungsnachricht nicht empfängt. Angenommen, der Client wartet nicht auf 2MSL, sondern gibt das Schließen direkt nach dem Senden des ACK frei. Sobald das ACK verloren geht, kann der Server nicht normal in den geschlossenen Verbindungsstatus wechseln.
Das obige ist der detaillierte Inhalt vonInterviewer: Wie trennt Socket TCP die Verbindung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!
Stellungnahme:
Dieser Artikel ist reproduziert unter:Java后端技术全栈. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen