**Netlink套接字家族**（英語：）是一組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. ↑ .  [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（页面存档备份，存于）
* — "Minimalist Library for Netlink" — userspace library for construction and parsing of Netlink messages
* = "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