Linux 内核网络功能时间线

最后更新: 2026-08-28 14:02:12 +0800 +0800
原文以英文撰写。您正在阅读AI翻译版本。

Linux 网络功能通过主线版本的渐进式发布演进,而不是通过独立的子系统版本发布。以下里程碑标识了首次包含各项功能的稳定内核版本;后续内核可能会增加协议覆盖范围、驱动程序、卸载功能或用户空间接口。

网络功能速览 #

FeatureKernelRelease DateMaintainer PageQuick Fact
Netfilter and iptables2.4.0January 4, 2001netfilter.orgNetfilter 引入了可扩展的数据包处理钩子,而 iptables 向用户空间提供了过滤、NAT 和数据包修改规则。
NAPI2.6.0December 17, 2003NAPI 将中断通知与轮询结合起来,因此降低了接口以高速率接收数据包时的中断开销。
CUBIC TCP congestion control2.6.13August 28, 2005CUBIC 根据自上一次拥塞事件以来的时间的三次函数选择拥塞窗口。Linux 2.6.19 后来将其设为默认的 TCP 拥塞控制算法。
Network namespaces2.6.24January 24, 2008初始支持隔离了网络设备、协议栈、路由表、防火墙规则和套接字。后续版本扩展了设备和协议的覆盖范围。
Generic Receive Offload (GRO)2.6.29March 23, 2009GRO 在上层处理之前聚合相关数据包,因此无需 NIC 特定的接收卸载即可摊销每个数据包的成本。
Receive Packet Steering and Receive Flow Steering2.6.35August 1, 2010RPS 在软件中将接收处理分布到多个 CPU,而 RFS 增加了流局部性,使数据包处理可以跟随消费数据的应用程序。
TCP Fast Open client support3.6September 30, 2012当客户端拥有有效 Cookie 时,TFO 可以在建立连接的 SYN 中携带应用程序数据。Linux 3.7 增加了服务器端支持。
nftables3.13January 20, 2014nftables projectnftables 增加了可编程的数据包分类引擎和 Netlink API,旨在取代彼此独立的 iptables、ip6tables、arptables 和 ebtables 接口。
Extended BPF3.18December 7, 2014eBPF projectbpf() 系统调用和 eBPF 虚拟机为验证型、JIT 编译型程序提供了基础,这些程序用于套接字过滤器、流量控制、跟踪以及后来的 XDP。
Virtual Routing and Forwarding (VRF)4.3November 2, 2015VRF 设备允许接口共享一个网络命名空间,同时使用独立的路由表,因此无需创建另一个命名空间即可实现路由隔离。
eXpress Data Path (XDP)4.8October 2, 2016XDP projectXDP 在内核分配套接字缓冲区之前运行 eBPF 程序,从而支持提前丢弃、重定向和负载均衡数据包。
BBR congestion control4.9December 11, 2016Google BBRBBR 对瓶颈带宽和往返传播时间建模,而不是将数据包丢失视为主要的拥塞信号。
Kernel TLS transmit offload4.13September 3, 2017kTLS 将发送数据的 TLS 记录加密和成帧移入内核。Linux 4.17 增加了接收支持。
AF_XDP sockets4.18August 12, 2018XDP projectAF_XDP 通过共享内存环将 XDP 程序连接到用户空间,并根据驱动程序支持复制和零复制操作。
Multipath TCP5.6March 29, 2020MPTCP upstream project初始的上游 MPTCP 支持允许一个逻辑传输连接在不同路径上使用多个 TCP 子流。
WireGuard5.6March 29, 2020WireGuardWireGuard 增加了内核中的加密三层隧道,协议和密码学接口都较为精简。
IPv6 BIG TCP5.19July 31, 2022BIG TCP 允许主机协议栈内部使用更大的非 GSO 数据包,从而降低高速链路上的每包开销。Linux 6.3 增加了 IPv4 支持。

