大规模 - 每个核心支持大约 10-22 百万包每秒 (mpps),可随核心数量扩展
支持 1、10、25、40 和 100 Gb/秒接口
每个接口支持多个流量配置文件
Profile 可支持多流,可扩展至 10K 并行流
每个流支持:
数据包模板 - 使用Scapy 构建任何数据包(包括格式错误)的能力(例如:MPLS/IPv4/Ipv6/GRE/VXLAN/NSH)
现场引擎程序
能够更改数据包内的任何字段(例如:src_ip = 10.0.0.1-10.0.0.255)
能够更改数据包大小(例如:随机数据包大小 64-9K)
模式 - 连续/突发/多突发支持
速率可以指定为:
每秒数据包数(例如:14MPPS)
L1 带宽(例如:500Mb/秒)
L2 带宽(例如:500Mb/秒)
接口链接百分比(示例:10%)
支持类似 HLTAPI 的配置文件定义
动作 - 流可以触发流
交互式支持 - 快速控制台、GUI
每个接口的统计信息
在硬件中完成的每个流的统计信息
每个流的延迟和抖动
极快的自动化支持
Python 2.7/3.0 客户端 API
Python HLTAPI 客户端 API
多用户支持 - 多个用户可以同时与同一个 TRex 实例交互
路由协议支持——使用 BIRD 的 RIP/BGP/OSPF
流量配置文件示例
以下示例显示为连续、突发和多突发流量配置的三个流。

图 1. 多流示例
与 IXIA 相比,TRex 的功能有限,但有一些优势。下表总结了这些差异:
表 1. TRex 与 IXExplorer
| 线速 | 支持 | 10-24MPPS/核,取决于用例 |
|
| 多流 | 255 | 软件限制在 ~20K |
|
| 数据包构建灵活性 | 有限的 | Scapy - 无限 | 示例:支持 GRE/VXLAN/NSH。可以扩展到未来的协议。 |
| 包场引擎 | 有限的 | 无限 |
|
| 发送模式 | 连续/连发/多连发 | 连续/连发/多连发 |
|
| ARP/IPv6 ND 仿真 | 支持 | 支持 |
|
| DHCP 客户端仿真 | 支持 | 支持 |
|
| 可扩展的仿真框架 | 不 | 支持 |
|
| 自动化 | TCL/Python 包装器到 TCL | 本机 Python/Scapy |
|
| 自动化速度秒 | 30 秒 | 1 毫秒 | 负载/启动/停止/获取计数器的测试 |
| HLTAPI | 全力支持。2000 页文档 | 有限的。20 页文档 |
|
| 每个流统计 | 具有 4 个全局掩码的 255 个流 | 82599/I350/X550 的 XL710/X710 硬件和软件 impl 的 128 条规则 | 某些数据包类型限制适用于 XL710/X710。软件模式可以扩展到32K规则。 |
| 延迟抖动 | 支持。纳秒级分辨率(基于硬件) | 支持。微秒级分辨率(基于软件) |
|
| 多用户支持 | 支持 | 支持 |
|
| 图形用户界面 | 很好 | WIP、数据包生成器、现场引擎、全局端口统计、延迟、每个流统计。与 IXIA GUI 不同 - 有关详细信息,请参阅:trex-stateless-gui |
|
| 思科 pyATS 支持 | 支持 | 支持- Python 2.7/Python 3.4 |
|
| 路由仿真 | 支持 | 支持 |
TRex 控制平面核心中的 JSON-RPC2 线程提供对交互模式的支持。

图 2. RPC 服务器组件
Layers:
控制传输协议:ZMQ 工作在 REQ/RES 模式。
控制传输协议之上的 RPC 协议:JSON-RPC2。
异步传输:ZMQ 工作在 SUB/PUB 模式(用于异步事件,如接口更改模式、计数器等)。
接口:
自动化 API:Python 是第一个实现 Python 自动化 API 的客户端。
用户界面:控制台使用 Python API 为 TRex 实现用户界面。
GUI :GUI 工作在 JSON-RPC2 层之上。
Rex 接口的控制
许多用户可以从不同的界面一起控制单个 TRex 服务器。
用户独家获得单独的 TRex 接口。示例:两个用户控制一个 4 端口的 TRex 服务器。用户A获取接口0和1;用户 B 获取接口 3 和 4。
只有一个用户界面(控制台或 GUI)可以对特定界面进行读/写控制。这可以在客户端核心中缓存 TRex 服务器接口信息。示例:用户 A 有两个获取的接口,一次只能有一个读/写控制会话。
用户可以在单个接口上设置多个只读客户端——例如,用于监控接口上的流量统计。
处于读写模式的客户端可以实时获取统计信息(使用 ASYNC ZMQ)。这可以同时通过多个用户界面(控制台和 GUI)查看统计信息。
同步
客户端与 TRex 服务器同步以获取连接时间的状态,并在状态更改后将服务器信息缓存在本地。
如果客户端崩溃或退出,它会在重新连接后再次同步。

