Dpdk学习过程中记录下来的代码
Dpdk
流程
安装
- VM虚拟机,centos7-x86_64 两个NAT 一个桥接(管理口)
-
配置网络
-
修改
ll /etc/sysconfig/network-scripts/
ens相关的配置文件-
BOOTPROTO=dhcp ONBOOT=yes
-
-
service network restart
-
检查网卡和状态
-
-
安装依赖
-
修改yum源
-
vi /etc/yum.repos.d/CentOS-Base.repo
-
# 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
-
yum clean all
- yum makecache
-
-
安装编译环境依赖
-
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
-
-
检查
gcc -v
-
安装dpdk依赖,yamu打包
-
rpm -Uvh *.rpm --nodeps --force
-
启动
-
检查网卡状态
python3 dpdk-devbind.py -s
-
# 启动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
#
逻辑
- 初始化Dpdk环境
- 创建内存池,所有的对象存取都是从池中根据需要的尺寸进行获取的
- 初始化网卡信息,获取dpdk绑定的网卡的总数
- 面向过程编程的语言,使用func+fid获取对象属性
- 从当前绑定的网卡上获取基础信息和实时信息
- 配置网卡的功能,收包队列数,发包队列数,网卡配置参数等
- 设置收包队列
- lcore,队列编号,环大小,socketId(从port上获取),收包使用的pool
- 设置发包队列
- lcore,队列编号,环大小,socketId(从port上获取),发包配置
- 设置收包队列
- 启动网卡
- 启用混杂模式,接收所有的流量
- 开始主循环
- 创建一个timer用来执行定时任务
- 创建一个环对象,用来进行不同的process间通信
- 启动一个用户态的协议处置函数,使用一个新的lcore执行
- 收包
- 接收报文
- 提交给in_ring进行后续处理
- 从out_ring内提取报文进行后续处理
- 释放
- 执行定时任务
# 网卡结构体对象
struct rte_eth_dev_info dev_info;
struct rte_eth_link link;
struct rte_eth_stats stats;
struct rte_ether_addr mac_addr;
协议说明
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字节的倍数) |
课程大纲
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