TRex是思科研发的一款成熟的基于DPDK的网络测试工具。TRex是一款开源的发包工具,它跑在标准的intel处理芯片上,同时支持stateful和stateless模式,stateful可以描述L4~L7层的应用场景,而stateless主要用来进行定制包的发包。思科官方使用手册:TRex official manual。Github上思科TRex Traffic Generator代码仓库。目前主要利用TRex的DPDK高线速发包能力 Current Stateful TRex Feature sets (STF)

  • High scale of realistic traffic (number of clients, number of server, bandwidth)

  • Latency/Jitter measurements

  • Flow ordering checks

  • NAT, PAT dynamic translation learning

  • Learn TCP SYN sequence randomization - vASA/Firepower use case

  • Cluster mode for Controller tests

  • IPV6 inline replacement

  • Some cross flow support (e.g RTSP/SIP)

1. Trex安装和DPDK安装

安装依赖项。

sudo apt-get update
sudo apt-get install -y gcc g++ python git zlib1g-dev pciutils vim kmod strace wget

然后,下载最新的trex release。

cd $P4_HOME
mkdir trex
cd trex
wget --no-cache http://trex-tgn.cisco.com/trex/release/latest
tar -zxvf latest
cd v2.75  # 本次下载的版本是v2.75

在ubuntu下面执行dpdk安装命令。

sudo apt-get update
sudo apt-get install dpdk

配置dpdk网口。

cd $P4_HOME/trex/v2.75
sudo ./dpdk_setup_ports.py -s

返回结果显示,目前主机上Intel X710网卡有两个端口eth1和eth3。网卡还在使用内核驱动,还没绑定dpdk功能。等trex发包程序运行起来,X710网卡的两个网口会加载DPDK-compatible driver,比如igb_uio。

Network devices using DPDK-compatible driver
============================================
<none>
​
Network devices using kernel driver
===================================
0000:00:1f.6 'Ethernet Connection (3) I219-LM' if=eth2 drv=e1000e unused=igb_uio,vfio-pci,uio_pci_generic
0000:02:00.0 'I210 Gigabit Network Connection' if=eth0 drv=igb unused=igb_uio,vfio-pci,uio_pci_generic *Active*
0000:d5:00.0 'Ethernet Controller X710 for 10GbE SFP+' if=eth1 drv=i40e unused=igb_uio,vfio-pci,uio_pci_generic
0000:d5:00.1 'Ethernet Controller X710 for 10GbE SFP+' if=eth3 drv=i40e unused=igb_uio,vfio-pci,uio_pci_generic 

2. Trex的基本使用(以重放DNS请求和回复报文为例)

实验背景

本次实验对系统的要求是:4核CPU以及4GB的内存 正在上传…重新上传取消 Trex主机的原理就是两个网口模仿发送者和接受者,从而进行通讯,产生报文。 正在上传…重新上传取消 本次实验中,trex主机的两个端口和交换机直连,两端口的ip地址分别为10.0.0.1和10.0.0.2。实验目的为在trex主机中对上诉DNS报文流量进行重放,当流量经过测试网络时,在交换机上捕获报文内容,流量最终回到trex主机。

Trex配置

编写 trex 配置文件, 配置文件的模板可以从 trex解压目录的 cfg 文件夹中找到。以cfg文件夹中的simple_cfg.yaml配置文件为例,将配置文件的内容修改为如下(主要是对interfaces的相关信息进行了修改)。

$ vim $P4_HOME/trex/v2.75/cfg/simple_cfg.yaml
- port_limit    : 2version       : 2
#List of interfaces. Change to suit your setup. Use ./dpdk_setup_ports.py -s to see available optionsinterfaces    : ["trex-eth0","trex-eth1"] port_info     :  # Port IPs. Change to suit your needs. In case of loopback, you can leave as is.- ip         : 10.0.0.1default_gw : 10.0.0.2- ip         : 10.0.0.2default_gw : 10.0.0.1

