- 1、本文档共24页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
用户空间和内核空间通讯之Netlink
用户空间和内核空间通讯之【Netlink】
引言
Alan Cox 在内核1.3 版本的开发阶段最先引入了Netlink,刚开始时Netlink 是以字符驱动接口的方式提供内核
与用户空间的双向数据通信;随后,在2.1 内核开发过程中,Alexey Kuznetsov 将Netlink 改写成一个更加灵活、且
易于扩展的基于消息通信接口,并将其应用到高级路由子系统的基础框架里。自那时起,Netlink 就成了Linux 内核
子系统和用户态的应用程序通信的主要手段之一。
2001 年,ForCES IETF 委员会正式对Netlink 进行了标准化的工作。Jamal Hadi Salim 提议将Netlink 定义成一种
用于网络设备的路由引擎组件和其控制管理组件之间通信的协议。不过他的建议最终没有被采纳,取而代之的是我
们今天所看到的格局:Netlink 被设计成一个新的协议域,domain 。
Linux 之父托瓦斯曾说过“Linux is evolution, not intelligent design” 。什么意思?就是说,Netlink 也同样遵循了
Linux 的某些设计理念,即没有完整的规范文档,亦没有设计文档。只有什么?你懂得“Read the f**king source code”。
当然,本文不是分析Netlink 在 Linux 上的实现机制,而是就“什么是 Netlink”以及“如何用好 Netlink”的话题和
大家做个分享,只有在遇到问题时才需要去阅读内核源码弄清个所以然。
什么是Netlink
关于Netlink 的理解,需要把握几个关键点:
1、面向数据报的无连接消息子系统
2、基于通用的BSD Socket 架构而实现
关于第一点使我们很容易联想到UDP 协议,能想到这一点就非常棒了。按着UDP 协议来理解Netlink 不是不无
道理,只要你能触类旁通,做到“活学” ,善于总结归纳、联想,最后实现知识迁移这就是学习的本质。Netlink 可以
实现内核-用户以及用户- 内核的双向、异步的数据通信,同时它还支持两个用户进程之间、甚至两个内核子系统
之间的数据通信。本文中,对后两者我们不予考虑,焦点集中在如何实现用户- 内核之间的数据通信。
看到第二点脑海中是不是瞬间闪现了下面这张图片呢?如果是,则说明你确实有慧根;当然,不是也没关系,
慧根可以慢慢长嘛,呵呵。
在后面实战Netlink 套接字编程时我们主要会用到socket(),bind(),sendmsg()
和recvmsg()等系统调用,当然还有socket 提供的轮训(polling)机制。
Netlink 通信类型
Netlink 支持两种类型的通信方式:单播和多播。
单播:经常用于一个用户进程和一个内核子系统之间1:1 的数据通信。用户空间发送命令到内核,然后从内核
接受命令的返回结果。
多播:经常用于一个内核进程和多个用户进程之间的1:N 的数据通信。内核作为会话的发起者,用户空间的应
用程序是接收者。为了实现这个功能,内核空间的程序会创建一个多播组,然后所有用户空间的对该内核进程发送
的消息感兴趣的进程都加入到该组即可接收来自内核发送的消息了。如下:
其中进程A 和子系统1 之间是单播通信,进程B、C 和子系统2 是多播通信。上图还向我们说明了一个信息。从
用户空间传递到内核的数据是不需要排队的,即其操作是同步完成;而从内核空间向用户空间传递数据时需要排队,
是异步的。了解了这一点在开发基于 Netlink 的应用模块时可以使我们少走很多弯路。假如,你向内核发送了一个
消息需要获取内核中某些信息,比如路由表,或其他信息,如果路由表过于庞大,那么内核在通过 Netlink 向你返
回数据时,你可以好生琢磨一下如何接收这些数据的问题,毕竟你已经看到了那个输出队列了,不能视而不见啊。
Netlink 的消息格式
Netlink 消息由两部分组成:消息头和有效数据载荷,且整个Netlink 消息是4 字节对齐,一般按主机字节序进
行传递。消息头为固定的16 字节,消息体长度可变:
Netlink 的消息头
消息头定义在include/linux/netlink.h文件里,由结构体nlmsghdr 表示:
点击(此处)折叠或打开
struct nlmsghdr
{
__u32 nlmsg_len; /* Length of mes
文档评论(0)