Einfaches Verständnis von Socket
Um Socket zu verstehen, müssen Sie sich zunächst mit der Einfaches Verständnis von Socket-Protokollfamilie vertraut machen. Einfaches Verständnis von Socket (Transmission Control Protocol/Internet Protocol) ist das Transmission Control Protocol/Internet Protocol Definiert, wie der Host Der Standard für die Verbindung zum Internet und wie Daten zwischen ihnen übertragen werden.
Wörtlich genommen ist Einfaches Verständnis von Socket die Sammelbezeichnung der TCP- und IP-Protokolle, in Wirklichkeit aber Einfaches Verständnis von Socket Unter Protokoll versteht man das gesamte Einfaches Verständnis von Socket-Protokoll der Internet-IP-Protokollfamilie. Im Gegensatz zu den sieben Schichten des ISO-Modells klassifiziert das Einfaches Verständnis von Socket-Protokollreferenzmodell alle Protokolle der Einfaches Verständnis von Socket-Serie in vier abstrakte Schichten
Anwendungsschicht: TFTP, HTTP, SNMP, FTP, SMTP, DNS, Telnet usw.
Transportschicht: TCP, UDP
Netzwerkschicht: IP, ICMP, OSPF, EIGRP, IGMP
Datenverbindungsschicht: SLIP, CSLIP, PPP, MTU
Jede Abstraktionsschicht baut auf den von der unteren Schicht bereitgestellten Diensten auf und stellt Dienste für die höhere Schicht bereit. Es sieht so aus
Es wird geschätzt, dass Studierende, die diesen Artikel lesen möchten, ein gewisses Verständnis dafür haben. Darüber hinaus habe ich auch ein wenig Wissen, sodass ich es nicht im Detail erläutern werde. Interessierte Studierende können online nach Informationen suchen .
Im Einfaches Verständnis von Socket-Protokoll sind zwei Internet-Hosts über zwei Router und entsprechende Schichten verbunden. Die Anwendungen auf jedem Host führen über einige Datenkanäle miteinander Lesevorgänge aus
Socket
Wir kennen die grundlegendste Voraussetzung für die Kommunikation zwischen zwei Prozessen In der lokalen Prozesskommunikation können wir PID verwenden, um einen Prozess eindeutig zu identifizieren. Die Wahrscheinlichkeit eines PID-Konflikts zwischen zwei Prozessen im Netzwerk ist jedoch sehr hoch Jetzt wissen wir, dass die IP-Adresse der IP-Schicht den Host eindeutig identifizieren kann und dass das TCP-Schichtprotokoll und die Portnummer einen Prozess des Hosts eindeutig identifizieren können. Auf diese Weise können wir die IP-Adresse + verwenden Protokoll + Portnummer zur eindeutigen Identifizierung eines Prozesses im Netzwerk.
Nachdem sie Prozesse im Netzwerk eindeutig identifizieren konnten, können sie über Sockets kommunizieren. Was ist ein Socket? Wir übersetzen Socket oft als Socket, eine Abstraktionsschicht zwischen der Anwendungsschicht und der Transportschicht. Sie abstrahiert die komplexen Operationen der Einfaches Verständnis von Socket-Schicht in mehrere einfache Schnittstellen, damit die Anwendungsschicht den implementierten Prozess im Netzwerk aufruft Kommunikation.
Socket stammt von UNIX. Unter der Unix-Philosophie, dass alles eine Datei ist, ist Socket eine Implementierung des „Open-Read/Write-Close“-Modus Jeder Client verwaltet eine „Datei“. Nachdem die Verbindung hergestellt und geöffnet wurde, kann er Inhalte in seine eigene Datei schreiben, damit die andere Partei sie lesen kann. Die Datei wird geschlossen, wenn die Kommunikation endet.
Socket-Kommunikationsprozess
Socket ist die Implementierung des „Open-Read/Write-Close“-Modus. Am Beispiel eines Sockets, der die TCP-Protokollkommunikation verwendet, ist der Interaktionsprozess ungefähr so Dies
Der Server erstellt einen Socket basierend auf dem Adresstyp (IPv4, IPv6), dem Socket-Typ und dem Protokoll
Der Server bindet die IP-Adresse und Portnummer zum Socket
Der Server-Socket wartet auf Portnummernanfragen und ist jederzeit bereit, Verbindungen vom Client zu empfangen. Zu diesem Zeitpunkt ist der Socket des Servers nicht geöffnet
Der Client erstellt den Socket
Der Client öffnet den Socket und versucht gemäß der IP-Adresse und der Portnummer des Servers, eine Verbindung zum Server-Socket herzustellen
Der Server-Socket empfängt die Client-Socket-Anfrage und öffnet sie passiv und beginnt mit dem Empfang von Client-Anfragen, bis der Client Verbindungsinformationen zurückgibt. Zu diesem Zeitpunkt tritt der Socket in den Blockierungszustand ein. Das sogenannte Blockieren bedeutet, dass die Methode „accept()“ erst zurückkehrt, wenn der Client die Verbindungsinformationen zurückgibt und beginnt, die nächste Client-Verstehensanforderung zu empfangen.
Der Client stellt erfolgreich eine Verbindung her und sendet die Verbindungsstatusinformationen an den Server
Die Server-Akzeptanzmethode kehrt zurück und die Verbindung ist erfolgreich
Der Client schreibt Informationen in den Socket
Der Server liest die Informationen
Der Client wird geschlossen
Serverseitiges Herunterfahren
Drei-Wege-Handshake
Im Einfaches Verständnis von Socket-Protokoll stellt das TCP-Protokoll eine zuverlässige Verbindung durch Drei-Wege-Handshake her
Erster Handshake: Client Versuchen Sie, eine Verbindung zum Server herzustellen und ein Syn-Paket an den Server zu senden (Sequenznummern synchronisieren), syn = j, der Client wechselt in den Status SYN_SEND und wartet auf die Bestätigung des Servers
Der zweite Handshake: der Server empfängt das Client-Syn-Paket und bestätigt (ack=j+1) und sendet gleichzeitig ein SYN-Paket (syn=k), also ein SYN+ACK-Paket, an den Client. Zu diesem Zeitpunkt wechselt der Server in den SYN_RECV-Status
Dritter Handshake: Dritter Handshake: Client Der Client empfängt das SYN+ACK-Paket vom Server und sendet das Bestätigungspaket ACK (ack=k+1) an den Server. Nachdem das Paket gesendet wurde, werden der Client und der Der Server wechselt in den ESTABLISHED-Status und schließt den Drei-Wege-Handshake ab
Schauen Sie genauer hin. Der Teil, der die Verbindung zwischen dem Server-Socket und dem Client-Socket herstellt, ist eigentlich der berühmte Drei-Wege-Handshake
Socket-Programmier-API
Wie bereits erwähnt, ist der Socket „Open-Read“. Um den „Write-Close“-Modus zu implementieren, wollen wir kurz verstehen, welche APIs der Socket für Anwendungen bereitstellt Nehmen wir als Beispiel das TCP-Protokoll und schauen wir uns die Socket-API unter Unix an (PHP und sogar die Namen sind fast gleich). Hier erkläre ich kurz die Funktion und die Parameter der Methode. Studenten, die an der spezifischen Verwendung interessiert sind, können den Link in der Blog-Referenz überprüfen oder online suchen
int Einfaches Verständnis von Socket (int domain, int type, int Protocol);
Weisen Sie einen Socket-Deskriptor und die von ihm verwendeten Ressourcen basierend auf der angegebenen Adressfamilie, dem Datentyp und dem Protokoll zu.
Domäne: Protokollfamilie, häufig verwendete sind AF_INET, AF_INET6, AF_LOCAL, AF_ROUTE, wobei AF_INET die Verwendung der IPv4-Adresse darstellt
Typ: Socket-Typ, häufig verwendete Socket-Typen sind SOCK_STREAM, SOCK_DGRAM, SOCK_RAW, SOCK_PACKET, SOCK_SEQPACKET usw.
Protokoll: Protokoll. Zu den häufig verwendeten Protokollen gehören IPPROTO_TCP, IPPTOTO_UDP, IPPROTO_SCTP, IPPROTO_TIPC usw.
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
Geben Sie eine Adressfamilie ein Dem Socket wird eine bestimmte Adresse zugewiesen
sockfd:Socket-Deskriptor, also die Socket-Referenz
addr: die an sockfd zu bindende Protokolladresse
addrlen: die Länge der Adresse
Normalerweise wird der Server zu Beginn der Bereitstellung von Diensten an eine bekannte Adresse (z. B. IP-Adresse + Portnummer) gebunden, und Kunden können über diese eine Verbindung zum Server herstellen Sie müssen es nicht angeben, das System weist Ihnen automatisch eine Kombination aus Portnummer und Ihrer eigenen IP-Adresse zu. Aus diesem Grund ruft der Server normalerweise bind() auf, bevor er lauscht, aber der Client ruft es nicht auf. Stattdessen generiert das System zufällig eines, wenn connect().
int listen(int sockfd, int backlog);
Listening Einfaches Verständnis von Socket
sockfd: Socket-Deskriptor zum Abhören
backlog: entsprechendes The maximale Anzahl von Verbindungen, die ein Socket in die Warteschlange stellen kann
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
Mit einem Socket verbinden
sockfd: Socket-Deskriptor des Clients
addr: Socket-Adresse des Servers
addrlen: Länge der Socket-Adresse
int Accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen ; Ende Socket-Adresse
Socket-Inhalt lesen
fd: Socket-Deskriptor
buf: Puffer
Das Schreiben von Inhalten in den Socket bedeutet eigentlich das Senden von Inhalten
fd: Einfaches Verständnis von Socket descriptor
buf: buffer
Socket wird als geschlossen markiert, sodass der Referenzzähler des entsprechenden Socket-Deskriptors -1 ist. Der TCP-Client wird ausgelöst sendet eine Beendigungsanforderung an den Server.
Referenz
Linux-Socket-Programmierung (nicht beschränkt auf Linux)