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
处理流程如下:
本文只是简单介绍网络故障模拟器的基本配置和使用方法,关于如何实现延迟处理报文的方法和报文带宽控制的后续再介绍。