Dpdk绕过了Linux内核态协议栈,以提升报文处理效率。直接截获网卡的原始数据,让用户自行处理,解析协议等等。
网卡是将数字信号与模拟信号进行转换的设备。
可用作:防火墙、测试工具、CDN(对网络要求比较高的场景都可以使用)

特点:
1. 用户态驱动(PMD:Poll Mode Driver)
传统网卡驱动运行在内核态,DPDK使用轮询模式驱动(PMD) 替代中断模式:
应用程序直接调用PMD API,主动轮询网卡接收队列(Rx Queue),而非等待网卡中断通知;
避免了"中断风暴"(大量数据包到来时的频繁中断处理开销),同时消除了内核态到用户态的上下文切换。
2. 大页内存(HugePages)
默认Linux内存页大小为4KB,DPDK要求使用2MB/1GB的大页内存 :
减少TLB( Translation Lookaside Buffer,地址转换缓存)的缺失率,加速虚拟地址到物理地址的转换,提高吞吐量;
降低内存管理开销,提升内存访问效率。
3. 零拷贝(Zero-Copy)
传统流程中数据包需从"网卡DMA缓冲区→内核缓冲区→用户缓冲区"三次拷贝,DPDK通过以下方式实现零拷贝:
网卡直接通过DMA将数据写入用户态预先分配的大页内存缓冲区 ;
应用程序直接从该缓冲区读取数据,无需中间拷贝。
4. CPU亲和性(CPU Affinity)
将DPDK线程绑定到特定的CPU核心(Core Affinity):
避免线程在不同核心间迁移导致的缓存失效(Cache Miss);
充分利用多核CPU的并行处理能力,实现"每个核心处理一个队列"的高效模型。
5. 无锁队列与环形缓冲区(Ring Buffer)
DPDK提供多生产者-多消费者(MPMC)的无锁环形队列,用于线程间或组件间的数据传递:
基于原子操作实现同步,避免锁竞争的开销;
高效支持高并发场景下的数据包流转。
DPDK适用于对网络性能、延迟、吞吐量要求极高的场景。(云计算,高性能计算,网络安全等)
DPDK可以只处理特点的协议,然后将其他的协议再写回协议栈,继续使用内核的协议栈进行解析。
UDP :DPDK最擅长的协议之一
UDP是无连接、轻量的传输层协议,无需三次握手、重传机制,天生适合低延迟场景。DPDK可直接在用户态解析UDP头部,快速提取数据(如游戏、直播、金融行情的UDP数据包)。
TCP :虽然TCP比UDP复杂(需处理连接、重传、拥塞控制),但DPDK也支持TCP的用户态实现(如librte_net_tcp库),用于高性能TCP代理、负载均衡等场景。
DPDK的接收发送队列怎么理解?好像有8个接口
DPDK中,队列是网卡与应用程序之间传递数据包的"缓冲区通道":
接收队列(Rx Queue):网卡将收到的数据包存入队列,应用程序从队列中读取并处理;
发送队列(Tx Queue):应用程序将待发送的数据包放入队列,网卡从队列中取出并发送到网络。
每个队列对应一组内存缓冲区(通常是DPDK预分配的大页内存),数据包在队列中以"指针"形式存在(避免拷贝),实现高效流转。
每一个物理接口有8个队列,有的会支持16、32队列。
多队列优势:
- 多核并行处理。
- 低延迟
- 高可靠。
大小端的处理是什么情况?
大小端是"多字节数据的存储顺序"问题,网络协议用大端,x86主机用小端;DPDK必须处理大小端转换,否则会解析错误网络数据包;DDK提供rte_byteorder.h中的函数,使用时只需调用对应函数即可。
基于DPDK实现eth、ip、udp、tcp协议;基于DPDK实现dns server都可以写在简历中。
环境配置
cd ~/share/dpdk/dpdk-stable-19.08.2
sudo su
exportRTE_SDK=/home/king/share/dpdk/dpdk-stable-19.08.2/
export RTE_TARGET=x86_64-native-linux-gcc
ifconfig eth0
ifconfig eth0 down
./usertools/dpdk-setup.sh
依次输入:43、44 、45、46(512)、47(512)、49(eth0 地址)、60
环境准备就绪,eth0已经被dpdk接管,使用命令ifconfig -a也看不到eth0
重启后cd ~/share/dpdk/dpdk-stable-19.08.2
ifconfig
再次配置一下,只需要43 44 49即可
然后返回代码目录
更改Makefile里的参数SRCS-y := ustack_01_re.c
make
sudo ./build/ustack
Windows配置
Windows shell:
arp -a
netsh i i show in
netsh -c i i add neighbors 19 172.xx.xx.xx 00-0c-xx-xx-xx-xx
netsh -c i i add neighbors 19 10.xx.xx.xx 00-0c-xx-xx-xx-xx
172.xx.xx.xx(eth0的IP地址) 00-0c-xx-xx-xx-xx(eth0的Mask地址)
报错" Cannot use IOVA as 'PA' since physical addresses are not available"
Debug:
没有权限,执行文件前加sudo
卡在这一个多小时,如果直接将上面句话百度,就可以解决。但我问了Ai,给出"./build/ustack -l 0-7 --iova-mode=va",然后报错 巨页 设置有问题,改巨页的问题改了一个多小时,还恢复了快照!!!
虚拟机配置
使用DPDK时, 一定要支持多队列网卡,所修改的 zerovoice.vmx中的vmxnet3 就是为了支持多队列网卡。
添加:
ethernet0.virtualDev = "vmxnet3"
ethernet0.wakeOnPcktRcv = "TRUE"
拟机配置
使用DPDK时, 一定要支持多队列网卡,所修改的 zerovoice.vmx中的vmxnet3 就是为了支持多队列网卡。
添加:
ethernet0.virtualDev = "vmxnet3"
ethernet0.wakeOnPcktRcv = "TRUE"