learning :network simulator plugin

2023-06-23 10:39:05 浏览数 (3)

Vpp 包括一个功能相当强大的网络模拟器插件,它可以模拟网络端到端的延迟往返时间和配置的网络丢包率及报文乱序功能。它非常适合在指定的延迟、带宽、丢包、乱序条件下评估 TCP 堆栈的性能。此功能和Linux系统下使用 tc 和 netem命令组合模拟客户环境网络波动情况一样:

代码语言:javascript复制
1. 延迟设置
//延迟 300ms ± 100ms
sudo tc qdisc add dev eth0 root netem delay 300ms 100ms
sudo tc qdisc del dev eth0 root netem delay 300ms 100ms

2. 丢包
//丢包率 5%
sudo tc qdisc add dev eth0 root netem loss 5%
sudo tc qdisc del dev eth0 root netem loss 5%


3. 使用iptables设置丢包,对输入报文随机丢包50%
iptables -I INPUT -s 121.14.48.1 -m statistic --mode random --probability 0.5 -j DROP 

“nsim”插可以设置在2 层交叉连接两个物理接口,也可以设置接口output方向,引入指定的延迟和网络丢失参数。

nsim通过vppct CLI接口进行配置很简单。首先,指定模拟器配置:单向延迟(所需 RTT 的一半)、链路带宽和预期的平均数据包大小。这些参数允许网络模拟器分配适当的缓冲量以产生请求的延迟/带宽。

代码语言:javascript复制
set nsim delay 25.0 ms bandwidth 10 gbit packet-size 128

要模拟网络丢包,请添加“packets-per-drop”或“drop-fraction [0.0 … 1.0]”参数:

代码语言:javascript复制
set nsim delay 25.0 ms bandwidth 10 gbit packet-size 128 packets-per-drop 10000

配置l2接口交叉或直接使能接口

代码语言:javascript复制
nsim cross-connect enable-disable <interface-name-1> <interface-name-2> [disable]
nsim output-feature enable-disable <interface-name> [disable]

下面通过数据包生成配置来进行nsim模块功能测试,配置命令文件如下:

代码语言:javascript复制
loop cre
set int ip address loop0 11.22.33.1/24
set int state loop0 up

loop cre
set int ip address loop1 11.22.34.1/24
set int state loop1 up

set nsim delay 1.0 ms bandwidth 10 gbit packet-size 128 packets-per-drop 1000
nsim cross-connect enable-disable loop0 loop1

packet-generator new {  
    name s0            
    limit 10000       
    size 128-128      
    interface loop0   
    node ethernet-input   
    data { IP4: 1.2.3 -> 4.5.6   
           UDP: 11.22.33.44 -> 11.22.34.44  
           UDP: 1234 -> 2345       
           incrementing 114     
    }       
}
下面使能数据包发生器,来看一下在二层交叉连接下,nsim模块执行的结果。
代码语言:javascript复制
root@jinsh:~# vppctl
    _______    _        _   _____  ___
 __/ __/ _   (_)__    | | / / _ / _ 
 _/ _// // / / / _    | |/ / ___/ ___/
 /_/ /____(_)_/___/   |___/_/  /_/

vpp# exec /root/nsim.conf. #执行配置脚本
vpp# show interface addr   #查询配置
GigabitEthernet2/6/0 (up):
  L3 192.168.100.1/24
local0 (dn):
loop0 (up):
  L3 11.22.33.1/24
loop1 (up):
  L3 11.22.34.1/24
pg-1 (dn):
vpp# show packet-generator #查询包生成器
Name               Enabled        Count     Parameters
s0                   No             0       limit 10000, rate 0.00e0 pps, size 128-128, buffer-size 2048, worker 0,
vpp#

vpp# packet-generator enable-stream #使能数据包生成器
vpp# show error  #查询记录信息
   Count                  Node                              Reason               Severity
      9991             nsim-wheel                    Packets transmitted           error
      9991                nsim                         Packets buffered            error
         9                nsim               Network loss simulation drop packet   error
         5             dpdk-input                          no error                error
        75             arp-reply             IP4 source address not local to sub   error
         4             ip4-input                  Multicast RPF check failed       error
      9991           ethernet-input                    l3 mac mismatch             error
代码语言:javascript复制

nsim模块主要有2个node节点,nsim网络模拟器处理节点,nsim-wheel 延迟和乱序处理节点(input类型)。由于是pg自发包无法抓取trace流程,大概处理流程如下:

下面来验证使能在接口output方向。

代码语言:javascript复制
vpp# set nsim delay 25 ms bandwidth 10 mbps packet-size 1500 drop-fraction 0.5 reorder-fraction 0.5
configuration
 delay: 25.0 ms
 drop fraction: .50000
 reorder fraction: .50000
 packet size: 1500
 worker wheel size: 21
 throughput: 10.0 mbps
 poll main thread: 0
 memory: 4k bytes per thread 0 bytes total

 nsim not enabled

在接口上使能网络模拟器,

代码语言:javascript复制
vpp# nsim output-feature enable-disable GigabitEthernet2/6/0

在外部去ping当设备接口ip地址,查询到延迟时间确实为25ms。

代码语言:javascript复制
a15010144762@jinshaohuideMacBook-Pro scripts % ping 192.168.1.20
PING 192.168.1.20 (192.168.1.20): 56 data bytes
64 bytes from 192.168.1.20: icmp_seq=0 ttl=64 time=25.754 ms
64 bytes from 192.168.1.20: icmp_seq=1 ttl=64 time=25.395 ms
Request timeout for icmp_seq 2
64 bytes from 192.168.1.20: icmp_seq=3 ttl=64 time=25.379 ms
Request timeout for icmp_seq 4
Request timeout for icmp_seq 5
Request timeout for icmp_seq 6
Request timeout for icmp_seq 7

处理流程如下:

本文只是简单介绍网络故障模拟器的基本配置和使用方法,关于如何实现延迟处理报文的方法和报文带宽控制的后续再介绍。

0 人点赞