

DPDK Underprinning
DPDK Practice
DPDK Application Layer
- DPDK Application 编程
Device Class Framework
Poll Mode Drivers(PMD)
DPDK NET TX/RX
Ethernet Header Layout
IP Header Layout
TCP Header Layout
DPDK Bus Framework
Environment Abstraction Layer(EAL)
DPDK MEMORY MANAGEMENT
DPDK Lcore
DPDK NET MBUF
DPDK with VFIO
In-Depth Research on DPDK Mechanisms
SPDK
VPP



网络的本质是让分散的计算节点能够交换数据,而这一切都依赖于网卡(NIC)作为计算机与物理链路之间的桥梁. 网卡负责将主机内存中的数据转换为适合在光纤或电缆上传输的电信号或光信号,同时也将接收到的信号还原成主机可识别的数据包. 在传统操作系统中,这一过程由内核协议栈主导,网卡驱动通过中断通知 CPU 有数据到达,再经过多层软件处理后才交给应用程序,虽然功能完整,但在高速网络环境下,频繁的中断、上下文切换和数据拷贝会成为严重的性能瓶颈. 正是对这套网络子系统底层机制的深刻理解,才让我们能够跳出内核框架,重新思考如何让数据包以更高效的方式在网卡与应用程序之间流动.

不同厂商、不同架构的设备要想互相交换数据,必须遵循一套共同的规则,这就是网络协议存在的根本原因. 网络协议之所以采用分层模型,是为了把复杂的通信问题拆解成职责清晰、可独立演进的模块. OSI 七层模型从下到上依次是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层, 其中:
- 物理层: 负责比特在介质上的传输
- 数据链路层: 通过 MAC 地址实现同一链路内的可靠帧传递
- 网络层: 使用 IP 地址完成跨网络的路由与寻址传输层提供端到端的可靠(TCP)或高效(UDP)数据传输
- 会话层: 管理通信会话的建立与维护
- 表示层: 处理数据的编码、加密与压缩
- 应用层: 则直接面向用户提供 HTTP、FTP、DNS 等具体服务
而实际广泛使用的 TCP/IP 五层模型将 OSI 的会话层、表示层和应用层合并为应用层,形成物理层、数据链路层、网络层、传输层和应用层的简洁结构,这种简化更贴近真实协议栈的实现. 深刻理解这两套模型的分层逻辑与职责边界,是后续分析内核协议栈瓶颈、设计用户态高速转发路径的基础: 只有清楚每一层在做什么,才能准确判断哪些处理可以被旁路、哪些必须保留,从而真正发挥 DPDK 这类框架的性能优势.

传统网络协议栈完全运行在内核态,应用程序发送或接收一个数据包时,数据必须在用户态缓冲区、内核协议栈缓冲区、驱动缓冲区以及网卡之间进行多次拷贝,同时还伴随着系统调用、软中断和上下文切换。这种设计在功能上虽然完整可靠,但在高吞吐、低延迟的业务场景下却成为致命瓶颈——每一次多余的内存拷贝和特权级切换都会消耗大量 CPU 周期,导致即使网卡硬件能力再强,软件路径也早已力不从心。正是深刻认识到“数据拷贝”才是高性能网络最核心的痛点,DPDK 才把绕过内核、实现用户态零拷贝作为首要解决的问题.
正是基于对传统内核协议栈“多次拷贝 + 中断 + 上下文切换”这一根本痛点的认识,DPDK 通过用户态轮询驱动和零拷贝机制,彻底绕过了内核数据路径。它带来的直接好处是:数据包从网卡 DMA 到用户态 mbuf 后,应用可以直接进行处理而无需再经过内核协议栈,显著降低了延迟并大幅提升了吞吐量;同时,通过将收发线程绑定到独立 CPU 核心、使用大页内存和精细的队列管理,DPDK 还能充分利用多核并行能力,并高效利用网卡硬件 offload 特性。这些改进让 DPDK 成为构建高性能网络功能(如虚拟交换机、负载均衡、防火墙、AI 推理数据面等)的核心基础,真正让软件性能能够跟上高速网卡的硬件能力。

DPDK 的整体架构采用分层设计,每一层都有明确的职责边界,既保证了高性能的数据路径,又提供了良好的可扩展性和可移植性. 从硬件访问到应用编程接口,各层相互协作,共同构建起用户态高性能网络处理的基础, 下面将自上而下或自下而上逐层剖析,深入理解每一层的组成与作用:
- DPDK Application: 这是开发者直接编写的业务代码层,负责调用高层 API(如 rte_eth_dev_configure、rte_eth_rx_queue_setup、rte_eth_rx_burst、rte_eth_tx_burst 等)来配置网口、收发数据包并实现具体业务逻辑,比如转发、过滤或协议处理,其核心作用是让开发者专注于业务本身,而无需关心底层硬件细节.
- 设备类框架: 这一层提供了统一的设备抽象模型,封装了不同类型设备(以太网、密码设备、事件设备等)的公共控制接口、状态管理、事件通知和配置流程,其核心作用是向上为应用层提供一致的编程接口,向下对接各种具体驱动,实现设备管理的标准化和可扩展性.
- PMD Driver(Poll Mode Driver): 这是直接与具体硬件交互的用户态驱动层,包含 virtio、ixgbe、i40e、mlx5 等多种驱动实现,负责设备初始化、特性协商、队列管理以及最核心的收发包函数,其核心作用是通过轮询方式直接操作硬件寄存器和描述符环,实现高性能、无中断的数据路径
- Bus Framework(总线框架): 负责管理各种总线类型(PCI、vdev、platform、auxiliary 等),完成设备的扫描、探测、驱动与设备匹配以及热插拔处理,其核心作用是将不同总线上的硬件设备统一抽象成可被上层驱动识别和使用的资源,为 PMD 提供设备发现和生命周期管理能力
- EAL(Environment Abstraction Layer): 环境抽象层,是 DPDK 最底层的支撑平台,负责大页内存分配、IOVA 映射、CPU 亲和性、进程/多进程模型、日志、定时器等基础功能,其核心作用是为上层所有组件提供与操作系统和硬件无关的统一运行环境,实现跨平台的可移植性.
- VFIO/UIO/Kernel Support: 这一层负责将 PCI 等设备安全地绑定到用户态,完成 BAR 寄存器映射、DMA/IOMMU 地址转换以及中断处理,其核心作用是让用户态驱动能够直接、安全地访问硬件资源,同时最大限度减少内核参与,从而实现真正的内核旁路.
- Hardware: 最底层的物理网卡等硬件设备,负责实际的报文收发、DMA 操作和部分 offload 功能,其核心作用是为整个 DPDK 栈提供最终的物理执行能力.