注:YAML 是 "YAML Ain't a Markup Language"(YAML 不是一种标记语言)的递归缩写。在开发这种语言时,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语言)。YAML 的语法和其他高级语言类似,并且可以简单表达清单、散列表,标量等数据形态。可以用vi来编辑和语法亮显yaml格式的配置文件。

在上面的trex配置文件中

  • interfaces 参数指定本次作为发送方和接收方的端口。

  • 虚拟环境中, 在trex终端中使用

    ifconfig

    命令查看虚拟网卡的标识符和ip地址。在真实环境中可以在trex 解压目录下执行

    ./dpdk_setup_ports.py -s

    ,查看相应的设备代号。

    cd $P4_HOME/trex/v2.75
    sudo ./dpdk_setup_ports.py -s
  • port_info 参数是对两个网口的ip进行配置。其中

    • ip为这个网口本身的ip,

    • default_gw 为是这个网口直连设备的ip。在本次实验中,由于交换机是二层设备,所以trex-eth0的默认网关为trex-eth1的ip地址,trex-eth1的默认网关为trex-eth0的ip地址。

修改完成后可以执行以下命令直接拷贝配置文件的模板到/etc文件夹下。

sudo cp $P4_HOME/trex/v2.75/cfg/simple_cfg.yaml /etc/trex_cfg.yaml

Pcap配置

Trex 可以将实际网络中抓包生成的pcap文件做模板,快速生成各种协议的报文流。pcap可以说是一种通用的数据流格式,很多开源的项目都需要用到这种格式的文件。随着libpcap库成为UNIX系统上网络报文捕捉的标准库,pcap也成为了开源社区的标准记录网络报文的文件格式。详细内容参考Wireshark的libpcap文件格式的介绍文档。

Trex 有很多 pcap网络抓包记录的例子, 放在解压目录$P4_HOME/trex/v2.75下的 cap2 文件夹。在重放pcap网络流量之前,首先需要准备 pcap文件以及对应的配置文件。这里以cap2/dns.yaml 为例。

duration : 10.0generator :  distribution : "seq"clients_start : "16.0.0.1"clients_end   : "16.0.1.255"servers_start : "48.0.0.1"servers_end   : "48.0.0.255"clients_per_gb : 201min_clients    : 101dual_port_mask : "1.0.0.0" tcp_aging      : 1udp_aging      : 1cap_info : - name: cap2/dns.pcapcps : 1.0ipg : 10000rtt : 10000w   : 1

参数:

  1. clients_start client_end 等参数都是指生成模拟流量的服务端和客户端的地址范围

  2. name 为 pcap文件路径, 这个pcap文件是所有流成生的模板

  3. cps 为每秒连接次数

  4. ipg 报文间隙(microseconds)

  5. w : Should be the same as ipg

网络拓扑文件创建及运行Trex

1. 使用Mininet绘制网络拓扑图

  • 在P4环境下的mininet文件夹中,找到 mininet/examples 目录。 执行 python miniedit.py 即可启动图形化miniedit 界面,绘制拓扑图,该实验的拓扑为trex主机和交换机s1直连。

    cd $P4_HOME/mininet/mininet/examples
    python miniedit.py
  • 在图形化界面的左端选择一个主机(host)和一个交换机(LegacySwitch)。鼠标右击主机(host),选择properties,修改Hostname为trex,在trex主机和交换机s1之间添加一条连接,在图形化界面的File选项中选择Export Level 2 Script导出 python 拓扑脚本文件。python脚本文件命名为edtopo,导出的目录为Trex的解压目录v2.75文件夹中,导出完成后,退出图形化界面。

  • 由于trex主机有两个端口,所以trex主机和交换机s1应该有两个连接。由于可视化过程中只能在trex主机和交换机s1之间添加一条连接,所以需要手动更改生成的python文件以添加连接。使用cd命令切换到trex的解压目录v2.75文件夹下,并使用vim edtopo.py修改生成的python文件,修改后的python文件如下所示(需要修改的部分已经在下面的程序中注明):

#!/usr/bin/python
​
from mininet.net import Mininet
from mininet.node import Controller, RemoteController, OVSController
from mininet.node import CPULimitedHost, Host, Node
from mininet.node import OVSKernelSwitch, UserSwitch
from mininet.node import IVSSwitch
from mininet.cli import CLI
from mininet.log import setLogLevel, info
from mininet.link import TCLink, Intf
from subprocess import call
​
def myNetwork():
​net = Mininet( topo=None,build=False,ipBase='10.0.0.0/8')
​info( '*** Adding controller\n' )info( '*** Add switches\n')s1 = net.addSwitch('s1', cls=OVSKernelSwitch, failMode='standalone')
​info( '*** Add hosts\n')trex = net.addHost('trex', cls=Host, ip='10.0.0.1', defaultRoute=None)
​info( '*** Add links\n')# 主要修改这里, 这里增加了一个链路,并且指定ip地址net.addLink(trex, s1, params1={'ip':'10.0.0.1/8'})net.addLink(trex, s1, params1={'ip':'10.0.0.2/8'})
​info( '*** Starting network\n')net.build()info( '*** Starting controllers\n')for controller in net.controllers:controller.start()
​info( '*** Starting switches\n')net.get('s1').start([])
​info( '*** Post configure switches and hosts\n')
​CLI(net)net.stop()
​
if __name__ == '__main__':setLogLevel( 'info' )myNetwork()

从上面的代码注意到修改的地方:

  1. 增加了一条 trex主机到交换机 s1 的链路

  2. 为trex主机的端口分配了ip地址, 这个需要根据测试的网络需要进行配置。

2. 在mininet中执行拓扑文件,其中edttopo.py为拓扑文件

cd $P4_HOME/mininet/mininet/examples
sudo python edtopo.py 

3. 在mininet 中使用下面命令打开 交换机s1 的终端

xterm s1

4. 在交换机s1终端中使用下面命令在eth1端口实现抓包

tcpdump -i s1-eth1

5. 打开 trex 主机的终端

xterm trex

6. 在 trex 的终端中使用cd命令,切换到 trex的解压目录,然后执行下面的命令运行trex。

cd $P4_HOME/trex/v2.75
./t-rex-64 -f cap2/dns.yaml -d 30

其中,-f 参数后面就是 pcap配置文件的路径。30 代表测试时间(秒)。 最后,可以在交换机s1的终端看到对应的DNS请求和应答报文。

3. Trex pktgen结合P4 Bmv2交换机的基本网络测量实验

实验背景

在上节中,已经实现Trex报文发生器的基本功能。在这一节中,分别使用Trex报文发生器和主机的模拟发包达到流量生成的目的,流量在生成后经过交换机s1,在交换机中统计相关数据。该实验的P4代码在交换机s1中部署了六个registers进行基于count-min sketch的包计数,其中前三个registers记录包个数packets_number,后三个registesr记录字节数bytes_number。

安装p4-utils

需要使用p4-utils提供控制面的一些功能。p4-utils是Mininet的扩展,以支持P4设备。原虚拟机中是没有的,在P4的目录下,使用如下安装命令:

git clone https://github.com/nsg-ethz/p4-utils.git
cd p4-utils
sudo ./install.sh
cd .. #回到P4目录

配置Trex

编写 trex 配置文件, 进入到trex解压目录下(比如$P4_HOME/trex/v2.75),配置文件的模板可以从 cfg 文件夹中找到,以cfg文件夹中的simple_cfg.yaml配置文件为例,将配置文件的内容修改为如下(主要是对interfaces的相关信息进行了修改):

- port_limit      : 2version         : 2
#List of interfaces. Change to suit your setup. Use ./dpdk_setup_ports.py -s to see available optionsinterfaces    : ["h1-eth0","h1-eth1"] port_info       :  # Port IPs. Change to suit your needs. In case of loopback, you can leave as is.- ip         : 10.0.1.1default_gw : 10.0.1.2- ip         : 10.0.1.2default_gw : 10.0.1.1

