实验四ns2实验.docx
《实验四ns2实验.docx》由会员分享,可在线阅读,更多相关《实验四ns2实验.docx(15页珍藏版)》请在冰豆网上搜索。
实验四ns2实验
HUNANUNIVERSITY
计网实验报告
题目实验四:
ns2实验
学生姓名蒙寿伟
学生学号************
专业班级智能科学与技术1401班
指导老师肖晟
日期2017年6月2日
一、 实验目的
安装并运行网络仿真器NS2,了解其功能模块及配套工具的使用,掌握利用NS2进行网络仿真的方法,为进一步的网络系统性能分析设计创造良好的条件。
二、 实验环境配置
实验环境:
硬件:
计算机
软件:
ubuntu、ns2
NS2安装:
(1)配置环境
$sudoapt-getinstallbuild-essential
$sudoapt-getinstalltcl8.5tcl8.5-devtk8.5tk8.5-dev
$sduoapt-getinstalllibxmu-devlibxmu-headers
(2)安装ns2
在ns-allinone-2.35目录的终端下执行./install
三、 实验步骤
NS2仿真流程:
*建立Networkmodel:
描述整个网络的拓扑、带宽等信息
*建立trafficmodel:
描述所有的网络流量或错误情况的时间、类型、或呈何种数学分布。
*追踪分析结果:
仿真完成后,可调用nam观察整个仿真流程,或是将namfile中的信息抽取出来加以分析。
《1》建立Networkmodel
*建立ns对象
setns[newSimulator]
*建立节点
setn0[$nsnode]
*建立连接
Setduplex-link$n0$n1
队列(queue)是保持(held)或丢弃(drop)数据包的地方,目前NS2所支持的队列缓冲管理机制有drop-tail(FIFO)队列、RED缓冲管理、公平队列(FairQueueing,FQ)、随机公平队列(StochasticfairQueueing,SFQ),DRR(DeficitRound-Robin)和基于类的队列(class-basedqueueing,CBQ).
*建立局域网
$nsmakeLLQueue/DroptailMAC/802.3Channel
*产生流量
setsrc[newApplication/Traffic/CBR]
$srcattch-agent$udp
*建立排程
$nsat
$nsrun
《2》
代码:
##########################
#NS2仿真示例--nam方式
##########################
#建立对象
setns[newSimulator]
#设定颜色
$nscolor1Blue
$nscolor2Red
#打开跟踪文件out.nam,其中nf为文件句柄
setnf[openout.namw]
$nsnamtrace-all$nf
#定义结束过程
procfinish{}{
globalnsnf
$nsflush-trace
close$nf
execnamout.nam&
exit0
}
#建立四个节点
setns0[$nsnode]
setns1[$nsnode]
setns2[$nsnode]
setns3[$nsnode]
#建立节点间的链路lInk,设置带宽1Mbit/s,时延10ms,队列Drop,(FIFO)
$nsduplex-link$ns0$ns21Mb10msDropTail
$nsduplex-link$ns1$ns21Mb10msDropTail
$nsduplex-link$ns3$ns21Mb10msDropTail
#设定节点在拓扑图中的位置,使得整个图看起来布局更为合理
$nsduplex-link-op$ns0$ns2orientright-down
$nsduplex-link-op$ns1$ns2orientright-up
$nsduplex-link-op$ns2$ns3orientright
#设定nam中queue的位置,便于检测节点n2和n3之间的链路的队列
$nsduplex-link-op$ns2$ns3queuePos0.5
#为节点n0建立一个UDP代理udp0,用于产生流量,并设定flowid(流量标识符1
setudp0[newAgent/UDP]
$udp0setclass_1
$nsattach-agent$ns0$udp0
#设置udp0产生CBR流量,每隔0.005秒发生大小为500B的数据包
setcbr0[newApplication/Traffic/CBR]
$cbr0setpacketSize_500
$cbr0setinterval_0.005
$cbr0attach-agent$udp0
#为节点n1建立一个UDP代理udp0,用于产生流量,并设定flowid(流量标识符2
setudp1[newAgent/UDP]
$udp1setclass_2
$nsattach-agent$ns1$udp1
#设置udp1产生CBR流量,每隔0.005秒发生大小为500B的数据包
setcbr1[newApplication/Traffic/CBR]
$cbr1setpacketSize_500
$cbr1setinterval_0.005
$cbr1attach-agent$udp1
#为节点n3建立一个NULL代理null0,用来接受流量
setnull0[newAgent/Null]
$nsattach-agent$ns3$null0
#分别链接流量产生代理udp0,udp1和流量接受代理null0
$nsconnect$udp0$null0
$nsconnect$udp1$null0
#设置cbr0在仿真0.5秒后开始传送数据,4.5秒后停止传送数据,设置cbr1在仿真1.0秒后开始传送数据,4.0秒后停止传送数据
$nsat0.5"$cbr0start"
$nsat1.0"$cbr1start"
$nsat4.0"$cbr1stop"
$nsat4.5"$cbr0stop"
#仿真5秒后,调试结束
$nsat5.0"finish"
#执行仿真
$nsrun
执行:
实验过程:
(1)仿真0.5s后,节点n0开始向节点n2传送数据:
(2)1.0s后节点n1开始向节点n2传送数据:
(3)再一段时间后,由节点n0向节点n3发送的数据被丢弃:
(4)仿真结束:
实验分析:
(1)只有蓝色数据发送丢包的原因是:
队列缓冲管理机制是drop-tail(FIFO)队列,并且时间的设定是会让红色数据先进,蓝色数据位于队列。
蓝色的数据会被丢弃。
修改后可以预测是蓝色的先进:
红色的后进,所以应该是红色的被丢弃
(2)修改使公平:
FQ是公平队列(FairQueueing,FQ)
#建立节点间的链路lInk,设置带宽1Mbit/s,时延10ms,队列Drop,(FIFO)
$nsduplex-link$ns0$ns21Mb10msDropTail
$nsduplex-link$ns1$ns21Mb10msDropTail
$nsduplex-link$ns3$ns21Mb10msDropTail
改为:
#建立节点间的链路lInk,设置带宽1Mbit/s,时延10ms,队列Drop,(FQ)
$nsduplex-link$ns0$ns21Mb10msFQ
$nsduplex-link$ns1$ns21Mb10msFQ
$nsduplex-link$ns3$ns21Mb10msFQ
执行:
实验结果:
可以看到,红蓝的数据包的丢失率是大致相等的。
《3》
##########################
#NS2仿真示例--Xgragh方式
##########################
#建立一个对象
setns[newSimulator]
#打开输出文件
setf0[openout0.trw]
setf1[openout1.trw]
setf2[openout2.trw]
#for循环,建立n0~n4,5个节点
for{seti0}{$i<5}{incri}{
setn$i[$nsnode]
}
#建立链路
$nsduplex-link$n0$n31Mb100msDropTail
$nsduplex-link$n1$n31Mb100msDropTail
$nsduplex-link$n2$n31Mb100msDropTail
$nsduplex-link$n3$n41Mb100msDropTail
#定义过程
procfinish{}{
globalf0f1f2
close$f0
close$f1
close$f2
#调用Xgraph显示仿真结果
execxgraphout0.trout1.trout2.tr-geometry800x400&
exit0
}
#定义过程,为节点node和流量接收代理sink建立UDP连接,产生Expoo流量,并设置流量的
#size(数据包大小)/burst(突发时间)/idle(空闲时间)/rate(风律)
procattach-expoo-traffic{nodesinksizeburstidlerate}{
setns[Simulatorinstance]
#为节点建立一个udp代理soure,用于产生流量
setsource[newAgent/UDP]
$nsattach-agent$node$source
#产生Expoo流量
settraffic[newApplication/Traffic/Exponential]
$trafficsetpacketSize_$size
$trafficsetburst_time_$burst
$trafficsetidle_time_$idle
$trafficsetrate_$rate
$trafficattach-agent$source
#链接流量产生soure和流量接收代理link
$nsconnect$source$sink
return$traffic
}
#定义记录过程,周期性地记录3个流程接收代理sink0,sink1,sink2所接收的数据带宽,并分别写入3个文件f0,f1,f2中
procrecord{}{
globalsink0sink1sink2f0f1f2
setns[Simulatorinstance]
#定义过程再次被调用的时间,即调用周期
settime0.5
#获取代理已接收的字节数,即变量bytes的值
setbw0[$sink0setbytes_]
setbw1[$sink1setbytes_]
setbw2[$sink2setbytes_]
#获取当前时间
setnow[$nsnow]
#计算带宽,将结果写入文件
puts$f0"$now[expr$bw0/$time*8/1000000]"
puts$f1"$now[expr$bw1/$time*8/1000000]"
puts$f2"$now[expr$bw2/$time*8/1000000]"
$sink0setbytes_0
$sink1setbytes_0
$sink2setbytes_0
#重新排程
$nsat[expr$now+$time]"record"
}
setsink0[newAgent/LossMonitor]
setsink1[newAgent/LossMonitor]
setsink2[newAgent/LossMonitor]
$nsattach-agent$n4$sink0
$nsattach-agent$n4$sink1
$nsattach-agent$n4$sink2
setsource0[attach-expoo-traffic$n0$sink02002s1s100k]
setsource1[attach-expoo-traffic$n1$sink12002s1s200k]
setsource2[attach-expoo-traffic$n2$sink22002s1s300k]
$nsat0.0"record"
$nsat10.0"$source0start"
$nsat10.0"$source1start"
$nsat10.0"$source2start"
$nsat50.0"$source0stop"
$nsat50.0"$source1stop"
$nsat50.0"$source2stop"
$nsat60.0"finish"
$nsrun
执行:
实验结果:
Xgragh显示仿真过程中的内部状态,从图中可以看出,三条数据的峰值依次为0.1Mbit/s,0.2Mbit/s,0.3Mbit/s.
实验分析:
三个发送代理,可以看到发送速率是100k/bits、200k/bits、300k/bits
setsource0[attach-expoo-traffic$n0$sink02002s1s100k]
setsource1[attach-expoo-traffic$n1$sink12002s1s200k]
setsource2[attach-expoo-traffic$n2$sink22002s1s300k]
4号是接收代理
以nam方式显示出来:
可以清楚看到节点0,节点1,节点2的发送速率依次增大。
四、实验心得
这次实验的软件安装非常困难,是我对linux的使用过少造成的。
所以通过这次实验,我意识到了对linux的理解非常重要。
还有这次实验加深了我对链路层数据传输的机制的理解。