Netlink 是 linux 提供的用于内核和用户态进程之间的通信方式。

但是注意虽然 Netlink 主要用于用户空间和内核空间的通信,但是也能用于用户空间的两个进程通信。

只是进程间通信有其他很多方式,一般不用 Netlink。除非需要用到 Netlink 的广播特性时。

那么 Netlink 有什么优势呢?

一般来说用户空间和内核空间的通信方式有三种:/proc、ioctl、Netlink。而前两种都是单向的,但是 Netlink 可以实现双工通信。

Netlink 协议基于 BSD socket 和 AF_NETLINK 地址簇(address family),使用 32 位的端口号寻址(以前称作 PID),每个 Netlink 协议(或称作总线,man 手册中则称之为 netlink family),通常与一个或一组内核服务/组件相关联,如 NETLINK_ROUTE 用于获取和设置路由与链路信息、NETLINK_KOBJECT_UEVENT 用于内核向用户空间的 udev 进程发送通知等。

  1. 支持全双工、异步通信(当然同步也支持)
  2. 用户空间可使用标准的 BSD socket 接口(但 Netlink 并没有屏蔽掉协议包的构造与解析过程,推荐使用 libnl 等第三方库)
  3. 在内核空间使用专用的内核 API 接口
  4. 支持多播(因此支持“总线”式通信,可实现消息订阅)
  5. 在内核端可用于进程上下文与中断上下文

Netlink 相对于其他的通信机制具有以下优点:

  1. 使用 Netlink 通过自定义一种新的协议并加入协议族即可通过 socket API 使用 Netlink 协议完成数据交换,而 ioctl 和 proc 文件系统均需要通过程序加入相应的设备或文件。
  2. Netlink 使用 socket 缓存队列,是一种异步通信机制,而 ioctl 是同步通信机制,如果传输的数据量较大,会影响系统性能。
  3. Netlink 支持多播,属于一个 Netlink 组的模块和进程都能获得该多播消息。
  4. Netlink 允许内核发起会话,而 ioctl 和系统调用只能由用户空间进程发起。

参考

linux用户空间与内核空间通信——Netlink通信机制

linux netlink通信机制 实测可行

linux 内核与用户空间通信之netlink使用方法