Menu Fermer

Unix socket : fonctionnement et utilisations

Les sockets que l’on pourrait traduire par prises permettent une communication entre deux processus différents sur une machine locale ou une machine distante.
Linux utilise les sockets classiques dit IP Socket mais supporte aussi son propre type de socket : Les Unix Socket (ou plutôt Unix Domain Socket)
Ces derniers prennent la forme de fichiers descripteurs.

Dans ce tutoriel, je vous explique ce que sont les Unix Socket, comment ils fonctionnent.
Enfin vous trouverez aussi les commandes pour lister les Unix Socket.

Unix socket : fonctionnement et utilisations

Qu’est-ce que les Unix Socket

Le socket permet communication réseau entre deux processus locaux ou distants.
Un Socket crée un point de terminaison pour la communication et renvoie un fichier descripteur qui fait référence à ce point de terminaison.
Linux, tout comme Windows, support TCP/IP Socket.

Mais dans Unix, chaque action d’E/S se fait en écrivant ou en lisant un fichier descripteur.
Un descripteur de fichier est juste un entier associé à un fichier ouvert et il peut s’agir d’une connexion réseau, d’un fichier texte, d’un terminal ou autre chose.
Généralement, le nom du fichier socket est configuré dans l’application.
Par exemple MySQL peut créer le socket suivant :

/var/lib/mysql/mysql.sock

PHP-FPM peut utiliser le socket suivant :

/run/php/php8.0-fpm.sock

Le nom propre pour Unix Sockets est Unix Domain Socket, car ils résident tous dans un seul ordinateur.
Dans un sens, les sockets sont un réseau qui est entièrement contenu dans le noyau Linux; Plutôt que d’utiliser des interfaces réseau pour envoyer des données, les mêmes données peuvent être envoyées directement entre les programmes.
Attention, si on parle de fichiers descripteurs, lors des communications aucune E/S sur le disque n’est effectué, toutes les opérations sont effectuées dans la mémoire du noyau Linux.

Enfin sachez que Linux supporte différents autres type de socket comme XDP (eXpress Data Path), les sockets SCTP, les sockets XDP

TCP/IP Socket VS Unix Socket

TCP/IP Socket ouvre un port réseau qui permet la communication avec un processus système.
C’est un mécanisme permettant une communication entre les processus sur le réseau.
Dans certains cas, vous pouvez utiliser des sockets TCP/IP pour communiquer avec des processus exécutés sur le même ordinateur (en utilisant l’interface Loopback).
Les TCP/IP Socket est assez inefficace pour cela, ainsi, l’Unix Domain Socket a été créé pour palier à certaines limitations.
Notamment ils peuvent éviter certaines vérifications et opérations (comme le routage); Ce qui les rend plus rapides et plus légers que les Socket IP.

Les performances peuvent aller de 15% à 20% selon certains benchmark.

Comment fonctionnent les sockets Unix

Il existe quatre types d’Unix sockets disponibles sur Linux.
Les deux premiers sont le plus couramment utilisés et les deux derniers sont rarement utilisés.

Stream Sockets – La livraison dans un environnement en réseau est garantie. Si vous envoyez un Stream socket, trois éléments “A, B, C”, ils arriveront dans le même ordre – “A, B, C”. Ces sockets utilisent le TCP (protocole de contrôle de transmission) pour la transmission des données. Si la livraison est impossible, l’expéditeur reçoit un indicateur d’erreur. Les enregistrements de données n’ont pas de limites.

Datagram Sockets – La livraison dans un environnement en réseau n’est pas garantie. Ils sont sans connexion parce que vous n’avez pas besoin d’avoir une connexion ouverte comme dans Stream Sockets – vous construisez un paquet avec les informations de destination et l’envoyez. Ils utilisent UDP (User Datagram Protocol).

Raw Sockets – Ceux-ci offrent aux utilisateurs l’accès aux protocoles de communication sous-jacents, qui prennent en charge les abstractions de socket. Ces sockets sont normalement orientés vers le datagramme, bien que leurs caractéristiques exactes dépendent de l’interface fournie par le protocole. Les sockets brutes ne sont pas destinées à l’utilisateur général; Ils ont été fournis principalement à ceux qui souhaitent développer de nouveaux protocoles de communication ou pour avoir accès à certaines des installations les plus cryptiques d’un protocole existant.

Sequenced Packet Sockets – Ils sont similaires à une prise de flux, à l’exception que les limites d’enregistrement sont préservées. Cette interface n’est fournie que dans le cadre de l’abstraction de socket de systèmes de réseau (NS) et est très important dans la plupart des applications NS. Les prises de paquet séquencées permettent à l’utilisateur de manipuler les en-têtes de protocole de paquets de séquence (SPP) ou les en-têtes de protocole de datagramme Internet (IDP) sur un paquet ou un groupe de paquets, soit en écrivant un en-tête prototype avec toutes les données à envoyer, soit par Spécifier un en-tête par défaut à utiliser avec toutes les données sortantes et permet à l’utilisateur de recevoir les en-têtes sur les paquets entrants.

Les processus sont supposés communiquer uniquement entre les socket du même type, mais il n’y a aucune restriction qui empêche la communication entre les sockets de différents types.

Comment lister les Unix Socket dans Linux

Netstat

Netstat est une commande de base réseau disponible dans toutes les distributions Linux.
Toutefois, elle commence à être considéré comme été dépréciée et remplacer par ss (voir plus bas).

Pour lister les connexions établies à travers les sockets Unix :

netstat -pn

Reportez vous dans la seconde partie Active UNIX domain sockets (w/o servers).
Le type de socket est indiqué DGRAM, STREAM, l’état et le programme attaché avec son PID.
Enfin Path indique le chemin.

Comment lister les Sockets Unix dans Linux avec netstat

Pour lister les sockets Unix en écoute :

netstat -lpn

Essentiellement on retrouve le même type d’information avec les colonnes identiques.

Comment lister les Sockets Unix dans Linux avec netstat

ss

ss (socket statistics) est utilisé pour vider les statistiques de socket. Il permet de montrer des informations similaires à Netstat. Il peut afficher plus d’informations TCP et d’état que les autres outils.

Pour lister les connexions établies utilisant des sockets Unix, utilisez l’option -x :

ss -x
Comment lister les Sockets Unix dans Linux avec ss

Pour lister les sockets unix en écoute (LISTENING), ajoutez l’option -l :

ss -x -l
Comment lister les Sockets Unix dans Linux avec ss

lsof

lsof (list open files) permet de lister les fichiers ouverts dans Linux.
Comme les sockets utilisent des fichiers descripteurs (comme la plupart des ressources sur Linux), vous pouvez aussi utiliser cette commande pour lister les unix domain socket.

Pour cela, on utilise l’option +E comme ceci :

lsof +E -aU
Comment lister les Sockets Unix dans Linux avec lsof