其中 interfaces 参数指定本次作为发送方和接收方的端口,本例中就是唯一的主机h1的两个以太网端口。port_info参数是对两个网口的ip进行配置,其中ip为这个网口本身的ip,default_gw是为这个网口直连设备的ip。 使用以下命令将修改后的配置文件复制到etc下

sudo cp cfg/simple_cfg.yaml /etc/trex_cfg.yaml

配置Pcap

Trex可以通过读取抓包生成的pcap文件快速生成各种协议的报文流,在此之前要准备pcap文件及对应配置文件。

  • pcap文件为在Trex解压目录的avl文件夹中,找到pcap文件夹下的delay_10_smtp_0.pcap文件;

  • 配置文件为在Trex解压目录的cap2文件夹中,找到对应的pcap配置文件short_tcp.yaml。 配置文件的内容如下:

- duration : 40generator :  distribution : "seq"clients_start : "16.0.0.1"clients_end   : "16.0.0.255"servers_start : "48.0.0.1"servers_end   : "48.0.255.255"clients_per_gb : 201min_clients    : 101dual_port_mask : "1.0.0.0" tcp_aging      : 0udp_aging      : 0cap_info : - name: avl/delay_10_smtp_0.pcapcps : 1.0ipg : 10000rtt : 10000w   : 1

cap_info下的name即为pcap文件所在位置

发包和测量实验

使用Trex发包的实验除了h1窗口中的发包指令与前面不同,其余操作步骤都与前一个例子相同。h1窗口中的发包指令不再使用send.py发送批量构造的虚拟包,而是利用Trex读取pcap文件,对其中的报文流进行重放发送。依然是从主机h1的eth0端口发出,经过交换机s1处理和转发后由主机h1的eth1端口接收。

  1. 打开两个控制台,使用cd命令均进入到P4目录下的basic_p4_measurement中

  2. 在控制台一中输入sudo p4run

    • 使用命令xterm h1打开主机h1窗口

    • 在主机h1中使用

      cd

      命令切换到Trex的解压目录v2.75文件夹下,输入命令(!!!但不执行)

      ./t-rex-64 -f cap2/short_tcp.yaml -d 30

      其中,-f参数后面是pcap配置文件路径(这里用short_tcp.yaml文件),最后的30代表测试时间(秒)。

  3. 在控制台二中运行python cm-sketch-controller.py --option set_hashes,这一步的目的是给交换机中的hash函数配置参数以及写入转发表规则。

  4. 继续在控制台二中运行sudo python cm-sketch-controller.py --option start_working,可以在终端二中看到,屏幕每5秒会打印一次六个register的全部位置的值,每30秒会将当前的值保存到一个txt文件中,同时将所有register清零,以便重新开始计数。(由于没发包,当前显示全零)

  5. 在h1的窗口中按下回车,运行发包指令,在输出中可以看到发出数据包的统计信息,同时,在控制台二可以看到各个计数器的值。

  6. 在控制台一中使用exit退出mininet

文献引用

  • TRex 学习 (1)---- install

  • TRex学习(一)环境搭建和数据包回放说明

原文链接:https://www.cnblogs.com/cscshi/p/16583997.html

