Que sont les sockets Unix et comment fonctionnent-ils?
Les sockets Unix sont une forme de communication entre deux processus qui apparaît sous forme de fichier sur disque. Ce fichier peut être utilisé par d'autres programmes pour établir des connexions très rapides entre deux ou plusieurs processus sans aucune surcharge réseau.
Sommaire
Que sont les sockets?
Les sockets sont une connexion directe entre deux processus. Imaginez si vous vouliez appeler votre ami sur la route; vous pouvez passer un appel en le faisant acheminer par l'intermédiaire de votre compagnie de téléphone et le ramener chez eux, ou vous pouvez faire passer un fil directement à leur maison et couper l'intermédiaire. Ce dernier est évidemment peu pratique dans la vie réelle, mais dans le monde d’Unix, il est très courant d’établir ces connexions directes entre programmes.
Le nom propre des sockets Unix est Sockets de domaine Unix, car ils résident tous dans un même ordinateur. Dans un sens, les sockets sont un réseau qui est entièrement contenu dans le noyau; plutôt que d'utiliser des interfaces réseau pour envoyer des données, ces mêmes données peuvent être envoyées directement entre les programmes.
Malgré la création de fichiers sur disque, les sockets Unix n'écrivent pas réellement les données qu'elles envoient sur le disque, car ce serait beaucoup trop lent. Au lieu de cela, toutes les données sont conservées dans la mémoire du noyau; le seul point du fichier socket est de conserver 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 de MySQL est généralement à:
/var/lib/mysql/mysql.sock
Ce fichier ne contient rien et vous ne devez pas le modifier directement, à l'exception des autorisations le cas échéant. C’est juste un nom.
Comment fonctionnent les sockets?
Les sockets fournissent simplement le matériel réel pour déplacer les données. Les sockets TCP sont appelés sockets de flux, où toutes les données arriveront dans l'ordre. Les sockets UDP sont des sockets datagrammes, où la commande (ou même la livraison) n'est pas garantie. Il existe également des sockets bruts, qui ne sont soumis à aucune restriction, et sont utilisés pour mettre en œuvre différents protocoles et utilitaires qui doivent inspecter le trafic réseau de bas niveau, comme Wireshark.
Les sockets utilisent généralement encore TCP ou UDP, car ils ne sont rien de spécial autre qu'un tube sophistiqué au sein du noyau. TCP et UDP sont des protocoles de transport qui définissent comment les données sont acheminées d’un endroit à l’autre, mais ne se soucient pas vraiment de leur nature. TCP et UDP fournissent la plate-forme pour la plupart des autres protocoles tels que FTP, SMTP et RDP, qui fonctionnent à des niveaux plus élevés.
Il est possible pour une application d'utiliser une implémentation légèrement différente de TCP; les sockets de flux utilisent le SOCK_STREAM
protocole, qui est ce que TCP utilise également pour le transport presque tout le temps, et bien qu'ils soient fondamentalement interchangeables, ils sont techniquement légèrement différents. Bien que ce soit des choses de bas niveau et que ce ne soit pas vraiment quelque chose dont vous aurez à vous soucier, sachez simplement que plus le trafic envoyé via les sockets de domaine unix est basé sur TCP ou UDP, ou du moins assez similaire, et TCP envoyé sur les sockets de domaine unix est plus rapide que TCP sur des interfaces réseau telles que les ports.
Utilisation du socket 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 généralement toujours envoyées via les mêmes protocoles; il reste juste dans la même machine et sait qu'il fonctionne dans le même domaine (d'où le nom sockets de domaine unix), donc il n'a jamais à déranger une interface réseau de bouclage pour se connecter à lui-même.
Le plus grand exemple en est Redis, un magasin de valeurs clés extrêmement rapide qui fonctionne entièrement dans la mémoire. Redis est fréquemment 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 fournissent une augmentation de 25% des performances dans certains benchmarks synthétiques.
Si vous vous connectez à une base de données MySQL, vous pouvez également utiliser un socket. Habituellement, vous vous connectez à host:port
à partir d'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 accélérer. Cela n'affectera pas l'utilisation normale, mais est très perceptible en cas de charge, plus de 20% sur un 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 vous pencher de toute façon sur la réplication et l'équilibrage de charge.
Si vous souhaitez travailler manuellement avec les sockets, vous pouvez utiliser le socat
utilitaire pour les exposer sur les ports réseau:
socat TCP-LISTEN:12345 UNIX-CONNECT:/var/lib/socket.sock
Cela va techniquement à l'encontre de l'objectif des sockets de domaine Unix mais peut être utilisé pour le débogage au niveau de la couche de transport.