DYN_LOSS

简易的动态丢包率下的grp测试工具

[toc]

1. 使用方法

  1. 编译kcp,进入grp项目下,新建build子目录,在build目录下 cmake make编译grp项目
~grp/build$ cmake ./
~grp/build$ make

编译后在 ~grp/build/test/ 下会生成名为 dyn_test 的可执行文件。

  1. 运行dyn_test
~grp/build$ ./test/dyn_test

程序会读取工作目录下(这里就是 ~grp/build/ ) 名为 lossrate.dat 的文件作为动态丢包率的数据。并生成统计文件statistiscs-***.dat

  1. loss_cmp.py放入build下,运行 loss_cmp.py
~grp/build$ python loss_cmp.py

可能会提示缺各种库,用pip install安装即可。提示缺_tkinter时,用apt-get install python-tk安装即可。 一般在linux系统下才会缺这个模块。

  1. 在目录下会生成一个 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; 
    }
}
...
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • JMeter提供了很多函数,如果能够熟练使用,可以为脚本带来很多方便。 JMeter函数是一种特殊值,可用于除测试...
    微笑的AK47阅读 341评论 0 0
  • Python史上最全开发总结(转自静熙老师哈哈哈) 两本不错的书: 《Python参考手册》:对Python各个标...
    春风在抱阅读 774评论 1 4
  • 两本不错的书: 《Python参考手册》:对Python各个标准模块,特性介绍的比较详细。 《Python核心编程...
    静熙老师哈哈哈阅读 3,390评论 0 80
  • JMeter函数是一 些能够转化在测试树中取样器或者其他配置元件的域的特殊值。一个函数的调用就像这 样:${_fu...
    宇文臭臭阅读 5,211评论 0 3
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 8,607评论 28 53