dpdk二层转发环境搭建-二

前言

我之前尝试通过namespace,搭建dpdk的测试环境,但是对于tcp有点问题,而且过程也比较麻烦,见: dpdk网络转发环境的搭建-CSDN博客

下面,我通过多个虚拟机的方式,搭建dpdk的测试环境,感觉还行。

测试环境对于学习过程中的快速验证很重要。


虚拟机的网络拓扑结构

网络拓扑结构

在这里插入图片描述

每个虚拟机都有个桥接网卡,供外部ssh连接。

dpdk实验的时候,需要将两张网卡直接连接起来。这里使用 virtualbox - Internal Networking 来实现。

Internal networks are created automatically as needed. There is no central configuration. Every internal network is identified simply by its name. Once there is more than one active virtual network card with the same internal network ID, the Oracle VM VirtualBox support driver will automatically wire the cards and act as a network switch. The Oracle VM VirtualBox support driver implements a complete Ethernet switch and supports both broadcast/multicast frames and promiscuous mode.

上面英文的大概意思是:internal netwok 是通过名称来区别。具有相同名称的网卡可以通信。这个通信是虚拟机之间的,不经过主机。VirtualBox 驱动程序将自动连接这些卡并充当网络交换机,支持广播/多播帧和混杂模式。

所以,上面的拓扑结构相当于,名称为intnet0的两张网卡插在一个交换机上。名称为intnet1的两张网卡插在另一个交换机上。而一个交换机上只接了两个网卡,相当于这两张网卡通过网桥连接,或者相当于通过网线直接连接。

virtualbox中配置内部网络的方式,如下图。

在这里插入图片描述

注意: 运行dpdk程序的这个虚拟机的内部网络网卡,必须开启混杂模式。否则,可以抓包看下,server那个虚拟机响应client的ARP协议的数据包,不会被dpdk接收到,导致连接失败。

网络配置

# client的网络配置

## 设置intnet0网卡的ip
ip address add 10.0.1.2/24 dev enp0s8

## 设置 10.0.2.0/24的数据包,都从intnet0的网卡出去
ip route add 10.0.2.0/24  dev enp0s8

# server的网络设置
ip address add 10.0.2.2/24 dev enp0s8
ip route add 10.0.1.0/24  dev enp0s8

DPDK的准备工作

DPDK的编译

关于编译参数,自行参考官方手册和源码。

git clone git@github.com:DPDK/dpdk.git

git checkout v23.11

meson setup -Dcpu_instruction_set=corei7 -Dbuildtype=debug -Dexamples=all -Dprefix=YOUR_DPDK_INSTALL_PATH build
cd build
ninja 
ninja install

网卡绑定

# 如果包管理里面有,直接安装。如果没有,则源码编译安装。

## ubuntu
sudo apt install dpdk-igb-uio-dkms

# 编译igb_uio驱动; 在wsl中会编译失败,需要在linux环境中编译
git clone git://dpdk.org/dpdk-kmods
cd dpdk-kmods/linux 
make

# 驱动安装
modprobe igb_uio

# 停止网卡
ip link set enp0s8 down
ip link set enp0s9 down

# 绑定网卡
./dpdk-devbind.py --bind=igb_uio enp0s8
./dpdk-devbind.py --bind=igb_uio enp0s9

测试

如果没有dpdk进行数据转发,10.0.1.2的网卡是无法将数据包发送给10.0.2.2的网卡。因为两者不在一个内部网络中。

下面,我们先启动转发程序。

./dpdk-skeleton  
EAL: Detected CPU lcores: 8
EAL: Detected NUMA nodes: 1
EAL: Detected static linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: Probe PCI driver: net_e1000_em (8086:100e) device: 0000:00:08.0 (socket -1)
EAL: Probe PCI driver: net_e1000_em (8086:100e) device: 0000:00:09.0 (socket -1)
TELEMETRY: No legacy callbacks, legacy socket not created
Port 0 MAC: 08 00 27 7c bf 6e
Port 1 MAC: 08 00 27 af 8d 7d

WARNING: Too many lcores enabled. Only 1 used.

Core 0 forwarding packets. [Ctrl+C to quit]

然后使用10.0.1.2网卡,给10.0.2.2发送ICMP数据包,连接正常。

ping 10.0.2.2
PING 10.0.2.2 (10.0.2.2) 56(84) bytes of data.
64 bytes from 10.0.2.2: icmp_seq=1 ttl=64 time=1.01 ms
64 bytes from 10.0.2.2: icmp_seq=2 ttl=64 time=1.26 ms
^C

我们再尝试下tcp协议。

# 在server上启动监听程序
nc -l -k -s 10.0.2.2 -p 80

# client与server建立连接
nc -s 10.0.1.2  10.0.2.2 80

# 两者通信正常

相关推荐

  1. window Flutter for Android的环境

    2024-03-18 21:32:04       36 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-18 21:32:04       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-18 21:32:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-18 21:32:04       20 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-18 21:32:04       20 阅读

热门阅读

  1. server.servlet.path和#server.servlet.context-path的区别

    2024-03-18 21:32:04       24 阅读
  2. 【C#语言入门】19. 什么是类

    2024-03-18 21:32:04       21 阅读
  3. 使用TOPDN做L53免费域名DNS解析方法

    2024-03-18 21:32:04       23 阅读
  4. Rust矢量数据库领域的优势

    2024-03-18 21:32:04       21 阅读
  5. 【Python学习笔记】Python logging模块的学习

    2024-03-18 21:32:04       25 阅读
  6. 算法笔记p142快速排序

    2024-03-18 21:32:04       22 阅读
  7. docker服务起不来原因及解决

    2024-03-18 21:32:04       21 阅读
  8. JDBC的概念

    2024-03-18 21:32:04       23 阅读
  9. pyttsx3应用场景案例

    2024-03-18 21:32:04       18 阅读