Maison >développement back-end >Problème PHP >Comment comprendre le socket php

Comment comprendre le socket php

王林
王林avant
2020-01-23 19:01:463303parcourir

Comment comprendre le socket php

Qu'est-ce qu'une prise ?

Socket est une couche d'abstraction entre la couche application et la couche transport. Il résume les opérations complexes de la couche TCP/IP en plusieurs interfaces simples permettant à la couche application d'appeler le processus d'implémentation dans le réseau. . communication. Socket est originaire d'UNIX. Selon l'idée UNIX selon laquelle tout est un fichier, la communication inter-processus est appelée descripteur de fichier. Socket est une implémentation du mode "ouverture-lecture/écriture-fermeture" Serveur et client Chaque client gère un "fichier". ". Une fois la connexion établie et ouverte, le contenu peut être écrit dans le fichier pour que l'autre partie puisse le lire ou le contenu de l'autre partie peut être lu. Le fichier est fermé à la fin de la communication.

L'image montre l'emplacement du Socket :

Comment comprendre le socket php

Processus de communication du Socket

Socket garantit que la communication entre communication entre différents ordinateurs, c'est-à-dire la communication réseau. Pour les sites Web, le modèle de communication est la communication entre le serveur et le client. Un objet Socket est établi aux deux extrémités, puis les données sont transmises via l'objet Socket. Habituellement, le serveur est dans une boucle infinie, attendant que le client se connecte.

Partage de didacticiels vidéo d'apprentissage associés : tutoriel vidéo PHP

L'image suivante est un chronogramme TCP orienté connexion :

Comment comprendre le socket php

Processus client :

Le processus client est relativement simple, créez un Socket, connectez-vous au serveur et connectez le Socket à l'hôte distant (remarque : seul TCP a le concept de « connexion », certains Sockets tels que UDP, ICMP et ARP n'ont pas le concept de « connexion »), envoient des données, lisent les données de réponse, jusqu'à ce que l'échange de données soit terminé, ferment la connexion et mettent fin à la conversation TCP.

Comment comprendre le socket php

La méthode send() est également disponible ici : la différence est que sendall() essaiera d'envoyer toutes les données avant de revenir, et renvoie None en cas de succès, tandis que send( ) renvoie send Le nombre d'octets, une exception sera levée en cas d'échec.

Processus serveur :

Parlons du processus serveur. Le serveur initialise d'abord le Socket, établit un socket de streaming et communique avec l'adresse locale et le port Bind. , puis informez TCP qu'il est prêt à recevoir des connexions, appelez accept() pour bloquer et attendez une connexion du client. Si le client établit une connexion avec le serveur à ce moment-là, le client envoie une demande de données, le serveur reçoit la demande et traite la demande, puis envoie les données de réponse au client, et le client lit les données jusqu'à l'échange de données. est terminé. Enfin, la connexion est fermée et l'interaction se termine.

Comment comprendre le socket php

Lorsque accept() est appelé, le Socket entrera dans l'état d'attente. Lorsque le client demande une connexion, la méthode établit la connexion et retourne au serveur. accept() renvoie un tuple avec deux éléments (conn, addr). Le premier élément conn est le nouvel objet Socket via lequel le serveur doit communiquer avec le client ; le deuxième élément addr est l'adresse IP et le port du client. data = conn.recv(1024)

L'étape suivante est la phase de traitement, où le serveur et le client communiquent (transmettent des données) via send() et recv().

Le serveur appelle send() et envoie des informations au client sous la forme d'une chaîne send() renvoie le nombre de caractères envoyés.

Le serveur appelle recv() pour recevoir des informations du client. Lors de l'appel de recv() , le serveur doit spécifier un entier qui correspond à la quantité maximale de données pouvant être reçues avec cet appel de méthode. recv() entrera dans l'état bloqué lors de la réception des données et renverra enfin une chaîne pour représenter les données reçues. Si la quantité de données envoyées dépasse ce que permet recv(), les données seront tronquées. Les données excédentaires seront mises en mémoire tampon à la réception. Lorsque recv() sera appelé ultérieurement, les octets restants continueront à être lus. S'il y a des données excédentaires, elles seront supprimées du tampon (ainsi que le client pourra le faire). ont envoyé depuis le dernier appel à recv() d'autres données). Une fois la transmission terminée, le serveur appelle la fonction close() de Socket pour fermer la connexion.

Examinez le processus Socket du point de vue de la connexion TCP :

Le processus Socket de la négociation à trois voies TCP :

Comment comprendre le socket php

1. Une fois que le serveur a appelé socket(), bind() et Listen() pour terminer l'initialisation, il appelle accept() pour bloquer et attendre

2. () et envoie un SYN et un blocage ;

3. Le serveur termine la première poignée de main, c'est-à-dire envoie les réponses SYN et ACK

4. server, connect() Renvoie et envoie un ACK au serveur ;

5. L'objet Socket du serveur reçoit la troisième confirmation ACK de poignée de main du client. À ce moment, le serveur revient de accept() pour établir une connexion.

L'étape suivante consiste pour les objets de connexion aux deux extrémités à s'envoyer et à recevoir des données.

Processus de socket TCP de quatre vagues :

Comment comprendre le socket php

1. Un processus de candidature appelle close() pour fermer activement et envoyer un FIN ; >2. Une fois que l'autre extrémité a reçu le FIN, elle ferme passivement le Socket et envoie une confirmation ACK

3 Ensuite, le processus d'application qui exécute passivement l'arrêt appelle close() pour fermer le Socket et également. envoie un FIN

4. L'extrémité qui reçoit ce FIN l'accuse avec ACK de l'autre extrémité.

Résumé :

Le code ci-dessus démontre simplement l'utilisation des fonctions de base de Socket. En fait, quelle que soit la complexité du programme réseau, ces fonctions de base seront utilisées. Le code du serveur ci-dessus ne traitera qu'une seule demande client avant de traiter la demande client suivante. Un tel serveur a des capacités de traitement très faibles. En pratique, les serveurs doivent avoir des capacités de traitement simultanées. Afin d'obtenir un traitement simultané, le serveur doit effectuer un fork. Un nouveau processus ou thread gère la demande.

Articles et tutoriels connexes recommandés :

Tutoriel php

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer