HUNANUNIVERSITY计网实验报告题目实验四:ns2实验学生姓名蒙寿伟学生学号201408070120专业班级智能科学与技术1401班指导老师肖晟日期2017年6月2日一、实验目的安装并运行网络仿真器NS2,了解其功能模块及配套工具的使用,掌握利用NS2进行网络仿真的方法,为进一步的网络系统性能分析设计创造良好的条件。二、实验环境配置实验环境:硬件:计算机软件:ubuntu、ns2NS2安装:(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$n1bandwidthdelayqueue_type队列(queue)是保持(held)或丢弃(drop)数据包的地方,目前NS2所支持的队列缓冲管理机制有drop-tail(FIFO)队列、RED缓冲管理、公平队列(FairQueueing,FQ)、随机公平队列(StochasticfairQueueing,SFQ),DRR(DeficitRound-Robin)和基于类的队列(class-basedqueueing,CBQ).*建立局域网$nsmakenode_listbandwidthdelayLLQueue/DroptailMAC/802.3Channel*产生流量setsrc[newApplication/Traffic/CBR]$srcattch-agent$udp*建立排程$nsattimeevent$nsrun《2》代码:###########################NS2仿真示例--nam方式###########################建立对象setns[newSimulator]#设定颜色$nscolor1Blue$nscolor2Red#打开跟踪文件out.nam,其中nf为文件句柄setnf[openout.namw]$nsnamtrace-all$nf#定义结束过程procfinish{}{globalnsnf$nsflush-traceclose$nfexecnamout.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(流量标识符1setudp0[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(流量标识符2setudp1[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.0finish#执行仿真$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}{$i5}{incri}{setn$i[$nsnode]}#建立链路$nsduplex-link$n0$n31Mb100msDropTail$nsduplex-link$n1$n31Mb100msDropTail$nsduplex-link$n2$n31Mb100msDropTail$nsduplex-link$n3$n41Mb100msDropTail#定义过程procfinish{}{globalf0f1f2close$f0close$f1close$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$sinkreturn$traffic}#定义记录过程,周期性地记录3个流程接收代理sink0,sink1,sink2所接收的数据带宽,并分别写入3个文件f0,f1,f2中procrecord{}{globalsink0sink1sink2f0f1f2setns[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$sink2setsource0[attach-expoo-traffic$n0$sink02002s1s100k]setsource1[attach-expoo-traffic$n1$sink12002s1s200k]setsource2[attach-expoo-traffic$n2$sink22002s1s300k]$nsat0.0record$nsat10.0$source0start$nsat10.0$source1start$nsat10.0$source2start$nsat50.0$source0stop$nsat50.0$source1stop$nsat50.0$source2stop$nsat60.0finish$