Netlink
![本頁使用了標題或全文手工轉換](http://images.weserv.nl/?url=//upload.wikimedia.org/wikipedia/commons/thumb/c/cd/Zh_conversion_icon_m.svg/35px-Zh_conversion_icon_m.svg.png)
![]() | 此條目翻譯自英語維基百科,需要相關領域的編者協助校對翻譯。 |
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]
參考資料
- ^ 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