Que sont les sockets Unix et comment fonctionnent-ils ?

Shutterstock / asharkyu

Les sockets Unix sont une forme de communication entre deux processus qui apparaît sous la forme d'un fichier sur le disque. Ce fichier peut être utilisé par d'autres programmes pour établir des connexions très rapides entre deux ou plusieurs processus sans surcharge du réseau.

Que sont les bouchons ?

Les sockets sont une connexion directe entre deux processus. Imaginez si vous vouliez appeler votre ami de la rue ; Vous pouvez passer un appel et l'envoyer via votre compagnie de téléphone et retourner chez vous, ou vous pouvez faire passer un câble directement chez vous et éliminer l'intermédiaire. Ce dernier est évidemment peu pratique dans la vie réelle, mais dans le monde Unix, il est très courant d'établir ces connexions directes entre programmes.

Le nom correct des sockets Unix est Socket de domaine Unix , car ils résident tous sur un seul ordinateur. Dans un sens, les sockets sont un réseau entièrement contenu dans le noyau ; au lieu d'utiliser des interfaces réseau pour envoyer des données, les mêmes données peuvent être envoyées directement entre les programmes.

Malgré la création de fichiers sur le disque, les sockets Unix n'écrivent pas réellement les données qu'ils envoient sur le disque, car cela serait trop lent. Au lieu de cela, toutes les données sont stockées dans la mémoire du noyau ; le seul point dans le fichier socket est de contenir une référence au socket et de lui donner des autorisations de système de fichiers pour contrôler l'accès. Par exemple, le socket MySQL est généralement à :

|__+_|

Ce fichier ne contient rien et vous ne devez pas le modifier directement, sauf pour les autorisations appropriées. C'est juste un nom.

Comment fonctionnent les prises ?

Les sockets fournissent simplement le matériel réel pour déplacer les données. Les sockets basés sur TCP sont appelés sockets de streaming, où toutes les données arriveront dans l'ordre. Les sockets basés sur UDP sont des sockets de datagramme, où la commande (ou même la livraison) n'est pas garantie. Il existe également des sockets bruts, qui ne sont pas restreints et sont utilisés pour implémenter divers protocoles et utilitaires qui doivent inspecter le trafic réseau de bas niveau, tels que Wireshark.

Les sockets utilisent généralement toujours TCP ou UDP car ils ne sont rien de spécial autre qu'un tuyau sophistiqué à l'intérieur du noyau. TCP et UDP sont des protocoles de transport qui définissent comment les données se déplacent d'un endroit à un autre, mais ils ne se soucient pas vraiment de ce que sont les données. TCP et UDP fournissent la plate-forme pour la plupart des autres protocoles, tels que FTP, SMTP et RDP, qui fonctionnent à des niveaux supérieurs.

Une application peut utiliser une implémentation TCP légèrement différente ; les prises de transmission utilisent le |__+_| protocole, qui est ce que TCP utilise aussi presque toujours pour le transport, et bien qu'ils soient essentiellement interchangeables, ils sont techniquement légèrement différents. Bien que ce soit une chose de bas niveau et pas vraiment quelque chose dont vous devez vous inquiéter, sachez simplement que plus le trafic envoyé sur les sockets de domaine UNIX est basé sur TCP ou UDP, ou au moins assez similaire, et le TCP envoyé sur les sockets de domaine UNIX est plus rapide que le TCP sur les interfaces réseau telles que les ports.

Utilisation de la prise en pratique

Les sockets Unix sont généralement utilisés comme alternative aux connexions TCP basées sur le réseau lorsque les processus s'exécutent sur la même machine. Les données sont toujours envoyées normalement sur les mêmes protocoles ; il reste simplement à l'intérieur de la même machine et sait qu'il s'exécute sur le même domaine (d'où le nom de socket de domaine UNIX), de sorte qu'il n'a jamais à perturber une interface réseau de bouclage pour se connecter à lui-même.

Le meilleur exemple en est Redis, un magasin clé-valeur extrêmement rapide qui fonctionne entièrement en mémoire. Redis est souvent utilisé sur le même serveur qui y accède, vous pourrez donc généralement utiliser des sockets. À des niveaux aussi bas et avec la vitesse de Redis, les sockets offrent une amélioration des performances de 25 % sur certains benchmarks synthétiques.

Si vous vous connectez à une base de données MySQL, vous pouvez également utiliser un socket. Normalement, vous vous connecteriez à |__+_| depuis un système distant, mais si vous vous connectez à une base de données sur le même serveur (par exemple, une API REST accédant à une base de données), vous pouvez utiliser des sockets pour l'accélérer. Cela n'affectera pas l'utilisation normale, mais c'est très perceptible en cas de charge, plus de 20% sur un cœur haut de gamme à 24 cœurs avec 128 utilisateurs simultanés et un million de requêtes par seconde. Que vous voyiez ou non un avantage des sockets est une autre histoire, mais à ce stade, vous voudrez probablement envisager la réplication et l'équilibrage de charge de toute façon.

Si vous voulez travailler avec les sockets manuellement, vous pouvez utiliser le |__+_| utilitaire pour les exposer sur les ports réseau :

|__+_|

Cela va techniquement à l'encontre de l'objectif des sockets de domaine Unix, mais peut être utilisé pour le débogage au niveau du transport.

Qu'est-ce que tu penses?