为什么会有AF_NETLINK? AF_UNIX 还不够吗?

为什么会有AF_NETLINK? AF_UNIX 还不够吗?

据我了解,AF_NETLINK套接字协议用于内核和用户空间之间的通信,AF_UNIX用于两个用户空间进程之间的通信。

为什么Linux需要单独的AF_NETLINK?为什么UNIX套接字不能用于内核和用户之间的通信?

答案1

起源和设计特点不同。从头开始设计协议通常是一个更好的主意,因为这样您就可以使其特别适合您的需要,而不会遇到遗留协议的问题。

我相信这种选择是因为 UNIX 域套接字的内核实现差异太大,无法正常移植到用户内核通信。 AF_NETLINK 的协议列表专门设计用于提供类似 ioctl 的控制。 AF_UNIX 甚至不使用该socket函数的“协议”参数。如果他们以某种方式扩展定义以允许其他协议,则可能会破坏现有应用程序,并且在内核中将新协议重定向到内核控制代码将非常尴尬。重叠这两个功能也可能存在安全风险(特别是因为 AF_UNIX 最初设计时并未考虑到这一点)。

最后... UNIX 域套接字使用文件系统作为名称空间(尽管有一个允许“匿名”套接字的 hack)。因此,所有拥有该套接字权限的用户都可以立即使用它们——为了与内核进行通信,文件系统中的某个位置(可能是 sys?)需要有一个始终打开的“文件”,用户可以使用它来连接到内核。

简而言之,它们只是用于不同的用途。即使您可以为两个用户空间进程重用 AF_NETLINK(其执行方式与 AF_UNIX 中不同),相反的情况也不会真正起作用。

相关内容