高级功能:
目前,客户端和服务器有一个全局 IP 池。它服务于所有模板。所有模板都会从这个全局池中分配 IP。每个 TRex 客户端/服务器“双端口”(端口对,例如客户端的端口 0,服务器的端口 1)都有自己的生成器偏移量,取自配置文件。偏移量称为dual_port_mask。
例子:
- 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.0.255"
- dual_port_mask : "1.0.0.0" 1
- tcp_aging : 0
- udp_aging : 0
说明:
1、为每个端口对添加的偏移量。“dual_port_mask”的原因是使每个端口的静态路由配置成为可能。有了这个偏移量,不同的端口就有不同的前缀。
例如,对于四个端口,TRex 将生成以下 IP 范围:
- port pair-0 (0,1) --> C (16.0.0.1-16.0.0.128 ) <-> S( 48.0.0.1 - 48.0.0.128)
- port pair-1 (2,3) --> C (17.0.0.129-17.0.0.255 ) <-> S( 49.0.0.129 - 49.0.0.255) + mask ("1.0.0.0")
客户数量:255
服务器数量:255
为每个端口对添加由“dual_port_mask”(1.0.0.0)定义的偏移量,但客户端/服务器的总数将保持不变(255),并且不取决于端口的数量。
TCP/UDP 老化是将套接字返回池所需的时间。当客户端数量非常少并且模板定义了非常长的持续时间时需要它。
如果“dual_port_mask”设置为 0.0.0.0,则两个端口对将使用相同的 ip 范围。例如,有四个端口,我们将得到以下 IP 范围:
- port pair-0 (0,1) --> C (16.0.0.1-16.0.0.128 ) <-> S( 48.0.0.1 - 48.0.0.128)
- port pair-1 (2,3) --> C (16.0.0.129-16.0.0.255 ) <-> S( 48.0.0.129 - 48.0.0.255)
此模式的路由器配置:
PBR 不是必需的。下面的配置就足够了。
- interface TenGigabitEthernet1/0/0 1
- mac-address 0000.0001.0000
- mtu 4000
- ip address 11.11.11.11 255.255.255.0
- !
- `
- interface TenGigabitEthernet1/1/0 2
- mac-address 0000.0001.0000
- mtu 4000
- ip address 22.11.11.11 255.255.255.0
- !
- interface TenGigabitEthernet1/2/0 3
- mac-address 0000.0001.0000
- mtu 4000
- ip address 33.11.11.11 255.255.255.0
- !
- interface TenGigabitEthernet1/3/0 4
- mac-address 0000.0001.0000
- mtu 4000
- ip address 44.11.11.11 255.255.255.0
- load-interval 30
-
-
- ip route 16.0.0.0 255.0.0.0 22.11.11.12
- ip route 48.0.0.0 255.0.0.0 11.11.11.12
- ip route 17.0.0.0 255.0.0.0 44.11.11.12
- ip route 49.0.0.0 255.0.0.0 33.11.11.12
说明:
1、连接到 TRex 端口 0(客户端)
2、连接到 TRex 端口 1(服务器端)
3、连接到 TRex 端口 2(客户端)
4、连接到 TRex 端口 3(服务器端)
一台服务器:
要支持一个服务器的模板,您可以添加“server_addr”关键字。每个端口对将获得不同的服务器 IP(根据“dual_port_mask”偏移量)。
- - name: cap2/dns.pcap
- cps : 1.0
- ipg : 10000
- rtt : 10000
- w : 1
- server_addr : "48.0.0.1" 1
- one_app_server : true 2
说明:
1、服务器 IP。
2、启用一种服务器模式。
在 TRex 服务器中,您将看到以下统计信息。
- Active-flows : 19509 Clients : 504 Socket-util : 0.0670 %
- Open-flows : 247395 Servers : 65408 Socket : 21277 Socket/Clients : 42.2
与旧的生成器 YAML 格式没有向后兼容性。
使用 -p 选项时,TRex 将不符合静态路由规则。服务器端流量可以从客户端(端口 0)发送,反之亦然。如果使用 -p 选项,则必须配置基于策略的路由以将所有流量从路由器端口 1 传递到路由器端口 2,反之亦然。
VLAN特性不符合静态路由规则。如果使用它,您还需要基于策略的路由规则将数据包从 VLAN0 传递到 VLAN1,反之亦然。
限制:使用带有插件(捆绑包)的模板时,服务器的数量必须高于客户端的数量。
有关 IP 分配的更多详细信息
每次创建新流时,TRex 都会分配新的客户端 IP/端口和服务器 IP。
这个 3 元组在活动流中应该是不同的。
目前IP分配只支持顺序分配。这意味着每个流的 IP 地址都会增加一个。
例如,如果我们有两个 IP 地址池:16.0.0.1 和 16.0.0.2,客户端 src/端口对的分配将是
- 16.0.0.0.1 [1024]
- 16.0.0.0.2 [1024]
- 16.0.0.0.1 [1025]
- 16.0.0.0.2 [1025]
- 16.0.0.0.1 [1026]
- 16.0.0.0.2 [1026]
- ...
如何确定每秒数据包(PPS)和每秒比特(BPS)
让我们看一个包含 4 个数据包的流的示例。
绿色圆圈代表每个流的第一个数据包。
客户端ip池从16.0.0.1开始,分布为seq。

$Total PPS = \sum_{k=0}^{n}(CPS_{k}\times {flow\_pkts}_{k})$
$Concurrent flow = \sum_{k=0}^{n}CPS_{k}\times flow\_duration_k $
上述公式可用于计算 PPS。TRex 吞吐量取决于上面计算的 PPS 和 m 的值(作为命令行参数 -m 给出的乘数)。
m 值是总 pcap 文件 CPS 的乘数。pcap 文件的 CPS 是在 yaml 文件上配置的。
让我们举一个简单的例子,如下所示。
- cap_info :
- - name: avl/first.pcap < -- has 2 packets
- cps : 102.0
- ipg : 10000
- rtt : 10000
- w : 1
- - name: avl/second.pcap < -- has 20 packets
- cps : 50.0
- ipg : 10000
- rtt : 10000
- w : 1
吞吐量为:m*(CPS_1*flow_pkts+CPS_2*flow_pkts)
因此,如果将 m 设置为 1,则总 PPS 为:102*2+50*20 = 1204 PPS。
BPS 取决于数据包的大小。您可以参考您的数据包大小并获得 BPS = PPS*Packet_size。
每个模板分配 + 未来计划
1) 每个模板生成器
可以定义多个生成器并将其分配给不同的 pcap 文件模板。
YAML 配置是这样的:
- generator :
- distribution : "seq"
- clients_start : "16.0.0.1"
- clients_end : "16.0.1.255"
- servers_start : "48.0.0.1"
- servers_end : "48.0.20.255"
- clients_per_gb : 201
- min_clients : 101
- dual_port_mask : "1.0.0.0"
- tcp_aging : 0
- udp_aging : 0
- generator_clients :
- - name : "c1"
- distribution : "random"
- ip_start : "38.0.0.1"
- ip_end : "38.0.1.255"
- clients_per_gb : 201
- min_clients : 101
- dual_port_mask : "1.0.0.0"
- tcp_aging : 0
- udp_aging : 0
- generator_servers :
- - name : "s1"
- distribution : "seq"
- ip_start : "58.0.0.1"
- ip_end : "58.0.1.255"
- dual_port_mask : "1.0.0.0"
- cap_info :
- - name: avl/delay_10_http_get_0.pcap
- cps : 404.52
- ipg : 10000
- rtt : 10000
- w : 1
- - name: avl/delay_10_http_post_0.pcap
- client_pool : "c1"
- server_pool : "s1"
- cps : 404.52
- ipg : 10000
- rtt : 10000
- w : 1
2) 未来会支持更多的分布(比如正态分布)
目前,仅支持序列和随机。
3) 将支持元组池的直方图
此功能将使用户在定义 IP 生成器时更加灵活。
- generator :
- client_pools:
- - name : "a"
- distribution : "seq"
- clients_start : "16.0.0.1"
- clients_end : "16.0.1.255"
- tcp_aging : 0
- udp_aging : 0
-
- - name : "b"
- distribution : "random"
- clients_start : 26.0.0.1"
- clients_end : 26.0.1.255"
- tcp_aging : 0
- udp_aging : 0
-
- - name : "c"
- pools_list :
- - name:"a"
- probability: 0.8
- - name:"b"
- probability: 0.2
已弃用有状态模式的支,下面案例请改用高级有状态 (ASTF)。
要将 VLAN 标记添加到 TRex 生成的所有流量,请在平台配置文件的每个端口部分添加一个“vlan”关键字,如平台 YAML部分所述。
您可以为每个端口指定不同的 VLAN 标记,或仅在某些端口上使用 VLAN。
一个有用的应用是在实验室设置中,您有一个 TRex 和许多 DUT,并且您希望在每次运行时测试不同的 DUT,而无需更改电缆连接。您可以将每个 DUT 放在自己的 VLAN 上,并在每次运行时使用具有不同 VLAN 的不同 TRex 平台配置文件。
如果您想要简单的 VLAN 支持,这可能不是要使用的功能。此功能用于负载平衡。
VLAN Trunk TRex 功能尝试解决流量配置文件不对称时的路由器端口带宽限制(例如:非对称 SFR 配置文件)。
从端口的角度来看,此功能使用路由器子接口将非对称流量转换为对称流量。这需要 TRex 在两个 VLAN 上发送流量,如下所述。
YAML 格式 - 这在流量 YAML 文件中。
vlan : { enable : 1 , vlan0 : 100 , vlan1 : 200 }
例子
- - duration : 0.1
- vlan : { enable : 1 , vlan0 : 100 , vlan1 : 200 } 1
说明:
1、启用负载平衡功能: vlan0==100 , vlan1==200
有关完整文件示例,请参阅 TRex 源代码:scripts/cap2/ipv4_load_balance.yaml
问题定义:
场景:具有两个端口和一个 SFR 流量配置文件的 TRex。如果没有 VLAN/子接口,所有客户端模拟流量都在端口 0 上发送,所有服务器模拟流量(例如:HTTP 响应)在端口 1 上发送。
TRex port 0 ( client) <-> [ DUT ] <-> TRex port 1 ( server)
如果没有 VLAN 支持,流量是不对称的。10% 的流量来自端口 0(客户端),90% 来自端口 1(服务器)。端口 1 是瓶颈(10Gb/s 限制)。
带 VLAN/子接口
- TRex port 0 ( client VLAN0) <-> | DUT | <-> TRex port 1 ( server-VLAN0)
- TRex port 0 ( server VLAN1) <-> | DUT | <-> TRex port 1 ( client-VLAN1)
在这种情况下,vlan0 上的流量像以前一样发送,而 vlan1 上的流量则相反(客户端流量在端口 1 上发送,服务器流量在端口 0 上发送)。TRex 在 vlan 之间平均分配流量。这导致每个端口上的流量相等。
路由器配置:
- !
- interface TenGigabitEthernet1/0/0 1
- mac-address 0000.0001.0000
- mtu 4000
- no ip address
- load-interval 30
- !
- i
- interface TenGigabitEthernet1/0/0.100
- encapsulation dot1Q 100 2
- ip address 11.77.11.1 255.255.255.0
- ip nbar protocol-discovery
- ip policy route-map vlan_100_p1_to_p2 3
- !
- interface TenGigabitEthernet1/0/0.200
- encapsulation dot1Q 200 4
- ip address 11.88.11.1 255.255.255.0
- ip nbar protocol-discovery
- ip policy route-map vlan_200_p1_to_p2 5
- !
- interface TenGigabitEthernet1/1/0
- mac-address 0000.0001.0000
- mtu 4000
- no ip address
- load-interval 30
- !
- interface TenGigabitEthernet1/1/0.100
- encapsulation dot1Q 100
- ip address 22.77.11.1 255.255.255.0
- ip nbar protocol-discovery
- ip policy route-map vlan_100_p2_to_p1
- !
- interface TenGigabitEthernet1/1/0.200
- encapsulation dot1Q 200
- ip address 22.88.11.1 255.255.255.0
- ip nbar protocol-discovery
- ip policy route-map vlan_200_p2_to_p1
- !
-
- arp 11.77.11.12 0000.0001.0000 ARPA 6
- arp 22.77.11.12 0000.0001.0000 ARPA
-
- route-map vlan_100_p1_to_p2 permit 10 7
- set ip next-hop 22.77.11.12
- !
- route-map vlan_100_p2_to_p1 permit 10
- set ip next-hop 11.77.11.12
- !
-
- route-map vlan_200_p1_to_p2 permit 10
- set ip next-hop 22.88.11.12
- !
- route-map vlan_200_p2_to_p1 permit 10
- set ip next-hop 11.88.11.12
- !
说明:
1、主界面不能有 IP 地址。
2、启用 VLAN1
3、策略路由配置
4、启用 VLAN2
5、策略路由配置
6、TRex 目的端口 MAC 地址
7、策略路由配置规则
借助此功能,TRex 将 MAC 地址替换为 IP 地址。
注:此功能最初是由Cisco ISG集团请求的。
例子
- - duration: 0.1
- ...
- mac_override_by_ip: true
有几种模式:
0 , (legacy value: false ) - 从端口配置/ARP 查询中获取 MAC。这是默认模式。
1 , (legacy value: true ) - 仅替换客户端发送的数据包中的源 MAC
2 - 更换所有方向的所有 MAC。
版本 v2.61 及更早版本
只接受布尔值(模式 0 和 1)
MAC 将由 4 个 IP 字节和 TRex 接口的最后 2 个 MAC 字节组成。
例如,如果接口 MAC 是 AA:BB:CC:DD:EE:FF 并且 IP 是 1.2.3.4:
结果 MAC = 01:02:03:04:EE:FF
版本 v2.62 及更高版本
添加模式 2 以替换所有方向的所有 MAC。
为了向后兼容,接受布尔值。
MAC 将包含 TRex 接口的 MAC 的前 2 个字节,然后是 4 个 IP 字节。
例如,如果接口 MAC 是 AA:BB:CC:DD:EE:FF 并且 IP 是 1.2.3.4:
结果 MAC = AA:BB:01:02:03:04
对 IPv6 的支持包括:
支持包含 IPv6 数据包的 pcap 文件。
能够从包含 IPv4 数据包的 pcap 文件生成 IPv6 流量。
命令行--ipv6选项启用此功能。关键字src_ipv6和dst_ipv6指定 IPv6 地址的最高有效 96 位。例子:
- - duration : 10
- src_ipv6 : [0xFE80,0x0232,0x1002,0x0051,0x0000,0x0000]
- dst_ipv6 : [0x2001,0x0DB8,0x0003,0x0004,0x0000,0x0000]
- generator :
- 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 : 201
- min_clients : 101
- dual_port_mask : "1.0.0.0"
- tcp_aging : 1
- udp_aging : 1
src_ipv6 和 dst_ipv6 应该在根范围内,而不是在 IP 池中。
IPv6 地址是通过将通常是 IPv4 地址的内容放入最低有效 32 位并将 src_ipv6/dst_ipv6 关键字中提供的值复制到最高有效 96 位来形成的。如果未指定 src_ipv6 和 dst_ipv6,则默认形成与 IPv4 兼容的地址(最重要的 96 位为零)。
所有插件都支持 IPv6。
例子:
[bash]>sudo ./t-rex-64 -f cap2l/sfr_delay_10_1g.yaml -c 4 -p -l 100 -d 100000 -m 30 --ipv6
限制:
TRex 不能同时生成 IPv4 和 IPv6 流量。
--ipv6 即使使用仅包含 IPv6 数据包的 pcap 文件,也必须指定该开关。
路由器配置:
- interface TenGigabitEthernet1/0/0
- mac-address 0000.0001.0000
- mtu 4000
- ip address 11.11.11.11 255.255.255.0
- ip policy route-map p1_to_p2
- load-interval 30
- ipv6 enable ==> IPv6
- ipv6 address 2001:DB8:1111:2222::1/64 1
- ipv6 policy route-map ipv6_p1_to_p2 2
- !
-
-
- ipv6 unicast-routing 3
-
- ipv6 neighbor 3001::2 TenGigabitEthernet0/1/0 0000.0002.0002 4
- ipv6 neighbor 2001::2 TenGigabitEthernet0/0/0 0000.0003.0002
-
- route-map ipv6_p1_to_p2 permit 10 5
- set ipv6 next-hop 2001::2
- !
- route-map ipv6_p2_to_p1 permit 10
- set ipv6 next-hop 3001::2
- !
-
-
- asr1k(config)#ipv6 route 4000::/64 2001::2
- asr1k(config)#ipv6 route 5000::/64 3001::2
说明:
1、启用 IPv6
2、添加 pbr
3、启用 IPv6 路由
4、MAC 地址设置。应该是 TRex MAC。
5、PBR 配置