Dpdk安装

By Jamie

Dpdk学习过程中记录下来的代码

Dpdk

流程

安装

  1. VM虚拟机,centos7-x86_64 两个NAT 一个桥接(管理口)

image-20250514124046304

  1. 配置网络

    1. 修改ll /etc/sysconfig/network-scripts/ens相关的配置文件

      1. BOOTPROTO=dhcp	
        ONBOOT=yes
        
    2. service network restart

    3. 检查网卡和状态

  2. 安装依赖

    1. 修改yum源

      1. vi /etc/yum.repos.d/CentOS-Base.repo

      2. # CentOS-Base.repo
        #
        # The mirror system uses the connecting IP address of the client and the
        # update status of each mirror to pick mirrors that are updated to and
        # geographically close to the client.  You should use this for CentOS updates
        # unless you are manually picking other mirrors.
        #
        # If the mirrorlist= does not work for you, as a fall back you can try the 
        # remarked out baseurl= line instead.
        #
        #
                  
        [base]
        name=CentOS-$releasever - Base - mirrors.aliyun.com
        failovermethod=priority
        baseurl=https://mirrors.aliyun.com/centos/$releasever/os/$basearch/
                https://mirrors.aliyuncs.com/centos/$releasever/os/$basearch/
                https://mirrors.cloud.aliyuncs.com/centos/$releasever/os/$basearch/
        gpgcheck=1
        gpgkey=https://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
                  
        #released updates 
        [updates]
        name=CentOS-$releasever - Updates - mirrors.aliyun.com
        failovermethod=priority
        baseurl=https://mirrors.aliyun.com/centos/$releasever/updates/$basearch/
                https://mirrors.aliyuncs.com/centos/$releasever/updates/$basearch/
                https://mirrors.cloud.aliyuncs.com/centos/$releasever/updates/$basearch/
        gpgcheck=1
        gpgkey=https://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
                  
        #additional packages that may be useful
        [extras]
        name=CentOS-$releasever - Extras - mirrors.aliyun.com
        failovermethod=priority
        baseurl=https://mirrors.aliyun.com/centos/$releasever/extras/$basearch/
                https://mirrors.aliyuncs.com/centos/$releasever/extras/$basearch/
                https://mirrors.cloud.aliyuncs.com/centos/$releasever/extras/$basearch/
        gpgcheck=1
        gpgkey=https://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
                  
        #additional packages that extend functionality of existing packages
        [centosplus]
        name=CentOS-$releasever - Plus - mirrors.aliyun.com
        failovermethod=priority
        baseurl=https://mirrors.aliyun.com/centos/$releasever/centosplus/$basearch/
                https://mirrors.aliyuncs.com/centos/$releasever/centosplus/$basearch/
                https://mirrors.cloud.aliyuncs.com/centos/$releasever/centosplus/$basearch/
        gpgcheck=1
        enabled=0
        gpgkey=https://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
                  
        #contrib - packages by Centos Users
        [contrib]
        name=CentOS-$releasever - Contrib - mirrors.aliyun.com
        failovermethod=priority
        baseurl=https://mirrors.aliyun.com/centos/$releasever/contrib/$basearch/
                https://mirrors.aliyuncs.com/centos/$releasever/contrib/$basearch/
                https://mirrors.cloud.aliyuncs.com/centos/$releasever/contrib/$basearch/
        gpgcheck=1
        enabled=0
        gpgkey=https://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
                 
        
      3. yum clean all

      4. yum makecache
    2. 安装编译环境依赖

      1. yum groupinstall -y "Development Tools" gcc gcc-c++ make cmake autoconf automake libtool git wget curl patch rpm-build redhat-rpm-config glibc-devel glibc-headers libstdc++-deve python3 vim htop iotop tcpdump netstat
        
    3. 检查gcc -v

    4. 安装dpdk依赖,yamu打包

      1. rpm -Uvh *.rpm --nodeps --force
        

    启动

    1. 检查网卡状态python3 dpdk-devbind.py -s

      1. image-20250514125054648
      2. image-20250515101932315
    2. # 启动UIO
      modprobe uio
            
      # 添加vfio-pci
      /sbin/modprobe vfio enable_unsafe_noiommu_mode=1
      /sbin/modprobe vfio-pci
            
      cd /root/dpdk-20.11/usertools
            
      # 查看网卡状态 
      python3 dpdk-devbind.py -s
      ifconfig
      lshw -class network -businfo
            
      # 网卡下线
      ifconfig ens33 down
            
      # 绑定dpdk网卡
      python3 dpdk-devbind.py -b vfio-pci 02:01.0
            
      # 查看和设置大页
      python3 dpdk-hugepages.py -s
      python3 dpdk-hugepages.py -p 2M --setup 2G
            
      # 检查配置
      pkg-config --exists libdpdk
      # 确认所有依赖都已经安装
      cd /usr/lib64/pkgconfig/
            
      # 发包
      bittwist -i ens38 -m 0.0002 -l 0 ./39.pcap 
      

