Unix-Sockets sind eine Form der Kommunikation zwischen zwei Prozessen, die als Datei auf der Festplatte angezeigt wird. Diese Datei kann von anderen Programmen verwendet werden, um sehr schnelle Verbindungen zwischen zwei oder mehr Prozessen ohne Netzwerk-Overhead herzustellen.
Was sind Sockets?
Sockets sind eine direkte Verbindung zwischen zwei Prozessen. Stellen Sie sich vor, Sie möchten Ihren Freund auf der Straße anrufen; Sie könnten einen Anruf tätigen und ihn über Ihre Telefongesellschaft und zurück zu ihrem Haus leiten lassen, oder Sie könnten eine Leitung direkt zu ihrem Haus führen und den Zwischenhändler ausschalten. Letzteres ist im wirklichen Leben offensichtlich unpraktisch, aber in der Unix-Welt ist es sehr üblich, diese direkten Verbindungen zwischen Programmen herzustellen.
Der richtige Name für Unix-Sockets ist Unix-Domain-Sockets, da sie sich alle auf einem Computer befinden. In gewisser Weise sind Sockets ein Netzwerk, das vollständig im Kernel enthalten ist; Anstatt Daten über Netzwerkschnittstellen zu senden, können dieselben Daten direkt zwischen Programmen gesendet werden.
Trotz der Erstellung von Dateien auf der Festplatte schreiben Unix-Sockets die Daten, die sie senden, nicht auf die Festplatte, da dies viel zu langsam wäre. Stattdessen werden alle Daten im Kernelspeicher aufbewahrt; Der einzige Punkt der Socket-Datei besteht darin, eine Referenz auf den Socket zu unterhalten und ihm Dateisystemberechtigungen zur Zugriffssteuerung zu geben. Beispielsweise befindet sich der MySQL-Socket normalerweise unter:
/var/lib/mysql/mysql.sock
Diese Datei enthält nichts und Sie sollten sie nicht direkt ändern , mit Ausnahme der erforderlichen Berechtigungen. Es ist nur ein Name.
Wie funktionieren Sockets?
Sockets stellen lediglich die eigentliche Hardware zum Verschieben von Daten bereit. TCP-basierte Sockets werden Stream-Sockets genannt, bei denen alle Daten der Reihe nach ankommen. UDP-basierte Sockets sind Datagramm-Sockets, bei denen die Bestellung (oder sogar die Lieferung) nicht garantiert ist. Es gibt auch Raw-Sockets, für die keine Einschränkungen gelten und die für die Implementierung verschiedener Protokolle und Dienstprogramme verwendet werden, die den Netzwerkverkehr auf niedriger Ebene überprüfen müssen, wie Wireshark.
Werbung
Sockets verwenden normalerweise immer noch TCP oder UDP, da sie nichts Besonderes sind, außer einer ausgefallenen Pipe innerhalb des Kernels. TCP und UDP sind Transportprotokolle, die definieren, wie Daten von Ort zu Ort gelangen, sich aber nicht wirklich darum kümmern, was die Daten sind. TCP und UDP bieten die Plattform für die meisten anderen Protokolle wie FTP, SMTP und RDP, die auf höheren Ebenen arbeiten.
Es ist möglich, dass eine Anwendung eine etwas andere Implementierung von TCP verwendet; Stream-Sockets verwenden das Protokoll SOCK_STREAM, das auch von TCP fast immer für den Transport verwendet wird, und obwohl sie im Grunde austauschbar sind, unterscheiden sie sich technisch geringfügig. Obwohl dies nur auf niedriger Ebene ist und Sie sich nicht wirklich Sorgen machen müssen, wissen Sie nur, dass der meiste Datenverkehr, der über UNIX-Domain-Sockets gesendet wird, TCP- oder UDP-basiert ist oder zumindest ziemlich ähnlich ist. , und TCP, das über UNIX-Domain-Sockets gesendet wird, ist schneller als TCP über Netzwerkschnittstellen wie Ports.
Socket-Nutzung in der Praxis
Unix-Sockets werden normalerweise als Alternative zu netzwerkbasierten TCP-Verbindungen verwendet, wenn Prozesse auf demselben Computer ausgeführt werden. Die Daten werden normalerweise immer noch über die gleichen Protokolle gesendet; es bleibt einfach auf derselben Maschine und weiß, dass es in derselben Domäne läuft (daher der Name UNIX-Domänen-Sockets), sodass es sich nie um eine Loopback-Netzwerkschnittstelle kümmern muss, um eine Verbindung zu sich selbst herzustellen.
Das größte Beispiel dafür ist Redis, ein extrem schneller Schlüsselwertspeicher, der vollständig im Speicher arbeitet. Redis wird häufig auf demselben Server verwendet, der darauf zugreift, sodass Sie normalerweise Sockets verwenden können. Bei solch niedrigen Pegeln und mit der Geschwindigkeit von Redis bieten Sockets in einigen synthetischen Benchmarks eine Leistungssteigerung von 25 %.
Wenn Sie eine Verbindung zu einer MySQL-Datenbank herstellen, können Sie auch einen Socket verwenden. Normalerweise verbinden Sie sich von einem Remote-System mit host:port, aber wenn Sie eine Verbindung zu einer Datenbank auf demselben Server herstellen (z. B. eine REST-API, die auf eine Datenbank zugreift), können Sie Sockets zur Beschleunigung verwenden . Dies hat keine Auswirkungen auf den normalen Gebrauch, ist aber unter Last sehr auffällig, über 20% auf einem High-End-24-Core mit 128 gleichzeitigen Benutzern und einer Million Abfragen pro Sekunde. Ob Sie einen Nutzen von Sockets sehen oder nicht, ist eine andere Geschichte, aber an diesem Punkt werden Sie wahrscheinlich sowieso nach Replikation und Lastenausgleich suchen.
Werbung
Wenn Sie manuell mit Sockets arbeiten möchten, können Sie sie mit dem Dienstprogramm socat über Netzwerkports verfügbar machen:
socat TCP-LISTEN:12345 UNIX-CONNECT:/var/lib/socket.sock
Dies funktioniert technisch machen den Zweck von Unix-Domain-Sockets zunichte, können aber zum Debuggen auf der Transportschicht verwendet werden.