什么是Netlink通信機(jī)制
Netlink套接字是用以實(shí)現(xiàn)用戶進(jìn)程與內(nèi)核進(jìn)程通信的一種特殊的進(jìn)程間通信(IPC) ,也是網(wǎng)絡(luò)應(yīng)用程序與內(nèi)核通信的最常用的接口凿歼。
Netlink 是一種特殊的 socket聪铺,它是 Linux 所特有的押搪,類似于 BSD 中的AF_ROUTE 但又遠(yuǎn)比它的功能強(qiáng)大鱼填,目前在Linux 內(nèi)核中使用netlink 進(jìn)行應(yīng)用與內(nèi)核通信的應(yīng)用很多;
包括:
- 路由 daemon(NETLINK_ROUTE)刮刑,
- 用戶態(tài) socket 協(xié)議(NETLINK_USERSOCK),
- 防火墻(NETLINK_FIREWALL)干旁,
- netfilter 子系統(tǒng)(NETLINK_NETFILTER),
- 內(nèi)核事件向用戶態(tài)通知(NETLINK_KOBJECT_UEVENT)桩撮,
- 通用 netlink(NETLINK_GENERIC)
等敦第。
Netlink 是一種在內(nèi)核與用戶應(yīng)用間進(jìn)行雙向數(shù)據(jù)傳輸?shù)姆浅:玫姆绞剑脩魬B(tài)應(yīng)用使用標(biāo)準(zhǔn)的 socket API 就可以使用 netlink 提供的強(qiáng)大功能店量,
內(nèi)核態(tài)需要使用專門的內(nèi)核 API 來使用 netlink芜果。
Netlink 相對(duì)于系統(tǒng)調(diào)用,ioctl 以及 /proc文件系統(tǒng)而言具有以下優(yōu)點(diǎn):- netlink使用簡(jiǎn)單融师,只需要在include/linux/netlink.h中增加一個(gè)新類型的 netlink 協(xié)議定義即可,(如 #define NETLINK_TEST 20 然后右钾,內(nèi)核和用戶態(tài)應(yīng)用就可以立即通過 socket API 使用該 netlink 協(xié)議類型進(jìn)行數(shù)據(jù)交換);
- netlink是一種異步通信機(jī)制,在內(nèi)核與用戶態(tài)應(yīng)用之間傳遞的消息保存在socket緩存隊(duì)列中旱爆,發(fā)送消息只是把消息保存在接收者的socket的接收隊(duì)列舀射,而不需要等待接收者收到消息;
3.使用 netlink 的內(nèi)核部分可以采用模塊的方式實(shí)現(xiàn)怀伦,使用 netlink 的應(yīng)用部分和內(nèi)核部分沒有編譯時(shí)依賴;
4.netlink 支持多播脆烟,內(nèi)核模塊或應(yīng)用可以把消息多播給一個(gè)netlink組,屬于該neilink 組的任何內(nèi)核模塊或應(yīng)用都能接收到該消息房待,內(nèi)核事件向用戶態(tài)的通知機(jī)制就使用了這一特性浩淘;
5.內(nèi)核可以使用 netlink 首先發(fā)起會(huì)話;