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 被用於建立它。

然而，資料部分可能進一步巢狀其它特定的子訊息系統。



Netlink 通訊端簇

AF\_NETLINK 協定家族提供了多個子協定。每個介面連接不同的核心組件並且有各自的訊息集。
如：

```
int socket(AF_NETLINK, SOCK_DGRAM or SOCK_RAW, protocol)
```

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



Netlink 協定

Netlink 所支援的協定如下（並不完全）：NETLINK\_ROUTENETLINK\_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 協定被開發用於連接新的核心模組。



參考資料



外部連結


* 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