图 3. 多个用户,每个界面
有关 TRex RPC 服务器的详细信息,请参阅RPC 规范。
RPC 架构亮点
RPC 架构提供以下优点:
与 TRex 服务器的快速交互。加载、启动和停止接口的配置文件非常快 - 大约 2000 个周期/秒。
利用 Python/ Scapy构建数据包/字段引擎。
HLTAPI 编译器复杂性在 Python 中处理。
TRex:每个 TRex 实例都支持许多接口。
接口:每个接口支持一个或多个流量配置文件。
流量配置文件:每个流量配置文件支持一个或多个流。
流:每个流包括:
数据包:数据包模板最大 9 KB
字段引擎:确定要更改的字段以及是否更改数据包大小
Mode:指定如何发送数据包:Continuous/Burst/Multi-burst
Rx Stats:为每个流收集的统计信息
速率:速率(每秒数据包或带宽)
操作:指定当前流完成时要遵循的流(对连续或突发模式有效)
TRex 无状态支持支持基本的 L2/L3 测试,主要与交换机或路由器相关。在无状态模式下,可以使用一个数据包模板定义流,定义程序以更改数据包中的任何字段,并以下列模式之一运行流:
连续的
爆裂
多突发
无状态模式不支持学习 NAT 转换,因为没有流/客户端/服务器的上下文。
在有状态模式下,基本构建块是流/应用程序(由许多数据包组成)。
无状态模式更加灵活,使您能够定义任何类型的数据包,并构建一个简单的程序。
| 特征 | 有状态的 | 无状态 |
|---|---|---|
| 每个流状态 | 支持 | 不支持 |
| NAT | 支持 | 不支持 |
| 隧道 | 支持一些 | 支持 |
| L7 应用仿真 | 支持 | 不 |
| 任何类型的数据包 | 不支持 | 支持 |
| 延迟抖动 | 全局/每个流 | 每个流 |
| Location | Description |
|---|---|
| / | t-rex-64/dpdk_set_ports/stl-sim |
| /stl | 无状态本机 (py) 配置文件 |
| /stl/hlt | 无状态 HLT 配置文件 |
| /ko | DPDK 的内核模块 |
| /external_libs | 服务器/客户端使用的 Python 外部库 |
| /exp | 用于单元测试的黄金 PCAP 文件 |
| /cfg | 配置文件示例 |
| /cap2 | 有状态的配置文件 |
| /avl | 有状态配置文件 - SFR 配置文件 |
| /automation | 有状态和无状态的 Python 客户端/服务器代码 |
| /automation/regression | 无状态和有状态的回归 |
| /automation/config | 回归设置配置文件 |
| /automation/trex_control_plane/interactive/trex | 无状态库和控制台 |
| /automation/trex_control_plane/interactive/trex/stl | 无状态库 |
| /automation/trex_control_plane/interactive/trex/examples/stl | 无状态示例 |
使用无状态模式模仿有状态模式
无状态模式可以模仿有状态模式的部分功能,但不是全部功能。例如,您可以将数据包数量作为流的链接加载一个 PCAP:
a→b→c→d→ back to a
然后您可以为每个流创建一个程序来更改:
src_ip=10.0.0.1-10.0.0.254
这会产生类似于有状态模式的流量,但基础完全不同。
如果您感到困惑,您可能需要无状态。:-)
使用此功能,您可以“重复”流并创建无状态的、类似于IXIA的流。在注入 定义的流数后limit,TRex 重复相同的流。如果所有模板都具有limitCPS 将在一段时间后为零,因为在第一次迭代后没有新流。
IMIX 支持:
例子:
[bash]>sudo ./t-rex-64 -f cap2/imix_64.yaml -d 1000 -m 40000 -c 4 -p
-p 在这里用于从两个接口发送客户端数据包。(通常仅从客户端端口发送。)使用此选项,端口由客户端 IP 选择。一个流的所有数据包都是从同一个接口发送的。这可能会产生路由问题,因为客户端的 IP 将从服务器接口发送。PBR 路由器配置解决了这个问题,但不能在所有情况下都使用。因此请谨慎使用此-p选项。
imix_64.yaml
- cap_info :
- - name: cap2/udp_64B.pcap
- cps : 1000.0
- ipg : 10000
- rtt : 10000
- w : 1
- limit : 1000
说明:
1、在循环中重复流,从该类型生成 1000 个流。在此示例中,udp_64B 仅包含一个数据包。
cap文件“cap2/udp_64B.pcap”只包含一个64B的包。此配置文件创建 1000 个流程,这些流程将按如下方式重复: f1 、 f2 、 f3 ...。f1000 , f1 , f2 ... 其中 PPS == CPS for -m=1。在这种情况下,对于 -m==1,它的 PPS=1000 秒。可以混合使用无状态模板和有状态模板。
Imix YAML cap2/imix_fast_1g.yaml示例
- - duration : 3
- generator :
- 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 : 201
- min_clients : 101
- dual_port_mask : "1.0.0.0"
- tcp_aging : 0
- udp_aging : 0
- mac : [0x0,0x0,0x0,0x1,0x0,0x00]
- cap_info :
- - name: cap2/udp_64B.pcap
- cps : 90615
- ipg : 10000
- rtt : 10000
- w : 1
- limit : 199
- - name: cap2/udp_576B.pcap
- cps : 64725
- ipg : 10000
- rtt : 10000
- w : 1
- limit : 199
- - name: cap2/udp_1500B.pcap
- cps : 12945
- ipg : 10000
- rtt : 10000
- w : 1
- limit : 199
- - name: cap2/udp_64B.pcap
- cps : 90615
- ipg : 10000
- rtt : 10000
- w : 1
- limit : 199
- - name: cap2/udp_576B.pcap
- cps : 64725
- ipg : 10000
- rtt : 10000
- w : 1
- limit : 199
- - name: cap2/udp_1500B.pcap
- cps : 12945
- ipg : 10000
- rtt : 10000
- w : 1
- limit : 199
此处复制模板以更好地利用 DRAM 并获得更好的性能。
- - duration : 3
- generator :
- 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 : 201
- min_clients : 101
- dual_port_mask : "1.0.0.0"
- tcp_aging : 0
- udp_aging : 0
- mac : [0x0,0x0,0x0,0x1,0x0,0x00]
- cap_info :
- - name: cap2/udp_64B.pcap
- cps : 90615
- ipg : 10000
- rtt : 10000
- w : 1
- limit : 16666
- - name: cap2/udp_576B.pcap
- cps : 64725
- ipg : 10000
- rtt : 10000
- w : 1
- limit : 16666
- - name: cap2/udp_1500B.pcap
- cps : 12945
- ipg : 10000
- rtt : 10000
- w : 1
- limit : 16667
- - name: cap2/udp_64B.pcap
- cps : 90615
- ipg : 10000
- rtt : 10000
- w : 1
- limit : 16667
- - name: cap2/udp_576B.pcap
- cps : 64725
- ipg : 10000
- rtt : 10000
- w : 1
- limit : 16667
- - name: cap2/udp_1500B.pcap
- cps : 12945
- ipg : 10000
- rtt : 10000
- w : 1
- limit : 16667
以下简单模拟示例包括 3 个流程,CPS=10。
- $more cap2/imix_example.yaml
- #
- # Simple IMIX test (7x64B, 5x576B, 1x1500B)
- #
- - duration : 3
- generator :
- 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 : 201
- min_clients : 101
- dual_port_mask : "1.0.0.0"
- tcp_aging : 0
- udp_aging : 0
- mac : [0x0,0x0,0x0,0x1,0x0,0x00]
- cap_info :
- - name: cap2/udp_64B.pcap
- cps : 10.0
- ipg : 10000
- rtt : 10000
- w : 1
- limit : 3 1
说明:
1、流数:3
[bash]>./bp-sim-64-debug -f cap2/imix_example.yaml -o my.erf -v 3 > a.txt
| pkt | time sec | template | fid | flow-pkt-id | client_ip | client_port | server_ip | desc |
|---|---|---|---|---|---|---|---|---|
| 1 | 0.010000 | 0 | 1 | 1 | 16.0.0.1 | 1024 | 48.0.0.1 | → |
| 2 | 0.210000 | 0 | 2 | 0 | 16.0.0.2 | 1024 | 48.0.0.2 | → |
| 3 | 0.310000 | 0 | 3 | 0 | 16.0.0.3 | 1024 | 48.0.0.3 | → |
| 4 | 0.310000 | 0 | 1 | 0 | 16.0.0.1 | 1024 | 48.0.0.1 | → |
| 5 | 0.510000 | 0 | 2 | 0 | 16.0.0.2 | 1024 | 48.0.0.2 | → |
| 6 | 0.610000 | 0 | 3 | 0 | 16.0.0.3 | 1024 | 48.0.0.3 | → |
| 7 | 0.610000 | 0 | 1 | 0 | 16.0.0.1 | 1024 | 48.0.0.1 | → |
| 8 | 0.810000 | 0 | 2 | 0 | 16.0.0.2 | 1024 | 48.0.0.2 | → |
| 9 | 0.910000 | 0 | 1 | 0 | 16.0.0.1 | 1024 | 48.0.0.1 | → |
| 10 | 0.910000 | 0 | 3 | 0 | 16.0.0.3 | 1024 | 48.0.0.3 | → |
| 11 | 1.110000 | 0 | 2 | 0 | 16.0.0.2 | 1024 | 48.0.0.2 | → |
| 12 | 1.210000 | 0 | 3 | 0 | 16.0.0.3 | 1024 | 48.0.0.3 | → |
| 13 | 1.210000 | 0 | 1 | 0 | 16.0.0.1 | 1024 | 48.0.0.1 | → |
| 14 | 1.410000 | 0 | 2 | 0 | 16.0.0.2 | 1024 | 48.0.0.2 | → |
| 15 | 1.510000 | 0 | 1 | 0 | 16.0.0.1 | 1024 | 48.0.0.1 | → |
| 16 | 1.510000 | 0 | 3 | 0 | 16.0.0.3 | 1024 | 48.0.0.3 | → |
| 17 | 1.710000 | 0 | 2 | 0 | 16.0.0.2 | 1024 | 48.0.0.2 | → |
| 18 | 1.810000 | 0 | 3 | 0 | 16.0.0.3 | 1024 | 48.0.0.3 | → |
| 19 | 1.810000 | 0 | 1 | 0 | 16.0.0.1 | 1024 | 48.0.0.1 | → |
| 20 | 2.010000 | 0 | 2 | 0 | 16.0.0.2 | 1024 | 48.0.0.2 | → |
| 21 | 2.110000 | 0 | 1 | 0 | 16.0.0.1 | 1024 | 48.0.0.1 | → |
| 22 | 2.110000 | 0 | 3 | 0 | 16.0.0.3 | 1024 | 48.0.0.3 | → |
| 23 | 2.310000 | 0 | 2 | 0 | 16.0.0.2 | 1024 | 48.0.0.2 | → |
| 24 | 2.410000 | 0 | 3 | 0 | 16.0.0.3 | 1024 | 48.0.0.3 | → |
| 25 | 2.410000 | 0 | 1 | 0 | 16.0.0.1 | 1024 | 48.0.0.1 | → |
| 26 | 2.610000 | 0 | 2 | 0 | 16.0.0.2 | 1024 | 48.0.0.2 | → |
| 27 | 2.710000 | 0 | 1 | 0 | 16.0.0.1 | 1024 | 48.0.0.1 | → |
| 28 | 2.710000 | 0 | 3 | 0 | 16.0.0.3 | 1024 | 48.0.0.3 | → |
| 29 | 2.910000 | 0 | 2 | 0 | 16.0.0.2 | 1024 | 48.0.0.2 | → |
| 30 | 3.010000 | 0 | 3 | 0 | 16.0.0.3 | 1024 | 48.0.0.3 | → |
| 31 | 3.010000 | 0 | 1 | 0 | 16.0.0.1 | 1024 | 48.0.0.1 | → |
表. IMIX 示例限制 = 3
平均 CPS:每秒 10 个数据包(3 秒内 30 个数据包)。
配置文件中指定的总共 3 个流。
如配置文件中指定的那样,流以突发形式出现。
