简易的动态丢包率下的grp测试工具
[toc]
1. 使用方法
- 编译kcp,进入grp项目下,新建build子目录,在build目录下 cmake make编译grp项目
~grp/build$ cmake ./
~grp/build$ make
编译后在 ~grp/build/test/
下会生成名为 dyn_test
的可执行文件。
- 运行
dyn_test
~grp/build$ ./test/dyn_test
程序会读取工作目录下(这里就是 ~grp/build/
) 名为 lossrate.dat
的文件作为动态丢包率的数据。并生成统计文件statistiscs-***.dat
。
- 将
loss_cmp.py
放入build下,运行loss_cmp.py
~grp/build$ python loss_cmp.py
可能会提示缺各种库,用pip install
安装即可。提示缺_tkinter
时,用apt-get install python-tk
安装即可。 一般在linux系统下才会缺这个模块。
- 在目录下会生成一个
fig-***.png
的图片,即为图表结果。类似下图。
fig.png
当然,也可以用plt.show()命令与这个图表互动。
2. 变化丢包率的数据输入
lossrate.dat 的文件内容按行划分,每行描述一个时间点或一个时间段的丢包率情况。
- 可以有下面四种格式。
[时间点] [丢包率]
[时间段-起始] [时间段-结束] [丢包率]
[时间段-起始] [时间段-结束] [丢包率-起始] [丢包率-结束]
[时间段-起始] [时间段-结束] [丢包率范围-起始] [丢包率范围-结束] [函数编号]
- 所有参数都是整数。
- 时间点时间段需要按递增顺序排列。
- 不要求时间段相切。
我们以下面这个例子去描述具体的对应变化。
[时间点] [丢包率]
// 第0ms时 丢包率为 0%
0 0
// 第5000ms 时 丢包率为 30%
5000 30
// 在第0ms ~ 第5000ms 丢包率被认为是线性增长的(从0%到30%)
[时间段-起始] [时间段-结束] [丢包率范围-起始] [丢包率范围-结束] [函数编号]
// 5s ~ 10s 丢包率按下标为3的函数(lsrg_sqrto) 变化 范围是30%~70%
// 二次函数
5000 10000 30 70 3
// 10s ~ 20s 丢包率按下标为2的函数(lsrg_sin) 变化 范围是20%~40%
// 正弦函数
10000 20000 20 40 2
// 10s ~ 20s 丢包率按下标为1的函数(lsrg_rand) 变化 范围是80%~90%
// 随机函数
20000 25000 80 90 1
[时间段-起始] [时间段-结束] [丢包率]
// 30s ~ 35s 丢包率恒定为20%
30000 35000 20
[时间段-起始] [时间段-结束] [丢包率-起始] [丢包率-结束]
// 40 ~ 45s 丢包率从30% 线性变化到 60%
40000 45000 30 60
fig-2.png
程序默认测试到60s. 相关的参数可以在dynloss_test.cpp
里作手动修改。
3. 自定义丢包率生成函数
通过丢包率生成函数可以实现对丢包率的随意控制。本质上是实现一个给定定义域和值域等参数的函数。函数原型如下:
struct lsrg_parameters{ llu ts_beg, ts_end; int lsr_beg, lsr_end; };
typedef lsrg_parameters lsrg_p;
typedef long long unsigned llu;
float lsrg_f(llu ts, lsrg_p* params);
其中ts是函数的自变量,是函数的时间戳输入。params是函数的一些给定参数,包括定义域[ts_beg, ts_end] ,值域 [lsr_beg, lsr_end] 。 意思是:这个函数在第 ts_beg 毫秒到第 ts_end 毫秒内,对每一个输入ts,返回一个float的丢包率。
提供了四个已经写好了的丢包率生成函数。函数的实现见net_test.cpp
。
// net_test.h...float lsrg_line(llu , lsrg_p *);float lsrg_rand(llu , lsrg_p *);float lsrg_sin (llu , lsrg_p *);float lsrg_sqrto(llu, lsrg_p *);...
fun.png
你可以在net_test.h
里先声明自己的函数,再在net_test.cpp
里实现。在net_test.h
里的class DynamicLossrate
的构造函数里,通过push_back
方法添加自定义的函数。
例如我们实现一个在范围内的方波。周期T=2s。
// net_test.h
...
float lsrg_myfun_Swave(llu, lsrg_p*);
...
class DynamicLossrate{
public:
DynamicLossrate(){
...
this -> fun_vec.push_back(lsrg_myfun_Swave);// 得出对应函数编号
...
}
...
}
// net_test.cpp
...
float lsrg_myfun_Swave(llu ts, lsrg_p* params){
if(check_params(params) < 0){
return 0;
} else {
return (int(ts-params->ts_beg)&1) ? params->lsr_beg : param->lsr_end;
}
}
...