NetLink : concept of netlink update

This commit is contained in:
zeroway
2018-06-01 09:50:30 +08:00
parent b5a8d5ed96
commit e72144b581
2 changed files with 36 additions and 1 deletions

View File

@ -1,9 +1,44 @@
# Linux (Generic) NetLink
一般netlink demo([demo1_user.c](demo1_user.c) [demo2_kernel.c](demo2_kernel.c))
### 什么是Netlink
[参考文章 用户空间和内核空间通讯](http://blog.chinaunix.net/uid-23069658-id-3400761.html)
关于Netlink的理解,需要把握几个关键点
- 面向数据报的无连接消息子系统
- 基于通用的BSD Socket架构而实现
Netlink可以实现如下通信
内核->用户和用户->内核的双向,异步的数据通信,同时它还支持两个用户进程之间,甚至两个内核子系统之间的数据通信
### Netlink通信类型
Netlink支持两种类型的通信方式:单播和多播
- 单播:经常用于一个用户进程和一个内核子系统之间1:1的数据通信.用户空间发送命令到内核,然后从内核接受命令的返回结果.
- 多播:经常用于一个内核进程和多个用户进程之间的1:N的数据通信.内核作为会话的发起者,用户空间的应用程序是接收者.为了实现这个功能,内核空间的程序会创建一个多播组,然后所有用户空间的对该内核进程发送的消息感兴趣的进程都加入到该组即可接收来自内核发送的消息了
![netlink topologic](./nl00.png)
其中进程A和子系统1之间是单播通信,进程B,C和子系统2是多播通信.上图还向我们说明了一个信息.从用户空间传递到内核的数据是不需要排队的,即其操作是同步完成;而从内核空间向用户空间传递数据时需要排队,是异步的.假如向内核发送了一个消息需要获取内核中某些信息,比如路由表,或其他信息,如果路由表过于庞大,那么内核在通过Netlink向应用返回数据时,应用可以好生琢磨一下如何接收这些数据的问题,毕竟已经看到了那个输出队列了,不能视而不见
### Netlink编程需要注意的问题
基于Netlink的用户/内核通信,有两种情况可能会导致丢包
- 内存耗尽
- 用户空间接收进程的缓冲区溢出.导致缓冲区溢出的主要原因有可能是:用户空间的进程运行太慢;或者接收队列太短
如果Netlink不能将消息正确传递到用户空间的接收进程,那么用户空间的接收进程在调用recvmsg()系统调用时就会返回一个内存不足(ENOBUFS)的错误,这一点需要注意.换句话说,缓冲区溢出的情况是不会发送在从用户->内核的sendmsg()系统调用里(同步操作)
当然,如果使用的是阻塞型socket通信,也就不存在内存耗尽的隐患了
![net link msg](./netlinkmsg.png)
一般netlink demo([demo1_user.c](demo1_user.c) [demo2_kernel.c](demo2_kernel.c))
## Generic Netlink
[generic_netlink_howto](https://wiki.linuxfoundation.org/networking/generic_netlink_howto#architectural-overview)

BIN
debug/netlink/nl00.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 364 KiB