簡易的動態(tài)丟包率下的grp測試工具
[toc]
1. 使用方法
- 編譯kcp,進入grp項目下,新建build子目錄,在build目錄下 cmake make編譯grp項目
~grp/build$ cmake ./
~grp/build$ make
編譯后在 ~grp/build/test/
下會生成名為 dyn_test
的可執(zhí)行文件枚荣。
- 運行
dyn_test
~grp/build$ ./test/dyn_test
程序會讀取工作目錄下(這里就是 ~grp/build/
) 名為 lossrate.dat
的文件作為動態(tài)丟包率的數(shù)據(jù)困食。并生成統(tǒng)計文件statistiscs-***.dat
边翁。
- 將
loss_cmp.py
放入build下,運行loss_cmp.py
~grp/build$ python loss_cmp.py
可能會提示缺各種庫硕盹,用pip install
安裝即可符匾。提示缺_tkinter
時,用apt-get install python-tk
安裝即可瘩例。 一般在linux系統(tǒng)下才會缺這個模塊啊胶。
- 在目錄下會生成一個
fig-***.png
的圖片甸各,即為圖表結(jié)果。類似下圖焰坪。
當(dāng)然趣倾,也可以用plt.show()命令與這個圖表互動。
2. 變化丟包率的數(shù)據(jù)輸入
lossrate.dat 的文件內(nèi)容按行劃分某饰,每行描述一個時間點或一個時間段的丟包率情況儒恋。
- 可以有下面四種格式。
[時間點] [丟包率]
[時間段-起始] [時間段-結(jié)束] [丟包率]
[時間段-起始] [時間段-結(jié)束] [丟包率-起始] [丟包率-結(jié)束]
[時間段-起始] [時間段-結(jié)束] [丟包率范圍-起始] [丟包率范圍-結(jié)束] [函數(shù)編號]
- 所有參數(shù)都是整數(shù)黔漂。
- 時間點時間段需要按遞增順序排列诫尽。
- 不要求時間段相切。
我們以下面這個例子去描述具體的對應(yīng)變化炬守。
[時間點] [丟包率]
// 第0ms時 丟包率為 0%
0 0
// 第5000ms 時 丟包率為 30%
5000 30
// 在第0ms ~ 第5000ms 丟包率被認為是線性增長的(從0%到30%)
[時間段-起始] [時間段-結(jié)束] [丟包率范圍-起始] [丟包率范圍-結(jié)束] [函數(shù)編號]
// 5s ~ 10s 丟包率按下標(biāo)為3的函數(shù)(lsrg_sqrto) 變化 范圍是30%~70%
// 二次函數(shù)
5000 10000 30 70 3
// 10s ~ 20s 丟包率按下標(biāo)為2的函數(shù)(lsrg_sin) 變化 范圍是20%~40%
// 正弦函數(shù)
10000 20000 20 40 2
// 10s ~ 20s 丟包率按下標(biāo)為1的函數(shù)(lsrg_rand) 變化 范圍是80%~90%
// 隨機函數(shù)
20000 25000 80 90 1
[時間段-起始] [時間段-結(jié)束] [丟包率]
// 30s ~ 35s 丟包率恒定為20%
30000 35000 20
[時間段-起始] [時間段-結(jié)束] [丟包率-起始] [丟包率-結(jié)束]
// 40 ~ 45s 丟包率從30% 線性變化到 60%
40000 45000 30 60
程序默認測試到60s. 相關(guān)的參數(shù)可以在dynloss_test.cpp
里作手動修改牧嫉。
3. 自定義丟包率生成函數(shù)
通過丟包率生成函數(shù)可以實現(xiàn)對丟包率的隨意控制。本質(zhì)上是實現(xiàn)一個給定定義域和值域等參數(shù)的函數(shù)减途。函數(shù)原型如下:
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是函數(shù)的自變量酣藻,是函數(shù)的時間戳輸入。params是函數(shù)的一些給定參數(shù)鳍置,包括定義域[ts_beg, ts_end] 辽剧,值域 [lsr_beg, lsr_end] 。 意思是:這個函數(shù)在第 ts_beg 毫秒到第 ts_end 毫秒內(nèi)墓捻,對每一個輸入ts抖仅,返回一個float的丟包率。
提供了四個已經(jīng)寫好了的丟包率生成函數(shù)砖第。函數(shù)的實現(xiàn)見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 *);...
你可以在net_test.h
里先聲明自己的函數(shù),再在net_test.cpp
里實現(xiàn)梧兼。在net_test.h
里的class DynamicLossrate
的構(gòu)造函數(shù)里放吩,通過push_back
方法添加自定義的函數(shù)。
例如我們實現(xiàn)一個在范圍內(nèi)的方波羽杰。周期T=2s渡紫。
// net_test.h
...
float lsrg_myfun_Swave(llu, lsrg_p*);
...
class DynamicLossrate{
public:
DynamicLossrate(){
...
this -> fun_vec.push_back(lsrg_myfun_Swave);// 得出對應(yīng)函數(shù)編號
...
}
...
}
// 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;
}
}
...