命令

# 查看cpu的socket分布
numactl -H
lscpu --extended

#  

逻辑

image-20250520113312961

  1. 初始化Dpdk环境
  2. 创建内存池,所有的对象存取都是从池中根据需要的尺寸进行获取的
  3. 初始化网卡信息,获取dpdk绑定的网卡的总数
    1. 面向过程编程的语言,使用func+fid获取对象属性
    2. 从当前绑定的网卡上获取基础信息和实时信息
  4. 配置网卡的功能,收包队列数,发包队列数,网卡配置参数等
    1. 设置收包队列
      1. lcore,队列编号,环大小,socketId(从port上获取),收包使用的pool
    2. 设置发包队列
      1. lcore,队列编号,环大小,socketId(从port上获取),发包配置
  5. 启动网卡
    1. 启用混杂模式,接收所有的流量
  6. 开始主循环
    1. 创建一个timer用来执行定时任务
    2. 创建一个环对象,用来进行不同的process间通信
    3. 启动一个用户态的协议处置函数,使用一个新的lcore执行
    4. 收包
  7. 接收报文
    1. 提交给in_ring进行后续处理
    2. 从out_ring内提取报文进行后续处理
    3. 释放
    4. 执行定时任务
# 网卡结构体对象
struct rte_eth_dev_info dev_info;
struct rte_eth_link link;
struct rte_eth_stats stats;
struct rte_ether_addr mac_addr;

协议说明

image-20250519105050251

Ether Type

EtherType (Hex) 协议名称 使用场景 使用频率 重点掌握 备注
0x0800 IPv4 互联网通信(HTTP、TCP/UDP等) ★★★★★ ✅ 必须掌握 最基础的网络协议
0x86DD IPv6 新一代互联网通信(逐步替代IPv4) ★★★★☆ ✅ 必须掌握 未来主流协议
0x0806 ARP 解析IP地址到MAC地址(局域网通信) ★★★★★ ✅ 必须掌握 基础网络维护必备
0x8035 RARP 无盘工作站获取IP(已淘汰) ★☆☆☆☆ ❌ 了解即可 被DHCP取代
0x8100 VLAN (802.1Q) 虚拟局域网划分(企业网络隔离) ★★★★☆ ✅ 重要 网络工程常用
0x88A8 QinQ (802.1ad) 运营商级VLAN(双层标签) ★★☆☆☆ ⭕ 中级掌握 主要用于ISP网络
0x8863 PPPoE Discovery 宽带拨号认证(如家庭光纤接入) ★★★☆☆ ⭕ 中级掌握 常见于PPPoE拨号
0x8864 PPPoE Session PPPoE数据传输阶段 ★★★☆☆ ⭕ 中级掌握 与Discovery配对使用
0x88CC LLDP 网络设备拓扑发现(替代CDP) ★★★☆☆ ⭕ 中级掌握 网络运维工具
0x8847 MPLS 运营商高速转发(标签交换) ★★☆☆☆ ❌ 了解即可 核心网络技术
0x88F7 PTP (1588) 高精度时间同步(工业自动化、5G) ★★☆☆☆ ❌ 了解即可 特定领域需求
0x6558 TEB (Transparent Bridging) 透明以太网桥接 ★☆☆☆☆ ❌ 了解即可 特殊场景使用
0x8809 Slow Protocols (LACP) 链路聚合控制(提高带宽冗余) ★★★☆☆ ⭕ 中级掌握 企业网络常用
0x893F E-Tag (802.1BR) 边缘虚拟桥接(数据中心网络) ★☆☆☆☆ ❌ 了解即可 超融合架构专用
0xAEFE eCPRI 5G前传网络(基站与核心网通信) ★★☆☆☆ ❌ 了解即可 5G专用协议
0x9100 0x9200 0x9300 Deprecated QinQ 旧版QinQ(已弃用) ★☆☆☆☆ ❌ 忽略 0x88A8取代