发布日期遵循Linux 内核 Git 历史中的主线标签。功能版本通过KernelNewbies 版本摘要和内核网络文档进行交叉核对。

内核与用户空间边界 #

Linux 不提供add_route()或create_veth()之类的系统调用。相反,用户空间选择内核控制接口,并通过通用系统调用访问它。尤其需要注意,Netlink 是一组套接字协议,而不是一个系统调用。

SyscallsControl InterfaceNetwork Configuration RoleCurrent Guidance
socket(), bind(), sendmsg(), and recvmsg()Netlink进程打开一个AF_NETLINK套接字,并与某个 Netlink 家族交换结构化消息。NETLINK_ROUTE配置链路、地址、路由、邻居、流量控制及相关对象。Generic Netlink 和子系统协议覆盖 nftables、nl80211、ethtool、devlink、WireGuard 等设施。对系统级网络配置,优先使用相关的 Netlink 家族。消息属性、确认、分段回复和 API 演进都需要谨慎处理,因此应使用受维护的库或工具。
ioctl()Socket and device ioctlsSIOCSIFFLAGS、SIOCSIFADDR和SIOCSIFMTU等请求配置接口。私有设备 ioctl、旧版 ethtool ABI 和 Wireless Extensions ABI 也使用同一系统调用。为兼容性保留 ioctl 支持,但当子系统提供 Netlink API 时应使用该 API。ioctl 命令具有固定的请求结构,因此难以安全扩展。
setsockopt() and getsockopt()Socket options套接字选项配置单个套接字的行为,例如标记、缓冲区大小、设备绑定、多播成员关系、TCP 参数和附加过滤器。旧版 iptables 也通过协议特定的套接字选项上传和读取规则。对属于单个套接字的设置继续使用套接字选项。对于新的防火墙集成,应通过 Netlink 使用 nftables,而不是旧版 iptables 套接字选项 ABI。
bpf()eBPF object APIbpf()加载程序、创建和更新映射、查询对象并创建受支持的 BPF 链接。网络程序可以运行在套接字、流量控制、cgroup、XDP 和其他钩子上。某些附加路径仍使用 Netlink 或套接字选项。使用 libbpf,而不是直接发出原始bpf()命令。当某个钩子支持 BPF 链接时应优先使用,因为链接为附加关系提供了显式的生命周期;必要时使用该钩子既有的 Netlink API。
openat(), read(), and write()procfs and sysfs/proc/sys/net下的文件公开网络 sysctl,而/proc/net和/sys/class/net下的部分文件公开状态或范围有限的控制项。这些调用操作的是虚拟文件,但数据由内核提供或消费。对主机或命名空间调节项使用有文档记录的 sysctl。如果存在结构化的 Netlink 转储,不要解析 procfs,因为 procfs 格式主要是文本接口,可能省略属性。
clone(), clone3(), unshare(), and setns()Network namespacesCLONE_NEWNET创建网络命名空间,或将执行转移到命名空间设置路径;setns()加入现有命名空间。配置命令随后作用于调用线程命名空间所选择的网络栈。先建立命名空间,再通过 Netlink 进行配置。将命名空间切换视为线程范围的状态,并避免从不受控的多线程进程中并发修改它。

大多数管理操作要求在管理目标网络命名空间的用户命名空间中拥有CAP_NET_ADMIN。根据程序类型、附加点和内核版本,eBPF 操作还可能需要CAP_BPF、CAP_PERFMON或其他能力。

