133 votes

Comment fonctionne la fonction accept () de l'API de socket?

L'API socket est le standard de facto pour le protocole TCP/IP et UDP/IP communications (code de mise en réseau comme nous le savons). Cependant, l'une de ses fonctions essentielles, en accept() est un peu magique.

Pour emprunter un semi-formel de la définition:

accept() est utilisée sur le serveur. Il accepte un reçu entrant tentative pour créer une nouvelle connexion TCP le client distant, et crée un nouveau prise associée avec le socket paire d'adresses de cette connexion.

En d'autres termes, accept renvoie un nouveau socket par le biais de laquelle le serveur peut communiquer avec le nouveau client. L'ancienne douille ( accept a été appelé) reste ouverte, sur le même port, à l'écoute de nouvelles connexions.

Comment est - accept travail? Comment est-il mis en œuvre? Il y a beaucoup de confusion sur ce sujet. Beaucoup de gens prétendent accepter ouvre un nouveau port et vous communiquer avec le client à travers elle. Mais ce n'est évidemment pas vrai, car aucun nouveau port est ouvert. Vous pouvez réellement communiquer via le même port avec différents clients, mais comment? Lorsque plusieurs threads appellent recv sur le même port, comment les données pour savoir où aller?

Je suppose que c'est quelque chose le long des lignes de l'adresse du client associé à un descripteur de socket, et chaque fois que les données proviennent de recv il est acheminé à la prise correcte, mais je ne suis pas sûr.

Ce serait formidable pour obtenir une explication approfondie des rouages de ce mécanisme.

151voto

17 of 26 Points 15941

Votre confusion réside dans le fait de penser qu'une socket est identifié par le Serveur IP : Port du Serveur. Alors qu'en réalité, les sockets sont identifiés de manière unique par un quatuor d'information:

Client IP : Client Port et Server IP : Server Port

Ainsi, alors que l'IP du Serveur et le Port du Serveur sont constants dans toutes les connexions, côté client, l'information est ce qui lui permet de garder une trace de l'endroit où tout se passe.

Exemple pour clarifier les choses:

Disons que nous avons un serveur à 192.168.1.1:80 et deux clients, 10.0.0.1 et 10.0.0.2.

10.0.0.1 ouvre une connexion sur le port local 1234 et se connecte au serveur. Maintenant que le serveur a un socket identifiés comme suit:

10.0.0.1:1234 - 192.168.1.1:80

Maintenant 10.0.0.2 ouvre une connexion sur le port local 5678 et se connecte au serveur. Maintenant que le serveur dispose de deux prises identifiées comme suit:

10.0.0.1:1234 - 192.168.1.1:80
10.0.0.2:5678 - 192.168.1.1:80

80voto

Methos Points 1259

Juste pour ajouter à la réponse donnée par l'utilisateur "17 de 26"

Le support se compose en réalité de 5 tuple - (ip source, port source, adresse ip de destination, le port de destination, le protocole). Ici, le protocole TCP ou UDP ou de tout protocole de couche transport. Ce protocole est identifié dans le paquet de l' "protocole" de terrain dans le datagramme IP.

Ainsi, il est possible d'avoir différentes applications sur le serveur de communication pour le même client sur exactement les mêmes 4-n-uplets, mais différentes dans le champ de protocole. Par exemple

Apache à côté serveur de parler (server1.com:880-client1:1234 sur TCP) et World of warcraft parler (server1.com:880-client1:1234 sur UDP)

À la fois le client et le serveur va traiter cela comme champ de protocole dans le paquet IP dans les deux cas est différent, même si toutes les 4 autres champs sont les mêmes.

15voto

a2800276 Points 1841

Ce qui me confond, quand j'étais en apprenant cela, était que les termes socket et port suggèrent qu'ils sont quelque chose de physique, alors qu'en fait, ils sont juste des structures de données du noyau utilise pour abstraire les détails de la mise en réseau.

En tant que tel, les structures de données sont mis en œuvre pour être en mesure de distinguer les connexions à partir de différents clients. Quant à la façon dont ils sont mis en œuvre, la réponse est soit un.) il n'a pas d'importance, le but de l'API sockets, c'est précisément que la mise en œuvre ne devrait pas d'importance ou b.) juste un coup d'oeil. En dehors de la très recommandé Stevens livres de fournir une description détaillée de la mise en œuvre, consultez la source sous Linux ou Solaris ou l'un des BSD.

5voto

Paul Tomblin Points 83687

À l'époque où je travaillais à Gandalf Canada (autour de 1992-93), le syndrome de Stevens livre "TCP/IP Illustrated" a été inestimable pour la compréhension de tous les aspects de la communication en réseau. Malheureusement, je n'ai pas conservé assez pour répondre à votre question, mais je pari que livre. Il y a aussi une suite, "TCP/IP Illustrated: La mise en Œuvre".

4voto

mkorszun Points 786

J'ai trouvé cette présentation très utile. Il explique étape par étape comment les attributs de socket sont définis dans le tampon de contrôle de protocole lors du flux bind / listen / accept.

Ma question serait la suivante: existe-t-il une relation entre la prise de contact TCP et l'acceptation d'un appel? Accepter le déclencheur d’appel SYN-ACK en cours de renvoi pour permettre l’établissement de la connexion?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X