net link
Netlink 是一种用于内核模块与用户进程之间、用户进程之间传递消息的特殊进程间通信方式。
它包含了用户进程的标准套接字接口和内核模块的内部核心 API。
在 Netlink 出现之前Linux 主要使用 ioctl 接口控制设备参数。
Netlink 相比 ioctl 等方式具有诸多优势比如创建新类型的 Netlink 协议定义更简便是异步通信机制支持多播内核部分可采用模块方式实现使用标准的 socket API 容易使用而且内核可以首先发起会话。
用户态应用使用标准的 socket APIs 如 socket()、bind()、sendmsg()、recvmsg() 和 close() 就能使用 Netlink socket。
创建 Netlink socket 时需用特定参数调用 socket()函数。
发送 Netlink 消息时要引用多个结构并进行相应设置接收时需先分配足够大的缓存然后调用 recvmsg()函数。
此外还有相关的库如 libnl 提供了一系列函数用于 Netlink 的连接、发送和接收操作。
内核接收 Netlink message 有特定流程构造和解析 nlmsg 也有相应方法。
在数据解析时要注意得到 nlmsg 和 payload 的方式以及解析 attributes 的方法。
Netlink 是一种特殊的进程间通信方式主要用于内核与用户空间进程之间、用户进程之间的通信。
Netlink 套接字家族是 Linux 内核接口的一部分它具有很多优点和特性。
在使用 Netlink 之前Linux 常用 ioctl 接口控制设备参数但 Netlink 相较而言优势明显。比如创建新的 Netlink 协议类型简单无需像新增系统调用那样复杂。
而且 Netlink 是异步通信机制发送消息无需等待接收者确认减少对调度粒度的影响。
使用 Netlink 时用户态应用通过标准的 socket APIs 即可如 socket()、bind()、sendmsg()、recvmsg()和 close()。
创建 Netlink socket 需使用特定参数调用 socket()然后用 bind()绑定地址。发送消息前要设置好消息头如 nlmsg_type 等字段。接收消息时要先分配足够大缓存填充消息头后调用 recvmsg()接收。
Netlink 支持多播内核模块或应用能把消息多播给一个组。内核也能主动发起会话使用标准的 socket API 让其容易上手。
内核接收 Netlink message 流程以 generic netlink 为例有一系列的初始化和处理步骤。构造 nlmsg 时可通过相关函数和结构体操作数据解析包括从 buffer 得到数据、解析 attributes 等。
总之Netlink 在进程间通信中发挥着重要作用为内核与用户空间的交互提供了高效灵活的方式。

粤公网安备 44010602000157号