推荐接口的变化 #

  1. 早期 Linux 使用 ioctl、套接字选项和虚拟文件。 ifconfig、route和arp等程序发出网络设备和路由 ioctl。/proc/sys/net提供全局调节项,而通过旧版 iptables 配置的各代防火墙使用协议特定的套接字选项。
  2. Rtnetlink 成为可扩展的网络控制平面。 Linux 2.2 通过NETLINK_ROUTE公开链路、多个地址、路由、邻居和流量控制对象。因此,iproute2 工具(ip、bridge和tc)取代了面向 ioctl 的 net-tools 命令,用于新的配置。
  3. 特定于子系统的 Netlink 家族取代了固定的私有 ABI。 Generic Netlink 及相关协议允许命令和类型-长度-值属性在不更改系统调用的情况下演进。nl80211 取代 Wireless Extensions,nftables 取代旧版 iptables 规则 ABI,而较新的 ethtool 操作使用 Netlink 而不是设备 ioctl。
  4. eBPF 增加了可编程的数据平面边界。 bpf()系统调用管理程序和映射,但配置仍按附加点划分:rtnetlink 配置流量控制和既有的 XDP 附加,套接字选项附加经典套接字过滤器,而 BPF 链接为受支持的钩子提供文件描述符生命周期管理。
  5. 新的控制平面倾向于使用有描述的 Netlink API。 当前的内核网络开发通过机器可读规范记录 Netlink 家族。应用程序应使用这些 API,请求确认和扩展确认,并仅在不存在受支持的结构化替代接口时使用 ioctl 或文本文件解析。

有关相应 UAPI 的详细信息,请参阅内核的Netlink 介绍、rtnetlink(7)、netdevice(7)和bpf(2)文档。

rtnetlink 中的rt表示routing,但该接口已经发展为内核的通用网络控制协议。进程打开socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE)并发送RTM_*消息。每条消息包含struct nlmsghdr、对象特定的固定头部以及对齐的类型-长度-值属性。

Rtnetlink 支持三种交互模式:

  • Do request: 创建、替换、修改或删除一个对象,并接收确认。
  • Dump request: 枚举一类对象,例如所有链路或所有路由。内核返回以NLMSG_DONE结束的分段响应。
  • Multicast notification: 订阅链路、地址、路由、邻居、规则、流量控制及其他变更的组。通知使用与回复相同的对象消息,因此程序可以维护本地缓存。

托管对象 #

