Netlink
此條目翻譯自英語維基百科,需要相關領域的編者協助校對翻譯。 |
Netlink套接字家族(英語:Netlink socket family)是一組Linux核心介面(Linux kernel interfaces),可用於行程間通訊,Linux內核與用戶空間的進程間、用戶進程間的通訊。然而它並不像網絡套接字可以用於主機間通訊,Netlink只能用於同一主機上進程通訊,並通過PID來標識它們。
Netlink被設計為在Linux內核與用戶空間進程傳送各種網絡信息。網絡工具iproute2利用 Netlink從用戶空間與內核進行通訊。Netlink由一個在用戶空間的標準的Socket接口和內核模塊 提供的內核API組成。Netlink的設計比ioctl更加靈活,Netlink使用了AF_NETLINK Socket 家族。
歷史
編輯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]
參考資料
編輯- ^ Why and How to Use Netlink Sockets. [2013-03-26]. (原始內容存檔於2013-03-19).
外部連結
編輯- Pablo Neira Ayuso, Rafael M. Gasca, Laurent Lefèvre. Communicating between the kernel and user-space in Linux using Netlink sockets. Software: Practice and Experience, 40(9):797-810, August 2010
- Why and How to Use Netlink Sockets(頁面存檔備份,存於網際網路檔案館)
- RFC 3549(頁面存檔備份,存於網際網路檔案館)
- http://netfilter.org/projects/libmnl(頁面存檔備份,存於網際網路檔案館) — 「Minimalist Library for Netlink」 — userspace library for construction and parsing of Netlink messages
- http://www.infradead.org/~tgr/libnl(頁面存檔備份,存於網際網路檔案館) = "Netlink Protocol Library Suite" - full functional library covering almost all aspects of working with netlink sockets
- Manipulating the Networking Environment Using RTNETLINK(頁面存檔備份,存於網際網路檔案館)
- Netlink Sockets - Overview