PROJET Poker sur python

Sommaire :

Berkeley sockets

Berkeley Sockets Interface ou simplement sockets,est un ensemble normalisé de fonctions de communication lancé 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 de programmation est proposée dans quasiment tous les langages de programmation populaires (Java, C#, C++, …).

La notion sur laquelle est construite cette interface sont les sockets (en français « interfaces de connexion » mais aussi « ports, points de connexion, connecteurs logiciels ») par lesquelles une application peut se brancher à un réseau et communiquer ainsi avec une autre application branchée depuis un autre ordinateur.

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 inversement. Il existe différents modèles de prises, en fonction des protocoles réseau; le plus fréquent sont les sockets TCP/IP. La première interface de programmation (anglais API pour application programming interface) mettant en œuvre les sockets 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.

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.

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é.

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.

Chaque socket possède un type et un ou plusieurs processus qui lui sont associés. Il est également caractérisé par le domaine de communication dans lequel il 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, un socket ne peut échanger des données qu'avec un socket se trouvant dans le même domaine de communication.

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

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 eux 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 :

Socket réseau

Les sockets réseau sont utilisés pour communiquer avec des services hébergés sur d'autres machines (site web, imprimante réseau, ...). Ils sont utilisés dans le cadre d'une communication IP. Selon la manière dont ils sont configurés, ils peuvent émettre et recevoir des messages vers et depuis plusieurs ordinateurs sur le même réseau (le multicast).

Un socket réseau se caractérise par la combinaison des éléments suivants :

Socket UNIX

Les sockets du domaine UNIX sont un moyen de communication inter-processus utilisant le système de fichiers comme espace de nommage. Ils rendent l'accès à un même service (DBus, X.org, ...) pour plusieurs clients plus facile qu'avec de simples tubes nommés. La communication se produit entièrement dans le noyau du système d'exploitation.

Il est possible de réguler l'accès à ces sockets à l'aide des permissions UNIX (un socket du domaine UNIX reste un inode dans le système de fichiers). Le serveur peut également déterminer l'UID des programmes qui se connectent, permettant de réaliser une authentification sans mot de passe.

En plus d'envoyer des données, ces processus peuvent envoyer des descripteurs de fichiers sur un socket du domaine UNIX à l'aide des API « sendmsg » et « recvmsg ».

Socket raw

Les sockets raw reçoivent les paquets bruts avec leur en-tête, et elles n'ajoutent automatiquement un en-tête lorsque l'on envoie les paquets que si on le demande dans une option de la socket. Une utilisation possible des sockets raw est de développer de nouveaux protocoles de couche transport en espace utilisateur.

Les sockets raw sont nécessaires aux protocoles qui sont directement encapsulés dans IP, sans passer par TCP ni UDP. On peut par exemple citer le protocole de gestion de groupes de multidiffusion IGMP, le protocole de routage dynamique OSPF, ainsi que le protocole ICMP utilisé par la commande ping.

Enfin, on peut s'en servir pour créer des paquets TCP ou UDP inhabituels. En particulier, un pirate informatique pourra contrefaire des paquets dans l'intention de nuire ou de s'introduire dans un système (voir plus bas).

Application sur le projet

Ici, dans le projet Poker sur Python, le type de socket utilisé est le socket stream et c'est un socket réseau, puisque c'est le plus accessible et le plus sûr.