
Les sockets Unix sont un forme de communication entre deux processus qui apparaît sous forme de 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 aucune surcharge réseau.
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 pour qu'il soit acheminé via votre compagnie de téléphone et redescendre chez eux, ou vous pouvez faire passer un fil directement chez eux et couper 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 les programmes.
Le nom propre des sockets Unix est Unix Domain Sockets, car ils résident tous sur un seul ordinateur. Dans un sens, les sockets sont un réseau 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 le disque, les sockets Unix n'écrivent pas réellement les données qu'ils envoient sur le disque, car cela 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 maintenir une référence à la socket, et de lui donner les permissions du 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 devriez pas le modifier directement , à l'exception des autorisations le cas échéant. Ce n'est qu'un nom.
Comment fonctionnent les sockets ?
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 flux, où toutes les données arriveront dans l'ordre. Les sockets basés sur UDP sont des sockets de datagrammes, où l'ordre (ou même la livraison) n'est pas garanti. Il existe également des sockets bruts, qui n'ont aucune restriction, et sont utilisés pour implémenter différents protocoles et utilitaires qui doivent inspecter le trafic réseau de bas niveau, comme Wireshark.
Publicité
Les sockets utilisent généralement toujours TCP ou UDP, car ils ne sont rien de spécial autre qu'un tuyau sophistiqué dans le noyau. TCP et UDP sont des protocoles de transport qui définissent comment les données se déplacent d'un endroit à l'autre, mais 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.
Il est possible qu'une application utilise une implémentation légèrement différente de TCP ; Les sockets de flux utilisent le protocole SOCK_STREAM, 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 qu'il s'agisse de choses de bas niveau et que ce ne soit pas vraiment quelque chose dont vous aurez à vous soucier, sachez simplement que la plupart du trafic envoyé via les sockets de domaine UNIX est basé sur TCP ou UDP, ou du moins assez similaire à celui-ci. , et TCP envoyé sur les sockets de domaine UNIX est plus rapide que TCP sur les interfaces réseau comme les ports.
Utilisation des sockets en pratique
Les sockets Unix sont généralement utilisées 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 simplement dans la même machine et sait qu'il s'exécute dans le même domaine (d'où le nom de 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 de ceci est Redis, un magasin clé-valeur extrêmement rapide qui fonctionne entièrement en 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 rapidité de Redis, les sockets offrent une augmentation des performances de 25 % dans certains tests de performances 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 visible 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 sur la réplication et l'équilibrage de charge de toute façon.
Publicité
Si vous souhaitez utiliser les sockets manuellement, vous pouvez utiliser l'utilitaire socat pour les exposer sur les ports réseau :
socat TCP-LISTEN:12345 UNIX-CONNECT:/var/lib/socket.sock
Ceci est techniquement va à 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.