天天看點

Netlink系列1概述

         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);

繼續閱讀