Ns2简单有线网络仿真实验报告一、实验概述1、在windows系统下安装Centos虚拟机2、在Centos系统下安装NS2仿真工具包3、Nam方式示例二、实验内容1)NS2仿真工具包安装说明1.在Centos系统下设置root账户2.解压NS2文件3.安装ns-allinone-2.35设置环境变量4.验证NS2工具包安装情况2)Nam方式Otcl脚本# 产生一个仿真的对象set ns [new Simulator]#针对不同的资料流定义不同的颜色,这是要给NAM用的$ns color 1 Green$ns color 2 Red#开启一个NAM trace fileset 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-traceclose $nfclose $nd#以背景执行的方式去执行NAMexec nam out.nam &exit 0}#产生6个网络节点set n0 [$ns node]set n1 [$ns node]set n2 [$ns node]set n3 [$ns node]set n4 [$ns node]set n5 [$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$ns duplex-link $n3 $n4 1.7Mb 30ms DropTail$ns duplex-link $n3 $n5 1.5Mb 30ms DropTail#设定ns2到n3之间的Queue Size为10个封包大小$ns queue-limit $n2 $n3 10$ns queue-limit $n3 $n4 5#$ns queue-limit $n3 $n5 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$ns duplex-link-op $n3 $n4 orient right-up$ns duplex-link-op $n3 $n5 orient right-down#观测n2到n3之间queue的变化,这是要给NAM用的$ns duplex-link-op $n2 $n3 queuePos 0.5#建立一条n0-n5TCP的联机set tcp [new Agent/TCP]$ns attach-agent $n0 $tcpset sink [new Agent/TCPSink]$ns attach-agent $n5 $sink$ns connect $tcp $sink#在NAM中,TCP的联机会以Green表示$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 $udpset 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"#结束TCP的联机(不一定需要写下面的程序代码来实际结束联机)$ns at 4.5 "$ns detach-agent $n0 $tcp ; $ns detach-agent $n3 $sink"#在仿真环境中,5秒后去呼叫finish来结束仿真(这样要注意仿真环境中#的5秒并不一定等于实际仿真的时间$ns at 5.0 "finish"#执行仿真$ns run3)仿真结果仿真结束后,会产生out.nam和out.tr两个档案用来把仿真的过程用可视化的方式呈现出来4)数据分析1.End-to-End Delay把测量CBR封包端点到端点间延迟时间的awk程序,写在档案measure-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;#记录目前最高的packet IDif ( 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 ( flow_id == 2 && action != "d" ) {if ( action == "r" ) {end_time[packet_id] = time;}} else {#把不是flow_id=2的封包或者是flow_id=2但此封包被drop的时间设为-1 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);}}执行方法: ($为shell的提示符号)$awk -f measure-delay.awk out.tr若是要把结果存到档案,可使用导向的方式。
(把结果存到cbr_delay档案中) $awk -f measure-delay.awk out.tr > cbr_delayXgraph画图2、JitterJitter就是延迟时间变化量delay variance档案measure-jitter.awkBEGIN {#程序初始化old_time=0;old_seq_no=0;i=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;#判断是否为n2传送到n3,且封包型态为cbr,动作为接受封包if(node_1==2 && node_2==3 && type=="cbr" && action=="r") { #求出目前封包的序号和上次成功接收的序号差值dif=seq_no-old_seq_no;#处理第一个接收封包if(dif==0)dif=1;#求出jitterjitter[i]=(time-old_time)/dif;seq[i]=seq_no;i=i+1;old_seq_no=seq_no;old_time=time;}}END {for (j=1; j <i ;j++)printf("%d\t%f\n",seq[j],jitter[j]);}执行方法: ($为shell的提示符号)$awk -f measure-jitter.awk out.tr若是要把结果存到档案,可使用导向的方式。
(把结果存到cbr_jitter档案中) $awk -f measure-jitter.awk out.tr > cbr_jitterXgraph 画图4、L oss把量测CBR Packet Loss的情况写在档案measure-drop.awk内BEGIN {#程序初始化,设定一变量记录packet被drop的数目fsDrops = 0;numFs = 0;}{action = $1;time = $2;node_1 = $3;node_2 = $4;src = $5;flow_id = $8;node_1_address = $9;node_2_address = $10;seq_no = $11;packet_id = $12;#统计从n1送出多少packetsif (node_1==1 && node_2==2 && action == "+")numFs++;#统计flow_id为2,且被drop的封包if (flow_id==2 && action == "d")fsDrops++;}END {printf("number of packets sent:%d lost:%d\n", numFs, fsDrops); }执行方法: ($为shell的提示符号)$awk -f measure-drop.awk out.tr执行结果:这代表CBR送出了550个封包,但其中14个封包丢掉了。