ObjectPrincipal MessagesOperations and State
Network linksRTM_NEWLINK, RTM_SETLINK, RTM_DELLINK, RTM_GETLINK创建和删除已注册链路类型支持的虚拟设备,包括 veth 对、网桥、bond、VLAN 设备、VRF、macvlan/macvtap、VXLAN、Geneve 和 dummy 设备。修改管理状态、MTU、名称、MAC 地址、队列数量、组、别名、主设备关系、命名空间位置和协议特定的链路选项。查询载波状态、运行状态、队列配置、物理标识符、VF 设置、统计信息和 XDP 附加信息。
Link propertiesRTM_NEWLINKPROP, RTM_DELLINKPROP, RTM_GETLINKPROP添加、删除和列出辅助链路属性,主要是备用接口名称。
Protocol addressesRTM_NEWADDR, RTM_DELADDR, RTM_GETADDR添加、替换、删除和枚举 IPv4、IPv6 以及受支持的非 IP 地址。属性描述本地和对端地址、前缀长度、作用域、广播或任播地址、标志、标签、首选生存期和有效生存期。
Address-selection labelsRTM_NEWADDRLABEL, RTM_DELADDRLABEL, RTM_GETADDRLABEL独立于接口地址管理 IPv6 源地址和目的地址选择标签。
RoutesRTM_NEWROUTE, RTM_DELROUTE, RTM_GETROUTE在多个表中管理单播、本地、广播、多播、blackhole、unreachable、prohibit 和 throw 路由。路由可以选择输入和输出接口、网关、首选源地址、度量值、MTU、拥塞控制参数、过期时间、realm、标记、多路径下一跳或轻量级隧道封装。RTM_GETROUTE同时支持表转储和针对给定流键的路由查询。
Policy-routing rulesRTM_NEWRULE, RTM_DELRULE, RTM_GETRULE根据优先级以及源地址、目的地址、输入或输出接口、防火墙标记、UID 范围、IP 协议、端口、DSCP、流标签或三层主设备等选择器选择路由表或动作。动作包括表查找、goto、blackhole、unreachable 和 prohibit。
Nexthop objectsRTM_NEWNEXTHOP, RTM_DELNEXTHOP, RTM_GETNEXTHOP创建可复用的下一跳和下一跳组(包括弹性组),而不是将每条路径嵌入每条路由。对象携带网关、设备、组成员关系、权重、保护标志和封装状态。
Resilient nexthop bucketsRTM_NEWNEXTHOPBUCKET, RTM_DELNEXTHOPBUCKET, RTM_GETNEXTHOPBUCKET检查并在支持时控制弹性下一跳组使用的桶到下一跳映射,从而使成员关系变化影响更少的流。
NeighboursRTM_NEWNEIGH, RTM_DELNEIGH, RTM_GETNEIGH管理和检查 ARP、IPv6 NDP 及相关邻居缓存条目。状态包括协议地址、链路层地址、接口、可达性状态、路由器和代理标志、探测数据、卸载状态以及缓存时间戳。网桥转发数据库条目也使用带网桥特定属性的邻居消息。
Neighbour tablesRTM_NEWNEIGHTBL, RTM_SETNEIGHTBL, RTM_GETNEIGHTBL读取表统计信息,并调节邻居发现的垃圾回收阈值、可达时间、重传时间、探测次数、队列限制、过期时间和代理行为。
Traffic-control queueing disciplinesRTM_NEWQDISC, RTM_DELQDISC, RTM_GETQDISC附加、配置、替换、检查和删除根、ingress、egress 以及子 qdisc。示例包括fq、fq_codel、htb、tbf、netem、cake、clsact以及驱动程序支持时的硬件卸载 qdisc。
Traffic classesRTM_NEWTCLASS, RTM_DELTCLASS, RTM_GETTCLASS管理有类 qdisc 下的类别层次结构,包括速率、上限、优先级、父句柄和实现特定的参数。
Traffic-control filters and chainsRTM_NEWTFILTER, RTM_DELTFILTER, RTM_GETTFILTER, RTM_NEWCHAIN, RTM_DELCHAIN, RTM_GETCHAIN对数据包分类并选择类别或动作。过滤器包括 flower、u32、route、matchall 和 BPF;链将一个块划分为有序阶段。属性可以请求硬件卸载,并报告卸载是否成功。
Traffic-control actionsRTM_NEWACTION, RTM_DELACTION, RTM_GETACTION创建并检查可复用动作,例如 drop、redirect、mirror、police、tunnel-key 操作、VLAN 操作、数据包编辑、连接跟踪、采样和 BPF 执行。
Bridge multicast databaseRTM_NEWMDB, RTM_DELMDB, RTM_GETMDB管理网桥和 switchdev 多播转发条目,包括组、端口、VLAN、源特定多播状态、路由器端口状态、计时器和硬件卸载信息。
Bridge VLAN stateRTM_NEWVLAN, RTM_DELVLAN, RTM_GETVLAN管理网桥端口上的 VLAN 成员关系和每个 VLAN 的网桥选项。它不同于创建 VLAN 网络设备,后者使用带有vlan链路类型的RTM_NEWLINK。
Network-namespace identifiersRTM_NEWNSID, RTM_DELNSID, RTM_GETNSID为对等网络命名空间分配并解析命名空间本地的数字 ID。当对象引用另一个命名空间时,rtnetlink 属性使用这些 ID。
Per-interface protocol configurationRTM_NEWNETCONF, RTM_DELNETCONF, RTM_GETNETCONF读取并接收选定 IPv4、IPv6 和 MPLS 接口设置的变化,包括转发、反向路径过滤、多播转发、代理邻居行为以及链路关闭时对路由的处理。覆盖范围比/proc/sys/net更窄。
Data Center BridgingRTM_GETDCB, RTM_SETDCB与支持该功能的驱动程序交换数据中心桥接配置,例如优先级、优先级组、Priority Flow Control、应用程序优先级和 DCB 能力。
Prefix and IPv6 ND informationRTM_NEWPREFIX, RTM_NEWNDUSEROPT传递从 IPv6 路由器通告中学习的信息,包括前缀和用户选项。这些消息类别主要报告内核观察到的状态,而不是充当通用设置器。
Multicast and anycast address reportsRTM_GETMULTICAST, RTM_GETANYCAST and corresponding notification types枚举或报告实现这些操作的地址族的多播和任播地址状态。支持情况取决于地址族。
Link and offload statisticsRTM_NEWSTATS, RTM_GETSTATS, RTM_SETSTATS获取标准链路计数器、每链路扩展统计信息和选定的卸载统计信息。设置器支持范围仅限于目标子系统实现的属性。
Cache and tunnel reportsRTM_NEWCACHEREPORT, RTM_NEWTUNNEL, RTM_DELTUNNEL, RTM_GETTUNNEL报告地址族缓存事件,并管理或报告地址族实现的隧道状态。可用性和接受的属性取决于协议模块。

