Warum gibt es AF_NETLINK? Ist AF_UNIX nicht genug?

8

Soweit ich weiß, dient das AF_NETLINK-Socket-Protokoll zur Kommunikation zwischen dem Kernel und dem Userspace und AF_UNIX zur Kommunikation zwischen zwei Userspace-Prozessen.

Warum benötigt Linux einen separaten AF_NETLINK? Warum können UNIX-Sockets nicht für die Kommunikation zwischen Kernel und Benutzer verwendet werden?

Vi.
quelle

Antworten:

3

Die Ursprünge und Designmerkmale sind unterschiedlich. Im Allgemeinen ist es besser, ein Protokoll von Grund auf neu zu entwerfen, da Sie es dann speziell für Ihre Anforderungen anpassen können, ohne Probleme mit älteren Protokollen zu haben.

Ich glaube, dass diese Wahl darauf zurückzuführen ist, dass die kerninterne Implementierung von UNIX-Domänensockets zu unterschiedlich ist, um eine vernünftige Portierung auf die Benutzer-Kernel-Kommunikation zu ermöglichen. Die Liste der Protokolle für AF_NETLINK wurde speziell für die ioctl-ähnliche Steuerung entwickelt. AF_UNIX verwendet nicht einmal das Argument "protocol" für die socketFunktion. Und wenn sie die Definition irgendwie erweitern würden, um zusätzliche Protokolle zuzulassen, würde dies wahrscheinlich vorhandene Anwendungen beschädigen, und es wäre im Kernel sehr umständlich, die neuen Protokolle in den Kernel-Steuercode umzuleiten. Es kann auch ein Sicherheitsrisiko sein, diese beiden Funktionen zu überlappen (insbesondere da AF_UNIX ursprünglich nicht für diesen Zweck entwickelt wurde).

Und schließlich ... UNIX-Domain-Sockets verwenden das Dateisystem als Namespace (obwohl es einen Hack gibt, der "anonyme" Sockets zulässt). Als solche stehen sie sofort allen Benutzern zur Verfügung, die über Berechtigungen für diesen Socket verfügen. Um mit dem Kernel zu kommunizieren, muss irgendwo im Dateisystem (wahrscheinlich sys?) Eine immer geöffnete "Datei" vorhanden sein, die Benutzer verwenden würden Stellen Sie eine Verbindung zum Kernel her.

Kurz gesagt, sie sollen einfach für verschiedene Dinge verwendet werden. Selbst wenn Sie AF_NETLINK für zwei Userspace-Prozesse wiederverwenden können (dies geschieht anders als in AF_UNIX), würde das Gegenteil nicht wirklich funktionieren.

Orion
quelle
1
convey the information about the PID of the calling process-> SO_PEERCRED, SCM_CREDENTIALS?
Vi.
1
Ist es einfach, einen Vermittler zwischen AF_NETLINK-Client und -Server (wie bei AF_UNIX) zu stellen, um die Kommunikation zu überwachen oder zu verbessern (z. B. Kompatibilität bereitzustellen)?
Vi.