[go: nahoru, domu]

Aller au contenu

Berkeley sockets

Un article de Wikipédia, l'encyclopédie libre.
Ceci est une version archivée de cette page, en date du 29 novembre 2012 à 23:41 et modifiée en dernier par Silex6 (discuter | contributions). Elle peut contenir des erreurs, des inexactitudes ou des contenus vandalisés non présents dans la version actuelle.

Berkeley Sockets Interface ou sockets tout court, est une interface de programmation de communication lancée par l'université de Berkeley au début des années 1980 pour leur Berkeley Software Distribution (abr. BSD). 30 ans après son lancement, cette interface est proposée dans quasiment tous les langages de programmation populaires (Java, C#, C++, ...)[1].

La notion sur laquelle est construite cette interface sont les socket (en français les prises de courant)[1] - par lesquelles une application peut se brancher à un réseau et communiquer ainsi avec une autre application branchée depuis un autre ordinateur.

Avant leur introduction, le seul mécanisme standard qui permettait à deux processus de communiquer se faisait par l'intermédiaire des pipes.[réf. nécessaire]

Fonctionnalités

Un socket représente une prise par laquelle une application peut envoyer et recevoir des données. Cette prise permet à l'application de se brancher sur un réseau et communiquer avec d'autres applications qui y sont branchées. Les informations écrites sur une prise depuis une machine sont lues sur la prise d'une autre machine, et inversément. Il existe différents modèles de prises, en fonction des protocoles réseau; le plus fréquent sont les socket TCP/IP[2]. La première interface de programmation (anglais API pour application programming interface) mettant en oeuvre les socket a été développée par l'université de Berkeley pour leur Unix, dans les années 1980. C'est un des premiers produits open source de l'histoire[2].

La fonction socket de cette API sert à créer un certain type de prise. Le type de prise sera choisi en fonction de la technologie de communication à utiliser (par exemple TCP/IP). L'API permet à un logiciel serveur de servir plusieurs clients simultanément. Sur les systèmes d'exploitation Unix le programme serveur utilisera la fonction fork pour chaque demande d'un client[3].

Une connexion est établie entre le client et le serveur en vue de permettre la communication. la fonction connect permet à un client de demander la connexion à un serveur, et la fonction accept permet à un serveur d'accepter cette connexion. Le programme serveur utilisera préalablement la fonction listen pour informer le logiciel sous-jacent qu'il est prêt à recevoir des connexions. Une fonction close permet de terminer la connexion. Lorsqu'un des deux interlocuteurs termine la connexion, l'autre est immédiatement avisé[4].

Une fois la connexion établie, les fonctions send et recv servent respectivement à envoyer et à recevoir des informations. Une fonction auxiliaire gethostbyname permet d'obtenir l'adresse IP d'une machine en interrogeant le DNS, adresse qui sera utilisée par d'autres fonctions de l'API[4].

Généralités

Chaque socket possède un type et un ou plusieurs processus qui lui sont associés. Elle est également caractérisée par le domaine de communication dans lequel elle se trouve. Ce dernier est une abstraction qui permet de regrouper les processus ayant des propriétés communes et communiquant par l'intermédiaire de sockets. Normalement, une socket ne peut échanger des données qu'avec une socket se trouvant dans le même domaine de communication.

La communication inter-processus de 4.3BSD supportait trois domaines de communication :

  • le domaine Unix dans lequel deux processus se trouvant sur la même station Unix uniquement peuvent communiquer[5] ;
  • le domaine Internet pour les processus utilisant le protocole TCP/IP pour communiquer entre eux ;
  • le domaine NS pour les processus échangeant des données en utilisant le protocole standard de Xerox.

Types de sockets

Les différents types de sockets dépendent de quelques propriétés visibles par le programmeur. Rien n'empêche deux sockets de types différents de communiquer entre elles si le protocole utilisé le supporte — même si les processus sont supposés communiquer uniquement par des sockets de même type.

Il existe généralement quatre types de sockets.

Une socket stream permet une communication bidirectionnelle, sûre, séquencée et un flux de données sans duplication pouvant entraîner une fragmentation des paquets transmis. Dans le domaine Internet, il s'agit du protocole TCP.

Une socket datagram permet une communication bidirectionnelle qui n'est pas séquencée, pas sûre, et peut éventuellement entraîner une duplication des données. Un processus utilisant ce type de socket peut donc recevoir les données dans un ordre différent de l'ordre de départ. Dans le domaine Internet, il s'agit du protocole UDP.

Une socket raw permet d'accéder au contenu brut des paquets de données. Les sockets raw ne sont pas destinées aux utilisateurs courants — seul l'utilisateur root peut y avoir accès sur la plupart des systèmes UNIX® — et sont utilisées par exemple pour analyser le trafic d'un réseau.

Une socket sequenced packet ressemble à une socket stream sauf qu'elle n'utilise pas de fragmentations de paquets.

Notes et références

  1. a et b (en) Jean J. Labrosse - Jack G Ganssle - Robert Oshana ett Colin Walls,Embedded Software: Know It All,Elsevier - 2008, (ISBN 9780750685832)
  2. a et b (en)Michael J. Donahoo - Kenneth L. Calvert,TCP/IP Sockets in C: Practical Guide for Programmers,Morgan Kaufmann - 2009, (ISBN 9780123745408)
  3. W. Richard Stevens - Bill Fenner et Andrew M. Rudoff,UNIX Network Programming: Vol. 1: The Sockets Networking API,Addison-Wesley Professional - 2004, (ISBN 9780131411555)
  4. a et b M. Tim Jones,Gnu/Linux Application Programming,Cengage Learning - 2005, (ISBN 9781584503712)
  5. Les processus communiquant via NFS ne font pas partie de ce domaine.

Liens internes

Liens externes