报文发生器 TRex 的配置和使用相关推荐

  1. 【Trex】Trex初始化配置和server/client的启动

    Trex初始化配置和server/client的启动 第二章 Trex初始化配置和server/client的启动 文章目录 Trex初始化配置和server/client的启动 一.Trex初始化配 ...

  2. solicit报文_DHCPv6原理与配置

    1,IPv6动态主机配置协议DHCPv6(Dynamic Host Configuration Protocol for IPv6)采用了客户端/服务器通信模式,是针对IPv6编址方案设计的.为主机分 ...

  3. 基于报文地址的策略路由配置示例

    [实验拓扑] 本文实验采用的交换机是H3C模拟器,下载地址如下: http://forum.h3c.com/forum.php? mod=viewthread&tid=109740&h ...

  4. 玩转华为数据中心交换机系列 | 配置VLAN内协议报文透传示例

    素材来源:华为数据中心交换机配置指南 一边学习一边整理试验笔记,并与大家分享,侵权即删,谢谢支持! 附上汇总贴:玩转华为数据中心交换机系列 | 汇总_COCOgsta的博客-CSDN博客 组网需求 如 ...

  5. IPv6/ICMPv6-原理介绍+报文分析+配置示例

    个人认为,理解报文就理解了协议.通过报文中的字段可以理解协议在交互过程中相关传递的信息,更加便于理解协议. 因此本文将以IPv6的常用协议上进行介绍,以详细介绍IPv6的相关内容. 关于ICMPv6相 ...

  6. 以太网 DHCP(DHCP的8种报文、DHCP配置、DHCP中继)

    2.14.1 以太网 DHCP(DHCP的8种报文.DHCP配置.DHCP中继) DHCP-2 2.14.1 以太网 DHCP(DHCP的8种报文.DHCP配置.DHCP中继) 一.DHCP的8种报文 ...

  7. TCP/IPICMP报文的分类

    Internet控制报文协议,即为ICMP(Internet Control Message Protocal),用于主机,路由器之间传递信息,其目的是让我们能够检测网路的连线状况﹐也能确保连线的准确 ...

  8. 华为MSTP配置教程(二)

    12.配置MSTP超时时间 在运行生成树算法的网络中,如果设备在配置的超时时间内没有收到上游设备发送的BPDU,就认为上游设备已经出现故障,本设备会重新进行生成树计算. 由于上游设备繁忙,有时设备在较 ...

  9. DPDK 应用层对网卡进行配置(二十四)

    dpdk用户态驱动初始化完成后,应用层就可以来对网卡进行设置操作.对于每一个网卡,应用层都需要调用相应接口进行配置.可以对网卡进行哪些设置操作呢? 例如应用层将对网卡进行配置下发,将配置信息下发给网卡 ...

最新文章

  1. 图灵奖得主Yann LeCun万字访谈:DNN“史前文明”、炼金术及新的寒冬
  2. 排列组合 概率 贝叶斯理解
  3. PHP usort 函数底层排序
  4. PM_我们是怎么做Code Review的
  5. 张宇1000题高等数学 第十三章 多元函数微分学
  6. shp文件中polyline是什么_SHP文件坐标转换工具1.0版
  7. 9种常见的前端跨域解决方案(详解)
  8. 解决eclipse在编辑时字体变成繁体字的问题
  9. 两步教你在安卓中快速使用矢量图
  10. 工作效率的提升——如何高效沟通,有效降低沟通成本
  11. 小Q系列故事——世界上最遥远的距离
  12. Python 内建函数大全
  13. ZOJ - Triathlon(线性规划+半平面交)
  14. 混合引用制作 九九乘法表
  15. 2020年茶艺师(初级)复审考试及茶艺师(初级)模拟试题
  16. 华海清科在科创板上市:2020年扭亏为盈,清华为实际控制人
  17. Linux下套接字详解(六)----基于pthread的多线程的TCP套接字(阻塞/同步/并发)
  18. artTemplate模板引擎
  19. 关于SEO与搜索引擎排名现状分析与SEO去向
  20. linux造字程序,巧借“系统工具”,完成仓颉造字

热门文章

  1. 用小鸟云云服务器,想设置自动续费,在后台怎么开?
  2. 记一次阿里云服务器因Redis被【挖矿病毒crypto和pnscan】攻击的case,附带解决方案
  3. 罗辑思维CEO脱不花:关于工作和成长,这是我的121条具体建议
  4. 七周成为数据分析师 第二周:业务篇-指标
  5. GraphicsMagick之实践出真知
  6. 1. 基于MSYS2的Mingw-w64 GCC搭建Windows下C++开发环境
  7. UncaughtException 的使用
  8. 怎么用PHP判定奇偶性,函数如何判断奇偶性,一起来学学吧!
  9. yolov5+tensorrt8 C++部署加速
  10. Ubuntu 16.04 - GeForce RTX 2080 Ti 安装 GPU 显卡驱动 (Display Driver)