Netlink通訊端家族(英語:Netlink socket family)是一組Linux核心介面(Linux kernel interfaces),可用於行程間通訊,Linux內核與用戶空間的行程間、用戶行程間的通訊。然而它並不像網絡通訊端可以用於主機間通訊,Netlink只能用於同一主機上行程通訊,並通過PID來標識它們。

Netlink被設計為在Linux內核與用戶空間行程傳送各種網絡資訊。網絡工具iproute2利用 Netlink從用戶空間與內核進行通訊。Netlink由一個在用戶空間的標準的Socket介面和內核模組 提供的內核API組成。Netlink的設計比ioctl更加靈活,Netlink使用了AF_NETLINK Socket 家族。

RFC 3549頁面存檔備份,存於互聯網檔案館)詳細的描述了Netlink協定。

歷史

編輯

Netlink用於替代複雜和不夠靈活的ioctl通訊方式,ioctl方法主要用設定和取得外部socket, 為了提供向下相容,ioctl將一直被Linux內核所支援,用法如下:

error = ioctl(ip_socket, ioctl_type, &value_result);

Netlink在Linux內核2.0版本中作為字元裝置被首次提供使用。這個介面已經過時了,但是作為 一種ioctl通訊方法,它仍可繼續使用。Netlink socket介面從Linux內核2.2開始提供使用。

包結構

編輯

不像BSD通訊端存取互聯網協定那樣,頭資訊中的標識和目的地都是自動生成(如TCP), Netlink訊息頭(結構體nlmsghdr)必須由傳送方準備好,就像socket工作在SOCK_RAW模式下 一樣。儘管SOCK_DGRAM被用於建立它。

Bit offset 0–15 16–31
0 Message length
32 Type Flags
64 Sequence number
96 PID
128+  
Data
 

然而,數據部分可能進一步巢狀其它特定的子訊息系統。

Netlink通訊端簇

編輯

AF_NETLINK協定家族提供了多個子協定。每個介面連接不同的內核組件並且有各自的訊息集。 如:

int socket(AF_NETLINK, SOCK_DGRAM or SOCK_RAW, protocol)

由於缺少標準,SOCK_DGRAM和SOCK_RAW並不保證在每個Linux發行版(或其它作業系統)被聲 明。有些原始碼中聲明兩種都可以使用,紅帽的文件中聲明SOCK_RAW一直可以被使用,而 iproute2交換使用兩者。

Netlink協定

編輯

Netlink所支援的協定如下(並不完全): NETLINK_ROUTE NETLINK_ROUTE提供路由和連接資訊。這些資訊主要被用戶空間的路由守護行程使用。對於這個 協定,Linux聲明了大量的子訊息:

  • 鏈路層:RTM_NEWLINK, RTM_DELLINK, RTM_GETLINK, RTM_SETLINK
  • 地址設定:RTM_NEWADDR, RTM_DELADDR, RTM_GETADDR
  • 路由表:RTM_NEWROUTE, RTM_DELROUTE, RTM_GETROUTE
  • 鄰居快取(Neighbor Cache):RTM_NEWNEIGH, RTM_DELNEIGH, RTM_GETNEIGH
  • 路由規則:RTM_NEWRULE, RTM_DELRULE, RTM_GETRULE
  • Queuing Discipline Settings: RTM_NEWQDISC, RTM_DELQDISC, RTM_GETQDISC
  • Traffic Classes used with Queues: RTM_NEWTCLASS, RTM_DELTCLASS, RTM_GETTCLASS
  • 流量過濾:RTM_NEWTFILTER, RTM_DELTFILTER, RTM_GETTFILTER
  • 其它:RTM_NEWACTION, RTM_DELACTION, RTM_GETACTION, RTM_NEWPREFIX, RTM_GETPREFIX, RTM_GETMULTICAST, RTM_GETANYCAST, RTM_NEWNEIGHTBL,RTM_GETNEIGHTBL, RTM_SETNEIGHTBL

NETLINK_FIREWALL

NETLINK_FIREWALL提供給用戶空間用戶程式一個介面,用戶空間應用程式利用這個介面可以從防火牆接收包。

NETLINK_NFLOG

NETLINK_NFLOG提供了一個iptables和Netfilter間通訊的介面。

NETLINK_ARPD

NETLINK_ARPD提供了一個介面用於從用戶空間來管理ARP表。

NETLINK_AUDIT

NETLINK_AUDIT只能在Linux內核2.6.6及以後才可以使用,它提供了一個用戶審計子系統的介面。

NETLINK_IPV6_FW

NETLINK_IPV6_FW提供了一個將包從netfilter傳送到用戶空間的介面。

NETLINK_ROUTE6

NETLINK_TAPBASE

NETLINK_TCPDIAG

NETLINK_XFRM

NETLINK_XFRM提供了一個介面用於管理IPSec安全組件(IPSec Security association)和安全策略資料庫的介面。主要被金鑰管理的守護行程用於互聯網金鑰交換(Internet Key Exchange)協定。

用戶自訂的Netlink協定

編輯

用戶也可以在自己的內核中添加自訂的Netlink處理器。這允許其它Netlink協定被開發用於連接新的內核模組。[1]

參考資料

編輯
  1. ^ Why and How to Use Netlink Sockets. [2013-03-26]. (原始內容存檔於2013-03-19). 

外部連結

編輯