RTM_NEW*并不总是表示“仅创建”。标志决定修改语义:

FlagMeaning
NLM_F_CREATE如果对象不存在,则创建该对象。
NLM_F_EXCL如果对象已存在,则失败。
NLM_F_REPLACE替换现有对象。
NLM_F_APPEND如果受支持,则将对象添加到有序集合的末尾。
NLM_F_ACK返回成功或NLMSG_ERROR确认。
NLM_F_DUMP请求分段枚举;等价于`NLM_F_ROOT

应用程序还应启用NETLINK_EXT_ACK。扩展确认可以标识被拒绝的属性,包含可读的内核消息,并报告策略约束。成功确认表示内核已处理该消息;它并不表示一系列独立的 rtnetlink 请求具有事务性。

命名空间与一致性模型 #

rtnetlink 套接字在其所属的网络命名空间中运行。因此,大多数请求只能查看和修改该命名空间中的链路、路由、规则、邻居和流量控制对象。链路属性可以将设备移动到另一个命名空间,而命名空间 ID 消息则可以创建对等命名空间的引用。

修改请求通常要求在拥有目标网络命名空间的用户命名空间中具有CAP_NET_ADMIN。当读取请求暴露敏感的设备或协议信息时,也可能受到限制。

转储不是原子快照。在分段转储进行期间,对象可能发生变化;当接收缓冲区溢出时,多播通知可能丢失。状态同步器应:

  1. 打开套接字并将其绑定到所需的多播组。
  2. 使用唯一的序列号请求转储。
  3. 根据序列号和发送方端口 ID 匹配单播回复。
  4. 处理转储期间到达的通知。
  5. 检测ENOBUFS、被中断的转储和格式错误的属性。
  6. 当无法证明同步完成时,丢弃缓存并重新执行转储。

范围边界 #

Rtnetlink 控制网络拓扑、寻址、转发、邻居和流量控制,但它并不是每个网络子系统的接口:

FacilityControl Interface
nftables and connection trackingNETLINK_NETFILTER families
Wi-Fi configurationGeneric Netlink 上的nl80211
Modern NIC settingsGeneric Netlink 上的ethtool
devlink devices, ports, resources, and health reportersGeneric Netlink 上的devlink
WireGuard peer and key configurationGeneric Netlink 上的wireguard
MPTCP path-manager configurationGeneric Netlink 上的mptcp_pm
Per-socket TCP, UDP, multicast, and device-binding optionssetsockopt()
Network sysctls not represented by netconf messages/proc/sys/net
eBPF program and map lifecyclebpf();附加可能还会使用 rtnetlink

权威的操作列表定义在include/uapi/linux/rtnetlink.h中。内核还为链路、地址、路由、规则、邻居和流量控制发布了机器可读规范。高级程序应使用受维护的库或 iproute2,而不是手动复现 UAPI 结构布局和属性验证。

用户空间网络工具 #

Linux 没有单一的用户空间网络栈。命令行工具、策略守护进程、配置渲染器、路由守护进程和容器插件会访问不同的内核控制接口。因此,高级命令可能控制的是守护进程,而不是直接联系内核。

SoftwarePrimary RolePath to the Kernel
iproute2ip管理链路、地址、路由、规则、邻居和网络命名空间;bridge管理网桥状态;tc管理流量控制;ss检查套接字。这些程序直接使用 iproute2 的内部 Netlink 支持。大多数配置通过 rtnetlink 完成;套接字检查使用诊断 Netlink 家族。iproute2 是一组可执行文件,而不是其他网络管理器所需的守护进程。
NetworkManager维护以太网、Wi-Fi、移动宽带、VPN、IP 配置和 DNS 集成的连接配置文件与策略。nmcli、nmtui、桌面小程序和应用程序都是客户端。nmcli使用 libnm,通过 D-Bus 调用 NetworkManager 守护进程。守护进程的 Linux 平台层会直接打开 Netlink 套接字,执行常规链路、地址、路由、规则和流量控制操作;它不会通过ip可执行文件发送这些操作。可选的辅助程序处理 Wi-Fi 身份验证、PPP、DHCP、DNS 和防火墙集成等功能。
systemd-networkd应用声明式的.network、.netdev和.link配置,运行 DHCP 和路由器发现客户端,并维护网络状态。networkctl是其检查和控制 CLI。systemd-networkd使用 systemd 内部的 Netlink 实现配置内核。对于受管理配置,networkctl使用 networkd API 和状态,而不是调用 iproute2。
Netplan将发行版级别的 YAML 转换为后端配置,并协调该配置的应用。Netplan 选择 NetworkManager 或 systemd-networkd 作为渲染器。持续执行内核配置的是选定的守护进程,而不是 Netplan 的 YAML 解析器。
nftablesnft创建防火墙、NAT、数据包分类以及集合或映射规则。libnftables 向应用程序公开相同的引擎。nft使用 libnftables 和 libnftnl,通过NETLINK_NETFILTER与 nftables 子系统交换批量消息;它不使用 rtnetlink 或 iproute2。
firewalld维护动态防火墙区域、服务、策略以及独立的运行时和持久配置。firewall-cmd是其主要 CLI。firewall-cmd通过 D-Bus 调用 firewalld 守护进程。该守护进程通常通过 nftables 后端应用规则,而不是要求 NetworkManager 或 iproute2 安装规则。
ethtool读取和更改驱动程序与 NIC 属性,例如链路模式、通道、环、合并、卸载、RSS、统计信息和固件数据。较新的操作使用 ethtool Generic Netlink 家族。较旧或尚未转换的操作使用SIOCETHTOOL ioctl,因此实际路径取决于命令和内核支持。
iw检查和配置 802.11 物理设备、虚拟接口、信道、站点、扫描、省电和监管状态。iw向nl80211 Generic Netlink 家族发送命令。它不会调用ip,但生成接口的普通链路和 IP 层配置仍由ip负责。
wpa_supplicant and iwd执行 Wi-Fi 扫描、身份验证、关联、漫游和密钥管理。每个守护进程都通过nl80211控制 cfg80211/mac80211。NetworkManager 可以通过 D-Bus 控制任一守护进程;随后由 Wi-Fi 守护进程与内核通信。
conntrack-tools列出、修改、监视和复制 Netfilter 连接跟踪状态。conntrack和conntrackd通过NETLINK_NETFILTER上的 ctnetlink 工作,独立于 rtnetlink。
bpftool加载和检查 eBPF 程序、映射、链接、BTF、cgroup 以及选定的网络附加关系。大多数对象生命周期操作使用 libbpf 和bpf()系统调用。部分网络操作还会检查或修改由 rtnetlink 管理的 XDP 和流量控制状态。
FRRouting and BIRD实现 BGP、OSPF、IS-IS 和 RIP 等路由协议,并将学习到的路由与内核 FIB 进行协调。FRRouting 协议守护进程将路由提交给其zebra守护进程,由后者通过 rtnetlink 配置内核。BIRD 在 Linux 上通过路由套接字或 Netlink 执行自己的内核协议同步。两者在稳定状态下安装路由都不需要ip可执行文件。
Open vSwitch为虚拟化、容器、覆盖网络和软件定义网络实现可编程虚拟交换。ovs-vsctl修改 OVS 数据库;ovs-vswitchd使用该配置,并通过 OVS Generic Netlink 家族控制 Linux OVS 数据路径。辅助链路和隧道设置也可能涉及 rtnetlink。
CNI plugins当兼容的运行时调用插件时,配置容器网络命名空间。常见插件会创建 veth 对、网桥、路由、策略和覆盖网络。插件以短生命周期程序运行,并通常直接使用 Go Netlink 库。插件还可能调用或链接防火墙、eBPF、IPAM 或数据存储组件;CNI 规定的是调用和结果格式,而不是单一的内核后端。
net-tools提供旧版ifconfig、route、arp和netstat命令。这些工具主要使用网络设备和路由 ioctl,并解析 procfs。对于新的自动化,iproute2 和结构化 Netlink 接口已经取代它们。

控制与依赖路径 #

箭头描述的是运行时控制流,而不是软件包所有权。NETLINK_ROUTE、NETLINK_NETFILTER和nl80211是通过AF_NETLINK套接字访问的内核协议。

flowchart LR
    subgraph clients[Clients and Configuration]
        nmcli["nmcli / GUI"]
        networkctl
        netplan[Netplan]
        firewallcmd[firewall-cmd]
    end

    subgraph controllers[Daemons and Direct Utilities]
        nm[NetworkManager]
        networkd[systemd-networkd]
        wifi["wpa_supplicant / iwd"]
        firewalld
        iproute["ip / bridge / tc"]
        nft
        iw
        ethtool
        bpftool
    end

    subgraph apis[Kernel Control Interfaces]
        rtnl["NETLINK_ROUTE<br/>(rtnetlink)"]
        nfnl[NETLINK_NETFILTER]
        nl80211["nl80211<br/>(Generic Netlink)"]
        ethtoolapi["ethtool Generic Netlink<br/>or device ioctl"]
        bpfapi["bpf() syscall"]
    end

    kernel[Linux Network Kernel]

    nmcli -->|"libnm + D-Bus"| nm
    networkctl -->|"daemon IPC"| networkd
    netplan -.->|"generates configuration"| nm
    netplan -.->|"generates configuration"| networkd
    firewallcmd -->|D-Bus| firewalld

    nm -->|"internal Netlink"| rtnl
    nm -->|D-Bus| wifi
    networkd -->|sd-netlink| rtnl
    iproute -->|"internal libnetlink"| rtnl
    firewalld -->|"nftables backend"| nfnl
    nft -->|"libnftables + libnftnl"| nfnl
    wifi --> nl80211
    iw --> nl80211
    ethtool --> ethtoolapi
    bpftool -->|libbpf| bpfapi

    rtnl --> kernel
    nfnl --> kernel
    nl80211 --> kernel
    ethtoolapi --> kernel
    bpfapi --> kernel

该图直接回答了常见的nmcli依赖问题:

  1. nmcli通过libnm构造请求。
  2. libnm通过D-Bus将请求发送给NetworkManager 守护进程。
  3. NetworkManager 通过自己的 Netlink 实现应用普通的内核网络状态。
  4. iproute2 是同一内核 API 的独立管理客户端,而不是 NetworkManager 与内核之间的中间层。

在 shell 自动化中,从程序调用ip、nft或其他 CLI 仍然有用,但长期运行的管理器通常使用库,或直接实现内核协议。直接访问可以避免解析命令输出,并允许管理器订阅异步状态通知。

评论

在 GitHub 上阅读或评论(发表评论需要登录)