Ipv4

字段名 长度 (Bits) 说明 常见值/示例
Version 4 协议版本(IPv4固定为 4 0100(二进制,表示 IPv4)
IHL (Header Length) 4 头部长度(以 4字节 为单位),最小为 5(20字节) 0101(5,即标准20字节头部)
Type of Service (ToS) 8 服务质量(QoS)标记,包括优先级、延迟、吞吐量等(现多用于 DSCP/ECN) 00000000(默认)
Total Length 16 整个数据包长度(IP头 + 数据),单位:字节(最大 65535) 00 28(40字节)
Identification 16 数据包唯一标识,用于分片重组 随机值(如 0xABCD
Flags 3 分片控制: - Bit 0: 保留(必须为0) - Bit 1: DF(禁止分片) - Bit 2: MF(更多分片) 010(DF=1, MF=0)
Fragment Offset 13 分片偏移量(以 8字节 为单位) 0(未分片)
Time to Live (TTL) 8 生存时间(每经过一跳减1,到0时丢弃) 64(Linux默认)
Protocol 8 上层协议类型(如 TCP、UDP、ICMP) 6(TCP)、17(UDP)
Header Checksum 16 头部校验和(仅校验头部,不包括数据) 由内核计算
Source Address 32 源 IP 地址(4字节) 192.168.1.100
Destination Address 32 目标 IP 地址(4字节) 8.8.8.8
Options (可选) 0-320 附加选项(如时间戳、路由记录),长度可变(需填充到4字节对齐) 通常为空
Padding 可变 填充字段(确保头部长度是4字节的倍数)  

image-20250519111424905

image-20250519111441560

课程大纲

01.dpdk网络协议栈之arpicmp的实现(10节)/1--课程学习路线与大纲内容 .mp4
01.dpdk网络协议栈之arpicmp的实现(10节)/10--arp-table的实现 .mp4
01.dpdk网络协议栈之arpicmp的实现(10节)/2--dpdk环境搭建与多队列网卡 .mp4
01.dpdk网络协议栈之arpicmp的实现(10节)/3--dpdk网卡绑定与arp .mp4
01.dpdk网络协议栈之arpicmp的实现(10节)/4--dpdk发送过程的实现 .mp4
01.dpdk网络协议栈之arpicmp的实现(10节)/5--dpdk发送过程调试 .mp4
01.dpdk网络协议栈之arpicmp的实现(10节)/6--dpdk-arp实现 .mp4
01.dpdk网络协议栈之arpicmp的实现(10节)/7--arp 调试流程 .mp4
01.dpdk网络协议栈之arpicmp的实现(10节)/8--dpdk-icmp实现 .mp4
01.dpdk网络协议栈之arpicmp的实现(10节)/9--dpdk-icmp流程调试与checksum实现 .mp4
02.dpdk网络协议栈之udptcp的实现(10节)/11--arp request实现.mp4
02.dpdk网络协议栈之udptcp的实现(10节)/12--arp 调试流程.mp4
02.dpdk网络协议栈之udptcp的实现(10节)/13--协议栈架构设计优化.mp4

02.dpdk网络协议栈之udptcp的实现(10节)/14--udp实现之udp系统api的设计.mp4
02.dpdk网络协议栈之udptcp的实现(10节)/15--udp实现之sbuf与rbuf的环形队列.mp4
02.dpdk网络协议栈之udptcp的实现(10节)/16--udp实现之发送流程与并发解耦.mp4
02.dpdk网络协议栈之udptcp的实现(10节)/17--udp实现之架构设计与调试.mp4
02.dpdk网络协议栈之udptcp的实现(10节)/18--tcp 三次握手实现之dpdk tcp流程架构设计.mp4
02.dpdk网络协议栈之udptcp的实现(10节)/19--tcp三次握手实现之dpdk tcp11个状态实现.mp4
02.dpdk网络协议栈之udptcp的实现(10节)/20--tcp三次握手实现之dpdk代码调试.mp4
03.dpd网络协议栈之tcp的实现(10节)/21--tcp数据传输之ack与seqnum的确认实现.mp4
03.dpd网络协议栈之tcp的实现(10节)/22--tcp数据传输之ack与seqnum代码实现.mp4
03.dpd网络协议栈之tcp的实现(10节)/23--tcp协议api实现之bind,listen的实现.mp4
03.dpd网络协议栈之tcp的实现(10节)/24--tcp协议api实现之accept的实现.mp4
03.dpd网络协议栈之tcp的实现(10节)/25--tcp协议api实现之send,recv的实现.mp4
03.dpd网络协议栈之tcp的实现(10节)/26--tcp协议api实现之close的实现.mp4
03.dpd网络协议栈之tcp的实现(10节)/27--tcp协议栈调试之段错误与逻辑流程.mp4
03.dpd网络协议栈之tcp的实现(10节)/28--tcp协议栈调试之ringbuffer内存错误..mp4
03.dpd网络协议栈之tcp的实现(10节)/29--dpdk kni的原理与kni启动.mp4
03.dpd网络协议栈之tcp的实现(10节)/30--重构网络协议分发的流程.mp4

04.dpdk基础组件(10节)/31--kni抓包调试tcpdump.mp4
04.dpdk基础组件(10节)/32--dpdk kni mempool错误与内存泄漏.mp4
04.dpdk基础组件(10节)/33--DPDK的kni内核处理流程(补).mp4
04.dpdk基础组件(10节)/34--dpdk dns处理流程(1).mp4
04.dpdk基础组件(10节)/35--dpdk dns处理流程(2).mp4
04.dpdk基础组件(10节)/36--基于熵的ddos检测的数学理论.mp4
04.dpdk基础组件(10节)/37--dpdk ddos熵计算代码实现.mp4
04.dpdk基础组件(10节)/38--dpdk ddos attach检测准确度调试.mp4
04.dpdk基础组件(10节)/39--ddos attack 测试工具hping3.mp4
04.dpdk基础组件(10节)/40--dpdk 布谷鸟hash原理与使用.mp4

07.golang的网络开发框架 nff-go(golang)(4节)/57--nff-go的技术原理分析.mp4
07.golang的网络开发框架 nff-go(golang)(4节)/58--nff-go数据接收代码实现.mp4
07.golang的网络开发框架 nff-go(golang)(4节)/59--nff-go收发数据与包解析显示.mp4
07.golang的网络开发框架 nff-go(golang)(4节)/60--ipsec协议解析与strongswan的ipsec.mp4

12.基础组件(5节)/88--mempool与mbuf的源码分析讲解.mp4
12.基础组件(5节)/89--dpdk-ringbuffer源码分析.mp4
12.基础组件(5节)/90--dpdk-igb_uio源码分析.mp4
12.基础组件(5节)/91--dpdk-kni源码分析.mp4
12.基础组件(5节)/92--rcu的实现与互斥锁,自旋锁,读写锁.mp4

13.tcp并发(5节)/93--tcp并发连接的设计.mp4
13.tcp并发(5节)/94--tcp并发epoll的实现.mp4
13.tcp并发(5节)/95--tcp并发协议栈与epoll的回调与并发测试.mp4
13.tcp并发(5节)/96--bpf与bpftrace系统,网络挂载实现.mp4
13.tcp并发(5节)/97--bpf与bpftrace应用程序ntyco的挂载监控.mp4

15.高性能4层负载均衡器 DPVS(6节)/106--dpvs的技术组件与功能实现.mp4
15.高性能4层负载均衡器 DPVS(6节)/107--dpvs 与lvs+keepalived的关系.mp4
15.高性能4层负载均衡器 DPVS(6节)/108--dpvs的FNat NAT SNAT模式.mp4
15.高性能4层负载均衡器 DPVS(6节)/109--通过quagga配置ospf.mp4
15.高性能4层负载均衡器 DPVS(6节)/110--dpvs测试用例 ipset,tc,mempool.mp4
15.高性能4层负载均衡器 DPVS(6节)/111--dpvs的tc流控操作与源码实现.mp4

16.TRex-iperf3-dpdk-pktgen(4节)/112--vcl与iperf3性能测试 客户端与服务器.mp4
16.TRex-iperf3-dpdk-pktgen(4节)/113--TRex的运行原理与dpdk的关系.mp4
16.TRex-iperf3-dpdk-pktgen(4节)/114--流编排与自动化框架.mp4
16.TRex-iperf3-dpdk-pktgen(4节)/115--dpdk-pktgen命令讲解.mp4
Tags: learn