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

外部連結

編輯