什么是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 所特有的,類(lèi)似于 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ù)姆浅:玫姆绞?,用戶態(tài)應(yīng)用使用標(biāo)準(zhǔn)的 socket API 就可以使用 netlink 提供的強(qiáng)大功能,
內(nèi)核態(tài)需要使用專(zhuān)門(mén)的內(nèi)核 API 來(lái)使用 netlink。
Netlink 相對(duì)于系統(tǒng)調(diào)用,ioctl 以及 /proc文件系統(tǒng)而言具有以下優(yōu)點(diǎn):- netlink使用簡(jiǎn)單,只需要在include/linux/netlink.h中增加一個(gè)新類(lèi)型的 netlink 協(xié)議定義即可,(如 #define NETLINK_TEST 20 然后,內(nèi)核和用戶態(tài)應(yīng)用就可以立即通過(guò) socket API 使用該 netlink 協(xié)議類(lèi)型進(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)核部分沒(mé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ì)話;