图4 模拟场景
3.1 建立Otcl模拟代码文件
#创建一个模拟对象
set ns [new Simulator]
#为数据流定义不同的颜色,供NAM用
$ns color 1 Blue
$ns color 2 Red
#打开一个 NAM trace file
set nf [open out.nam w]
$ns namtrace-all $nf
#打开一个 trace file 记录数据包的传送过程
set nd [open out.tr w]
$ns trace-all $nd
#定义一个结束程序
proc finish {} {
global ns nf nd
$ns flush-trace
#关闭 NAM trace file
close $nf
close $nd
#以后台方式执行 NAM
exec nam out.nam &
exit 0
}
#创建四个节点
set n0 [$ns node]
set n1 [$ns node]
set n2 [$ns node]
set n3 [$ns node]
#把节点连接起来
$ns duplex-link $n0 $n2 2Mb 10ms DropTail
$ns duplex-link $n1 $n2 2Mb 10ms DropTail
$ns duplex-link $n2 $n3 1.7Mb 20ms DropTail
#设定n2和n3之间最大队列长度为10
$ns queue-limit $n2 $n3 10
#设定节点的位置,供NAM用
$ns duplex-link-op $n0 $n2 orient right-down
$ns duplex-link-op $n1 $n2 orient right-up
$ns duplex-link-op $n2 $n3 orient right
#设定n2-n3间的队列位置,供NAM用
$ns duplex-link-op $n2 $n3 queuePos 0.5
#建立一条TCP连接
set tcp [new Agent/TCP]
$tcp set class_ 2
$ns attach-agent $n0 $tcp
set sink [new Agent/TCPSink]
$ns attach-agent $n3 $sink
$ns connect $tcp $sink
#在NAM中,TCP的连接以蓝色表示
$tcp set fid_ 1
#在TCP连接之上建立FTP 应用
set ftp [new Application/FTP]
$ftp attach-agent $tcp
$ftp set type_ FTP
#建立一条UDP连接
set udp [new Agent/UDP]
$ns attach-agent $n1 $udp
set null [new Agent/Null]
$ns attach-agent $n3 $null
$ns connect $udp $null
#在NAM中,UDP的连接以红色表示
$udp set fid_ 2
#在UDP连接之上建立CBR应用
set cbr [new Application/Traffic/CBR]
$cbr attach-agent $udp
$cbr set type_ CBR
$cbr set packet_size_ 1000
$cbr set rate_ 1mb
$cbr set random_ false
# 设定FTP和CBR的开始和结束时间
$ns at 0.1 "$cbr start"
$ns at 1.0 "$ftp start"
$ns at 4.0 "$ftp stop"
$ns at 4.5 "$cbr stop"
#在5.0秒调用finish过程结束模拟
$ns at 5.0 "finish"
#执行模拟
$ns run
本例子在FedoraCore4,ns-2.29下测试通过,模拟结束后,产生两个文件,一个是out.nam,这是供NAM用的,用来可视化整个模拟过程;另一个是out.tr,记录了模拟过程中数据包传送中的所有事件,这是我们 分析 的重点。
3.2 利用awk提取out.tr文件中的数据
awk是一种程序 语言,可以使用很短的代码轻易地完成对文本档案做修改、分析、提取和比较等处理。根据Trace文件格式,我们很容易写出测量CBR数据包端到端延迟时间的awk程序delay.awk:
#测量CBR数据包端到端延迟时间
BEGIN {
highest_packet_id = 0;
}
{
action = $1;
time = $2;
from = $3;
to = $4;
type = $5;
pktsize = $6;
flow_id = $8;
src = $9;
dst = $10;
seq_no = $11;
packet_id = $12;
if ( packet_id > highest_packet_id )
highest_packet_id = packet_id;
if ( start_time[packet_id] == 0 )
start_time[packet_id] = time;
if ( flow_id == 2 && action != "d" ) {
if ( action == "r" ) {
end_time[packet_id] = time;
}
} else {
end_time[packet_id] = -1;
}
}
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);
}
}
本例执行并把结果重定向到cbr_delay文件中:$awk �Cf delay.awk out.tr>cbr_delay
3.3 利用Xgraph绘出图形
Xgraph是ns-allinone包中自带的一个小巧的绘图工具,它可以根据数据文件里的数据绘制出相应的图形。本例执行:$xgraph cbr_delay,结果如图5所示:
图5 cbr_delay图
由图可以看出:在一刚开始的时候,由于只有CBR的数据包,所以端到端的延迟是固定的,但在1.0秒后,FTP数据包参与争夺 网络 资源,因此,端到端的延迟变得不固定,但等到FTP传输结束后,CBR数据包的端到端的延迟又变得固定了。
4 结论
网络模拟日益成为分析、 研究 、设计和改善网络性能的强大工具,NS-2便是其中功能强大且可以免费得到的一种。本文详细讨论了NS-2的结构、功能及其使用 方法 ,并给出一个实例具体解释 NS-2的使用及使用相关工具对输出结果进行处理。总的来说,NS-2结构复杂,有一个相对陡峭的 学习 曲线,希望本文对学习NS-2能有所裨益。