netlink用于實作核心間雙向通信、使用者空間與核心空間的雙向通信,是比較優秀的方式之一,例如比ioctl方式要好很多,而且功能更加強大。通俗的講,Netlink擷取\設定:網絡接口配置、位址、路由、鄰居發現、防火牆、ARP消息、netfilter等衆多功能。直到目前,Netlink系統仍然沒有全部完成,開發者們試圖使用一種新的、易操作的方法來處理網絡配置。
Linux從2.1核心開始使用Netlink,2.4核心開始完全使用netlink機制來代替BSD的路由套接口機制。在RFC3549中對Netlink做了規定和說明。
Netlink socket的生成方式如下:
sock_fd =socket(AF_NETLINK, socket_type, netlink_family);
第一個參數為AF_NETLINK,這個參數和PF_NETLINK完全相同。RFC中的定義是PF_NETLINK。簡要說一下AF_和PF_的問題,AF_字首表示位址族,PF_表示協定族,實際上以AF_和PF_開頭的值都是相同的。使用的時候不需要區分。
socket_type為SOCK_DGRAM或SOCK_RAW,因為AF_NETLINK為面向資料包的套接字,是以隻能使用這兩種方式。并且netlink不區分資料報和原始套接字。但是建議使用SOCK_RAW。
netlink_family指定與那些核心子產品進行通信。可以為很多種,可以檢視man 來知道具體支援那些。例如:
NETLINK_ROUTE 與路由資訊有關,如查詢、設定和删除路由表中條目
NETLINK_FIREWALL 接收由IPV4防火牆代碼發送的包;
NETLINK_ARPD 在使用者空間進行ARP緩存管理
NETLINK_ROUTE6 在使用者空間進行發送和接收路由表資訊更新
NETLINK_USERSOCK 使用者态socket協定。
NETLINK_NFLOG netfilter日志
NETLINK_SELINUX SELinux事件通知
NETLINK_NETFILTER netfilter子系統
下面為建立一個擷取路由資訊的netlink socket的例子:
sock_fd =socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);