您的位置:首页 > 其它

ns2仿真学习(四)-CoDel的队列管理仿真

2017-11-03 15:56 405 查看
路由器队列管理机制CoDel的ns2的仿真代码补丁[1]。为ns2打CoDel补丁的步骤参考[1]。

仿真脚本参考上一篇文章,将队列的管理机制由DropTail改为CoDel。脚本更改部分如下:

# CoDel values

# interval to keep min over

set interval [delay_parse 100ms]

# target in ms.

set target [delay_parse 5ms]

Queue/CoDel set target_ $target

Queue/CoDel set interval_ $interval

# Create the links:

$ns duplex-link $n0 $n1   100Mb  64ms CoDel


其他的脚本处理与上文一致。

最终的对比。



这个图与上文的图进行对比,bic仍旧占用了大部分带宽。但是CoDel使得reno与vegas得到相对多的带宽。

下面对比在仿真十秒后启动bic算法,两种队列管理机制的对比:





结论仍是如此,CoDel相对来说,改善了reno与vegas的带宽竞争能力。但是CoDel主要是限制了缓冲队列长度的积累,对于不同拥塞机制的tcp的公平性仍显得无能为力。怎么实现实现不同拥塞控制tcp流竞争公平性,是值得研究的议题。

在相同的条件下,对比下数据包的单向时延。我只检出了两种情况下与cubic相关的数据,计算时延脚本oneway_delay.awk。脚本修改自柯志亨老师的教程,抱歉找不到地址了。

BEGIN {
#程式初始化,設定一變數以記錄目前最高處理封包的ID。
highest_packet_id = 0;
}

{
action = $1;
time = $2;
node_1 = $3;
node_2 = $4;
type = $5;
flow_id = $8;
node_1_address = $9;
node_2_address = $10;
seq_no = $11;
packet_id = $12;
if(type=="tcp"&&node_1_address=="4.0"&&node_2_address=="5.0")
{
#記錄目前最高的packet ID
if ( packet_id > highest_packet_id )
highest_packet_id = packet_id;

#記錄封包的傳送時間
if ( start_time[packet_id] == 0 )
start_time[packet_id] = time;

#記錄CBR (flow_id=2) 的接收時間
if ( action == "r" ) {
end_time[packet_id] = time;
}

}

}

END {
#當資料列全部讀取完後,開始計算有效封包的端點到端點延遲時間
for ( packet_id = 0; packet_id <= highest_packet_id; packet_id++ ) {
start = start_time[packet_id];
end = end_time[packet_id];
packet_duration = end - start;

#只把接收時間大於傳送時間的記錄列出來
if ( start < end ) printf("%f %f\n", start, packet_duration);
}
}




从上图,可以明显看出,采用了CoDel队列管理机制的数据包单向时延较小。

[1]bufferbloat.net

[2]Gnuplot 画多条线

[3]Cronkite-Ratcliff B, Bergman A, Vargaftik S, et al. Virtualized congestion control[C]//Proceedings of the 2016 conference on ACM SIGCOMM 2016 Conference. ACM, 2016: 230-243.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  CoDel 仿真