linux – 为什么有AF_NETLINK? AF_UNIX还不够吗?
作者:互联网
据我所知,AF_NETLINK套接字协议用于内核和用户空间之间的通信,AF_UNIX用于两个用户空间进程之间的通信.
为什么Linux需要单独的AF_NETLINK?为什么UNIX套接字不能用于内核和用户之间的通信?
解决方法:
起源和设计特征是不同的.从头开始设计协议通常是一个更好的主意,因为这样您就可以使它特别适合您的需求,而不会遇到传统协议的问题.
我认为这种选择是因为UNIX域套接字的内核实现太不同了,无法将智能移植到用户内核通信. AF_NETLINK的协议列表专门用于提供类似ioctl的控制. AF_UNIX甚至不使用套接字函数的“protocol”参数.如果他们以某种方式扩展了定义以允许其他协议,它可能会破坏现有的应用程序,并且在内核中将新协议重定向到内核控制代码会非常尴尬.重叠这两个功能也可能存在安全风险(特别是因为AF_UNIX最初并未考虑到这一点而设计).
最后…… UNIX域套接字使用文件系统作为命名空间(虽然有一个允许“匿名”套接字的hack).因此,对于拥有此套接字权限的所有用户,它们立即可用 – 与内核通信,文件系统中的某个地方(sys可能是?)需要一个始终打开的“文件”,用户可以使用它连接到内核.
简而言之,它们只是用于不同的事情.即使你可以为两个用户空间进程重用AF_NETLINK(它的完成方式与AF_UNIX不同),但相反的方法却无法正常工作.
标签:linux,linux-kernel,unix-sockets 来源: https://codeday.me/bug/20190812/1642221.html