DPDK 技术系统学习一(接收,发送,arp,icmp 功能测试)
如何技术不去手动做练习实践,就总有一种无从下手的感觉
文末附上小编总结的DPDK学习路线图以及我的学习资料。
0:准备环境并启动,使用 dpdk 接管其中一个网卡。
ubuntu 虚拟机环境配置多队列网卡,安装 dpdk。
在环境已经配置 ok 的前提下,每次重启环境后需要重新配置环境变量,并且绑定网卡。
1:测试 dpdk 接管网卡数据,测试对 udp 数据的接收。
1:描述预计准备
通过第 0 步,dpdk 已经接管了网卡,个人理解是这里与 mac 地址。==》dpdk 接管网卡
获取老师提供的已有的基于 dpdk 实现的测试接收功能的 demo 代码。==》准备 demo
demo 实现原理 ==》通过 dpdk 提供的接口获取到网卡数据,对数据进行过滤,观察 udp 数据
参考 dpdk examples 目录,用 makefile 进行编译。 ===》编译测试代码,使用 make 命令
查看生成的可执行文件,目录如下:
运行测试进行查看,
===》网卡接收到的数据过多
===》使用测试代码对接收到数据进行过滤,解析 udp 的相关数据,通过打印观察现象,
===》运行测试 demo,使用串口调试工具模拟 udp 的发送,观察 demo 打印信息。
2:正确测试结果如下:
1:测试 demo 运行如下:
2:启动网络调试助手进行数据发送测试:==》中间可能有发送不成功,下文分析
![](https://static001.geekbang.org/infoq/7a/7a8e3d4cd36b22437923206c2a35f7d7.png)
编辑切换为居中
添加图片注释,不超过 140 字(可选)
描述:
====》从图中可以看到,测试发送后,基于 dpdk 实现的测试 demo 运行 ok
====》demo 可以正常接收到我们的数据,并正常分析出我们的报文中的原 ip,目的 ip,以及发送内容
遗留问题:
====》 这里的端口打印可能有问题,后期通过自己实现解决
====》这里除了接收我们的消息外,还会接收到相关其他的 udp 数据,为什么?
3:测试中流程分析:
我的测试场景是:使用物理机+虚拟机(linux 环境进行测试)
在物理机上用串口模拟工具下发,目标 ip 填写的是上文保存的 dpdk 绑定网卡前的 ip,端口随机。
使用串口工具进行测试时,会发现必然无法发送成功的场景,这是因为这里的发送 ip 没有找到对应的 arp 表。
分析:
===》要想在物理机发送给虚拟机的链路 ok,需要 arp 表的支持。
===》ip 其实是可变的,mac 地址(唯一)是寻址的关键,需要配置 arp 表。
===》配置 arp 表需要关注,arp -a 查出的 arp 表是多个接口有对应关系,需要配置 arp 表在对应的接口上。
配置 arp 表的相关命令如下:
3:基于 dpdk 实现通过网卡发送数据。
3.1:思路描述
在 dpdk 接管网卡数据,解析 udp 数据的基础上,实现 udp 数据的回复发送。
通过 dpdk 相关接口,初始化时要获取到 dpdk 绑定的本端网卡的 mac 地址
需要根据获取到的 udp 的数据报,按照 ethhdr 协议栈,ip 协议栈,udp 协议栈依次解析,获取原端口,目的端口,原 ip,目的 ip,来源数据的 mac 地址等必要数据
根据相关协议栈规则,构造附后 udp 报文的结构的数据 eth 头,ip 头,udp 头+body 数据的结构进行发送。
3.2:测试
这里直接用老师的 demo,02_send.c,编译和运行同上。
参考上文,同样需要手动配置绑定 arp,使通路可以识别。
观察:串口通信工具能正常接收到 dpdk 回复的原数据。
![](https://static001.geekbang.org/infoq/d7/d72257febbf30f3fe4efcb676ebe0537.png)
编辑切换为居中
添加图片注释,不超过 140 字(可选)
4:实现 arp 的探测回复功能。
每一次测试时,都需要手动配置 arp 才能使链路通,需要 arp 功能支持。
arp 业务处理有三个点:
===》1:收到 arp 探测报文,对探测报文的回复(arp response)
===》2:广播发送 arp 探测报文(arp request)
===》3:arp 表的保存
arp 主要实现和获取了网络 ip 和 mac 地址的对应映射,是局域网网络互通的关键。
4.1 arp 描述及 demo 梳理
dpdk 可以接管网卡接收到的所有数据。
对数据进行解析,过滤 arp 报文,根据协议类型(0x0806)。
对所有的 arp 报文进行解析(根据本机 ip),因为会收到局域网所有节点的 arp 探测报文。
已经过滤出是本机 ip 对应探测的 arp 报文,根据 arp 协议(eth 头+arp 头),构造 arp 报文进行发送
4.2 测试 demo 的操作及运行
获取老师提供的 arp.c 文件,修改文件中设定的本机 ip。
删除测试物理机上已经配置的 arp 映射关系(netsh i i delete neighbors 16)。
编译并进行运行测试。
===》在没有对物理机 arp 表做 dpdk 绑定的网卡映射信息前提下,使用串口工具进行 udp 发送测试
===》启动后发现,可以收到并过滤出局域网多个环境发来的 arp 探测请求
===》使用串口工具进行 udp 发送测试,观察到现象
理解:在发送 udp/tcp 等数据前,会查看对应的 arp 缓存表,如果没有找到映射信息,会先发 arp 探测报文。
现象:可以尝试观察日志/抓包,针对物理机给 dpdk 发送 udp 数据的场景,分析这里 arp 探测报文的发送时机。(物理机可以抓包查看,dpdk 测试机可以通过日志查看,应该是在接收 udp 报文前有一个物理机 ip 的 arp 探测报文)
5:icmp 协议报文的实现
5.1:概述
icmp 协议是 ip 层的附属协议,
ICMP 相当于网络世界的侦察兵。常用的有两种类型,主动探查的查询报文和异常报告的差错报文。
ping 命令使用查询报文,Traceroute 命令使用差错报文。
这里实现基础的 ping 命令的功能,
5.2:测试
1:获取已有的测试 demo,同上,修改源码中设定本机的 ip 值,获取网卡 mac 地址与该 ip 绑定,提供 arp 支持(这里的 ip 设置要注意,注意和测试机同一网段)。
2:对网卡接收到的报文,根据 ip 头部协议类型解析提取 icmp 相关的报文,根据 icmp 协议头部类型,提取为 ping 命令对应报文,解析后获取必要信息构造 icmp 报文进行回复。
3:运行该 demo 的情况下,在测试机器上运行 ping 网卡配置的 ip,观察返回报文以及我们的运行日志。
5.3:测试结果
可以看到,在没有启动测试代码前,无法 ping 通,启动后,已经实现 ping 命令功能,日志上可以看到一些日志:
![](https://static001.geekbang.org/infoq/43/430ac400acd9b2af5705821a4857a641.png)
6:参考资料:
DPDK 的学习资料及学习路线总结图点击:DPDK学习资料 获取及学习路线总结图
推荐 DPDK 学习视频链接:Dpdk/网络协议栈/vpp/OvS/DDos/NFV/虚拟化/高性能专家
![](https://static001.geekbang.org/infoq/14/1409395626c31eb9bf902700676b5fe4.png)
![](https://static001.geekbang.org/infoq/a0/a041d2ab718f1960d4d33d09f3eada9c.png)
评论