Berkeley sockets
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
- (en) Jean J. Labrosse - Jack G Ganssle - Robert Oshana ett Colin Walls,Embedded Software: Know It All,Elsevier - 2008, (ISBN 9780750685832)
- (en)Michael J. Donahoo - Kenneth L. Calvert,TCP/IP Sockets in C: Practical Guide for Programmers,Morgan Kaufmann - 2009, (ISBN 9780123745408)
- W. Richard Stevens - Bill Fenner et Andrew M. Rudoff,UNIX Network Programming: Vol. 1: The Sockets Networking API,Addison-Wesley Professional - 2004, (ISBN 9780131411555)
- M. Tim Jones,Gnu/Linux Application Programming,Cengage Learning - 2005, (ISBN 9781584503712)
- Les processus communiquant via NFS ne font pas partie de ce domaine.
Liens internes
Liens externes
- Les sockets en Langage C
- Guide pour la programmation réseaux, Unix (Utilisation des sockets Internet)