




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一、NS2模拟环境搭建在Windows操作系统下安装比较繁琐,需要根据NS不同版本,下载相关补丁进行修正。下面介绍在Windows下安装NS-allinone过程。1.1安装cygwin点击安装setup.exe文件,如图1所示:图1执行setup.exe文件请点击“下一步”按钮,如图2所示:图2安装步骤2选择“InstallfromInternet”单选按钮,如图3所示:图3安装步骤3点击“下一步”按钮,如图4所示:图4安装步骤4点击“下一步”按钮,如图5所示:图5安装步骤5点击“下一步”按钮,如图6所示: 图6安装步骤6点击“下一步”按钮,如图7所示:图7安装步骤7点击“下一步”按钮,如图8所示:图8安装步骤8选择“Curr”,点击“View”按钮,使右方出现“full”,然后把最下角的隐藏过期包组件那个勾去掉,如图9所示:图9安装步骤9由于是初次接触该软件,在不清楚各个包作用的情况下将所有的包都安装,然后点击“下一步”按钮,如图10所示:图10安装步骤10安装结束后,点击“完成”按钮,如图11所示:图11安装步骤111.2安装NS2解压缩并改变路径到ns-allinone-2.35,如图12所示:图12切换到NS目录修改ls.h错误代码行(进入C:cygwinhome/Administartor/ns-allinone-2.35/ns-2.35/linkstate/ls.h第137行):安装指令,进行编译安装,如图13所示:图13进行编译安装重新编译完后,如图14所示:图14编译结果设置环境变量:测试NS2是否安装成功,如图15所示:图15进入图形化接口窗口在跳出的对话框中,输入nam,系统跳出一个图形界面,如图16所示:图16Nam界面在窗口中输入gnuplot,结果如图17所示,则NS2安装成功:图17gnuplot界面
二、不同版本的TCP协议仿真模拟2.1实验目的通过本实验了解如何利用OTcl脚本编写NS仿真案例。2.1实验步骤NS2下不同版本的TCP协议的OTcl脚本编写。在winx-server模式下键入命令:ns<文件名.tcl>运行ns文件。对实验结果进行分析比较。2.2实验过程及结果比较 Tahoe执行方法,如下所示:nslab11.tclTahoe(lab11.tcl文件代码参考附录A,TCPV1)gnuplot进入gnuplot>提示符会在目录下生成gif图片,见下面图片比较。Reno执行方法,如下所示:NewReno执行方法,如下所示:(lab12.tcl)SACK执行方法,如下所示:Vegas执行方法,如下所示:(lab13_1.tcl)gnuplot>settitle“Vegas”gnuplot>setxlabel“time”gnuplot>setylabel“cwnd”gnuplot>setterminalgifgnuplot>setoutput“cwnd-Vegas”gnuplot>plot“cwnd0.tr”withlinespointslt1,“cwnd1.tr”withlinespointslt2Vegas和Re执行方法,如下所示:(lab13_2.tcl)1.nslab13_2.tcl2.gnuplot>settitle“VegasvsReno”gnuplot>setxlabel“time”gnuplot>setylabel“cwnd”gnuplot>setterminalgifgnuplot>setoutput“cwnd-Vegas-Reno”gnuplot>plot“cwnd-vegas.tr”withlinespointslt1,“cwnd-reno.tr”withlinespointslt结果比较图16Tahoe的cwnd变化图图17Reno的cwnd变化图图18TCPNewReno图19SACK图20Vegas图形图21Vegas与Reno的cwnd变化图结果分析从Tahoe的cwnd变化图(图16)中我们可以看出,TCP的CongestionWindow值会呈现周期性的重复变化。开始时,先由Slow-start开始,cwnd超过Ssthresh时进入CongestionAvoidance阶段。由于传送到网络上的封包不断地增加,当超出允许能传送到网络上的个数时,路由器开始使用Drop-tail将封包丢掉。当有封包遗失时,Tahoe这个TCP版本会将ssthresh设为发现到封包遗失时的Window值的1/2,接着将Window的值设为1。在Tahoe这个例子中,由于只要有封包遗失,Cwnd的值就会被重置为1(小于Ssthresh),因此每次封包遗失,Tahoe都重新由slow-start开始。从Reno的cwnd变化图(图17)中看到,当检测到封包遗失时,ssthresh和cwnd的值会被设为先前cwnd值的1/2。因此在重送遗失的封包后,TCPReno会由CongestionAvoidance开始。由于结束Fastrecovery后,Reno的cwnd由先前cwnd值的1/2开始增加,所以得到的平均吞吐量较Tahoe为佳。从该图中我们还可以看到,当TCP的传送端观察到端点到端点的路径并没有拥塞的情况时(没有检测到封包遗失),会持续地以累加的方式增加传送速率。但是当检测到路径拥塞的情况时,则以倍数的方式减少传送速率。基于上述原因,TCP的拥塞控制算法又常被称为累加递增-倍数递减的算法。从TCPNewReno的cwnd变化图(图18)中我们可以看到,NewReno在收到PartialACK时,并不会立刻结束Fast-recovery,相反,NewReno的传送端会持续地重送PartialACK之后的封包,直到将所有遗失的封包重送后才会结束Fast-recovery,这使得NewReno的传送端在网络有大量封包遗失时不需等待Timeout就能更正此错误,减少大量封包遗失对传输效果所造成的影响。NewReno大约每一个RTT时间可重送一个遗失的封包,在Fast-recovery阶段,若允许的话,传送端可以继续送出新的封包,以增加Link的使用率。从TCPSACK的cwnd变化图(图19)中我们可以看到,在这个版本中,加入了一个SACK选项,允许接收端在返回DuplicateACK时,将已接收到的数据区段(连续收到的数据范围)返回给传送端,数据区段与数据区段之间的间隔就是接收端没有收到的数据。通过这些信息,传送端就知道哪些是已经收到的,哪些是该重送的,因此SACK的传送端可以在一个RTT时间之内重送一个以上的封包。从Vegas的图形(图20)中可以看到,第一条Vegas从0s开始执行,10s时结束。第二条Vegas在5s时才开始执行,10s时结束。从图中我们还可以看到,在Slow-start阶段,cwnd的值大约两个RTT才会增加1倍。与Reno不同的是,当Diff的值介于α与β之间时,Vegas的cwnd会持续维持在一个稳定的状态,这是因为,基本上Vegas的拥塞控制算法是一种“拥塞避免”的方法。从Vegas与Reno的cwnd的变化图(图21)中可以看到,Reno的Window总是在较高的地方振荡,而Vegas的Window总是在较低的位置。虽然根据研究显示,当网络的通信都使用TCPVegas时,整体的执行效果会优于TCPReno,这是因为TCPVegas采取较为保守的作法避免封包遗失,并以此提高网络的执行效果。但当TCPVegas和Reno共存时,TCPVegas并没有办法与TCPReno公平地竞争频宽。造成这个问题的主要原因是,Reno使用了较具侵略性的拥塞控制方法,TCPReno的传送端会持续地将封包送到网络上直到发生拥塞。比较之下,Vegas的传送端在网络开始拥塞时就将传送端的传送速度降慢,以避免拥塞的情形发生。因此,当TCPVegas与TCPReno共存Vegas在效果上的表现总是会比较差。
三、添加Ping协议3.1实验目的本实验通过实现一个Ping协议来说明如何在NS2中添加新协议3.2实验步骤一、在ns-2.35目录下新建一个MyPing目录,将老师给的文件MyPing.h和MyPing.cc放到这个目录里下。这两个文件见HYPERLINK附录D和HYPERLINKE。(红色字体为修订处)文件说明:MyPing.h中:定义了包头结构:structhdr_ping{charret;doublesend_time;};定义PingAgent类classPingAgent:publicAgent{public:PingAgent();intcommand(intargc,constchar*const*argv);voidrecv(Packet*,Handler*);protected:intoff_ping_;};MyPing.cc中:定义PingHeaderClass类staticclassPingHeaderClass:publicPacketHeaderClass{public:PingHeaderClass():PacketHeaderClass("PacketHeader/Ping", sizeof(hdr_ping)){}}class_pinghdr;定义PingClass类staticclassPingClass:publicTclClass{public:PingClass():TclClass("Agent/Ping"){}TclObject*create(int,constchar*const*){return(newPingAgent());}}class_ping;定义PingAgent的实现PingAgent::PingAgent():Agent(PT_PING){bind("packetSize_",&size_);bind("off_ping_",&off_ping_);}intPingAgent::command(intargc,constchar*const*argv){if(argc==2){if(strcmp(argv[1],"send")==0){…}}return(Agent::command(argc,argv));}voidPingAgent::recv(Packet*pkt,Handler*){…}二、修改ns-2.35/common/packet.h文件如图找到相应的地方添加修改:(代码前面的+表示添加,-表示删除,下同)三、编辑ns-2.35/tcl/lib/ns-default.tcl增加一行Agent/MyPingsetpacketSize_64四、编辑ns-2.35/Makefile文件如图在OBJ_CC下添加一行五、Makefile目录下编译文件makecleanmakedependmake六、编写测试的TCL代码#Createasimulatorobjectsetns[newSimulator]#Openatracefilesetnf[openout.namw]$nsnamtrace-all$nf#Definea'finish'procedureprocfinish{}{globalnsnf$nsflush-traceclose$nfexecnamout.nam&exit0}#Createthreenodessetn0[$nsnode]setn1[$nsnode]setn2[$nsnode]#Connectthenodeswithtwolinks$nsduplex-link$n0$n11Mb10msDropTail$nsduplex-link$n1$n21Mb10msDropTail#Definea'recv'functionfortheclass'Agent/MyPing'Agent/MyPinginstprocrecv{fromrtt}{ $selfinstvarnode_ puts"node[$node_id]receivedpinganswerfrom\$fromwithround-trip-time$rttms."#}#Createtwopingagentsandattachthemtothenodesn0andn2setp0[newAgent/MyPing]$nsattach-agent$n0$p0setp1[newAgent/MyPing]$nsattach-agent$n2$p1#Connectthetwoagents$nsconnect$p0$p1#Scheduleevents$nsat0.2"$p0send"$nsat0.4"$p1send"$nsat0.6"$p0send"$nsat0.6"$p1send"$nsat1.0"finish"#Runthesimulation$nsrun七、运行代码
四、添加Application和Agent协议4.1实验目的本部分通过编写一个UDP上的multimediaApplication来说明如何添加Application和Agent4.2实验步骤一、在ns-2.35下新建目录Multimedia,将udp-mm.cc,udp-mm.h,mm-app.cc,mm-app.h四个文件放到该目录下,这四个文件详细见HYPERLINKex-mm-app.tcl十、运行程序nsex-mm-app.tcl
附录ATCPV1代码if{$argc!=1}{ puts"Usage:nslab11.tclTCPversion" puts"Example:nslab11.tclTahoeornslab11.tclReno" exit}setpar1[lindex$argv0]#产生一个仿真的对象setns[newSimulator]$nscolor1Blue#开启一个tracefile,用来记录封包传送的过程setnd[openout-$par1.trw]$nstrace-all$ndsetnf[openout-$par1.namw]$nsnamtrace-all$nf#开启一个档案用来记录cwnd变化情况setf0[opencwnd-$par1.trw]#定义一个结束的程序procfinish{}{globalnsndnff0tcppar1#显示最后的平均吞吐量puts[format"averagethroughput:%.1fKbps"\[expr[$tcpsetack_]*([$tcpsetpacketSize_])*8/1000.0/10]]$nsflush-trace #关闭档案close$nd close$nfclose$f0 execnamout-$par1.nam&exit0}#定义一个记录的程序#每格0.01秒就去记录当时的cwndprocrecord{}{ globalnstcpf0 setnow[$nsnow] puts$f0"$now[$tcpsetcwnd_]" $nsat[expr$now+0.01]"record"}#产生传送节点,路由器r1,r2和接收节点setn0[$nsnode]setr0[$nsnode]setr1[$nsnode]setn1[$nsnode]#建立链路$nsduplex-link$n0$r010Mb1msDropTail$nsduplex-link$r0$r11Mb4msDropTail$nsduplex-link$r1$n110Mb1msDropTail$nsduplex-link-op$n0$r0orientright$nsduplex-link-op$r0$r1orientright$nsduplex-link-op$r1$n1orientright$nsduplex-link-op$r0$r1queuePos0.5#设定队列长度为18个封包大小setqueue18$nsqueue-limit$r0$r1$queue#根据使用者的设定,指定TCP版本if{$par1=="Tahoe"}{ settcp[newAgent/TCP]}else{ settcp[newAgent/TCP/Reno]}$nsattach-agent$n0$tcpsettcpsink[newAgent/TCPSink]$nsattach-agent$n1$tcpsink$nsconnect$tcp$tcpsink$tcpsetfid_1#建立FTP应用程序setftp[newApplication/FTP]$ftpattach-agent$tcp#在0.0秒时,开始传送$nsat0.0"$ftpstart"#在10.0秒时,结束传送$nsat10.0"$ftpstop"#在0.0秒时去呼叫record来记录TCP的cwnd变化情况$nsat0.0"record"#在第10.0秒时去呼叫finish来结束模拟$nsat10.0"finish"#执行模拟$nsrun
附录BTCPV2代码if{$argc!=1}{ puts"Usage:nslab12.tclTCPversion" puts"Example:nslab12.tclRenoornslab12.tclNewrenoornslab12.tclSack" exit}setpar1[lindex$argv0]#产生一个仿真的对象setns[newSimulator]#开启一个tracefile,用来记录封包传送的过程setnd[openout-$par1.trw]$nstrace-all$nd#开启一个档案用来记录cwnd变化情况setf0[opencwnd-$par1.trw]#定义一个结束的程序procfinish{}{globalnsndf0tcppar1#显示最后的平均吞吐量puts[format"averagethroughput:%.1fKbps"\ [expr[$tcpsetack_]*([$tcpsetpacketSize_])*8/1000.0/10]]$nsflush-trace #关闭档案close$ndclose$f0 #使用awk分析记录文件以观察队列的变化 execawk{ BEGIN{ highest_packet_id=-1; packet_count=0; q_eln=0; } { action=$1; time=$2; src_node=$3; dst_node=$4;type=$5;flow_id=$8;seq_no=$11;packet_id=$12; if(src_node=="0"&&dst_node=="1"){ if(packet_id>highest_packet_id){ highest_packet_id=packet_id; } if(action=="+"){ q_len++; printtime,q_len; } if(action=="-"||action=="d"){ q_eln=q_len--; printtime,q_len; } } } }out-$par1.tr>queue_length-$par1.trexit0}#定义一个记录的程序#每格0.01秒就去记录当时的cwndprocrecord{}{ globalnstcpf0 setnow[$nsnow] puts$f0"$now[$tcpsetcwnd_]" $nsat[expr$now+0.01]"record"}#产生传送节点,路由器r1,r2和接收节点setr0[$nsnode]setr1[$nsnode]setn0[$nsnode]setn1[$nsnode]#建立链路$nsduplex-link$n0$r010Mb1msDropTail$nsduplex-link$r0$r11Mb4msDropTail$nsduplex-link$r1$n110Mb1msDropTail#设定队列长度为15个封包大小setbuffer_size15$nsqueue-limit$r0$r1$buffer_size#根据使用者的设定,指定TCP版本if{$par1=="Reno"}{ settcp[newAgent/TCP/Reno] settcpsink[newAgent/TCPSink] $tcpsetdebug_0}elseif{$par1=="Newreno"}{ settcp[newAgent/TCP/Newreno] settcpsink[newAgent/TCPSink] $tcpsetdebug_0}else{ settcp[newAgent/TCP/Sack1] settcpsink[newAgent/TCPSink/Sack1] $tcpsetdebug_1}$nsattach-agent$n0$tcp #将awnd的值设为24,这是advertisedwindow的上限#advertisedwindow是接收端的缓冲区可以容纳的封包个数,#因此当congestionwindow的值超过advertisedwindow时,#TCP的传送端会执行流量控制以避免送的太快而导致接收端的缓冲区溢满。$tcpsetwindow_24 $nsattach-agent$n1$tcpsink$nsconnect$tcp$tcpsink#建立FTP应用程序setftp[newApplication/FTP]$ftpattach-agent$tcp#在0.0秒时,开始传送$nsat0.0"$ftpstart"#在10.0秒时,结束传送$nsat10.0"$ftpstop"#在0.0秒时去呼叫record来记录TCP的cwnd变化情况$nsat0.0"record"#在第10.0秒时去呼叫finish来结束模拟$nsat10.0"finish"#计算在传输路径上大约可以容纳多少的封包#计算方式:在bottlenecklink上每秒可以传送的封包数*RTT+队列缓冲区大小puts[format"onpath:%.2fpackets"\[expr(1000000/(8*([$tcpsetpacketSize_]+40))*((1+4+1)*2*0.001))+$buffer_size]]#执行模拟$nsrun
附录CTCPv3代码#产生一个仿真的对象setns[newSimulator]#开启一个tracefile,用来记录封包传送的过程setnd[openout13_1.trw]$nstrace-all$nd#开启两个档案用来记录cwnd变化情况setf0[opencwnd0.trw]setf1[opencwnd1.trw]#定义一个结束的程序procfinish{}{globalnsndf0tcp0f1tcp1#puts"ACKnumber:[$tcp0setack_]" puts[format"averagethroughput:%.1fKbps"\ [expr[$tcp1setack_]*([$tcp1setpacketSize_])*8/1000.0/10]] puts[format"averagethroughput:%.1fKbps"\ [expr[$tcp0setack_]*([$tcp0setpacketSize_])*8/1000.0/10]]$nsflush-trace #关闭档案close$ndclose$f0close$f1#使用awk分析记录文件以观察队列的变化 execawk{ BEGIN{ highest_packet_id=-1; packet_count=0; q_eln=0; } { action=$1; time=$2; src_node=$3; dst_node=$4;type=$5;flow_id=$8;seq_no=$11;packet_id=$12; if(src_node=="0"&&dst_node=="1"){ if(packet_id>highest_packet_id){ highest_packet_id=packet_id; } if(action=="+"){ q_len++; printtime,q_len; } if(action=="-"||action=="d"){ q_eln=q_len--; printtime,q_len; } } } }out13_1.tr>queue_length-13_1.trexit0}#定义一个记录的程序#每格0.01秒就去记录当时的cwndprocrecord{}{ globalnstcp0f0tcp1f1 setnow[$nsnow] puts$f0"$now[$tcp0setcwnd_]" puts$f1"$now[$tcp1setcwnd_]" $nsat[expr$now+0.01]"record"}#建立节点setr0[$nsnode]setr1[$nsnode]setn0[$nsnode]setn1[$nsnode]setn2[$nsnode]setn3[$nsnode]#建立链路$nsduplex-link$n0$r010Mb1msDropTail$nsduplex-link$n2$r010Mb1msDropTail$nsduplex-link$r0$r11Mb20msDropTail$nsduplex-link$r1$n110Mb1msDropTail$nsduplex-link$r1$n310Mb1msDropTailsetbuffer_size15$nsqueue-limit$r0$r1$buffer_size#建立TCPVegas的FTP联机settcp0[newAgent/TCP/Vegas]$tcp0setv_alpha_1$tcp0setv_beta_3$tcp0setwindow_24$nsattach-agent$n0$tcp0settcp0sink[newAgent/TCPSink]$nsattach-agent$n1$tcp0sink$nsconnect$tcp0$tcp0sinksetftp0[newApplication/FTP]$ftp0attach-agent$tcp0#建立另一条TCPVegas的FTP联机settcp1[newAgent/TCP/Vegas]$tcp1setv_alpha_1$tcp1setv_beta_3$tcp1setwindow_24$nsattach-agent$n2$tcp1settcp1sink[newAgent/TCPSink]$nsattach-agent$n3$tcp1sink$nsconnect$tcp1$tcp1sinksetftp1[newApplication/FTP]$ftp1attach-agent$tcp1$nsat0.0"$ftp0start"$nsat10.0"$ftp0stop"$nsat5.0"$ftp1start"$nsat10.0"$ftp1stop"$nsat0.0"record"$nsat10.0"finish"#执行模拟$nsrun
#产生一个仿真的对象setns[newSimulator]#开启一个tracefile,用来记录封包传送的过程setnd[openout13_2.trw]$nstrace-all$nd#开启两个档案用来记录cwnd变化情况setf0[opencwnd-vegas.trw]setf1[opencwnd-reno.trw]#定义一个结束的程序procfinish{}{globalnsndf0tcp0f1tcp1#显示最后的平均吞吐量puts[format"Vegas-throughput:%.1fKbps"\[expr[$tcp0setack_]*([$tcp0setpacketSize_])*8/1000.0/10]]puts[format"Reno-tthroughput:%.1fKbps"\[expr[$tcp1setack_]*([$tcp1setpacketSize_])*8/1000.0/10]]$nsflush-trace #关闭档案close$ndclose$f0close$f1exit0}#定义一个记录的程序#每格0.01秒就去记录当时的cwndprocrecord{}{ globalnstcp0f0tcp1f1 setnow[$nsnow] puts$f0"$now[$tcp0setcwnd_]" puts$f1"$now[$tcp1setcwnd_]" $nsat[expr$now+0.01]"record"}#建立节点setr0[$nsnode]setr1[$nsnode]setn0[$nsnode]setn1[$nsnode]setn2[$nsnode]setn3[$nsnode]#建立链路$nsduplex-link$n0$r010Mb1msDropTail$nsduplex-link$n2$r010Mb1msDropTail$nsduplex-link$r0$r11Mb20msDropTail$nsduplex-link$r1$n110Mb1msDropTail$nsduplex-link$r1$n310Mb1msDropTailsetbuffer_size15$nsqueue-limit$r0$r1$buffer_size#建立TCPVegas的FTP联机settcp0[newAgent/TCP/Vegas]$tcp0setv_alpha_1$tcp0setv_beta_3$tcp0setwindow_24 $nsattach-agent$n0$tcp0settcp0sink[newAgent/TCPSink]$nsattach-agent$n1$tcp0sink$nsconnect$tcp0$tcp0sinksetftp0[newApplication/FTP]$ftp0attach-agent$tcp0#建立TCPReno的FTP联机settcp1[newAgent/TCP/Reno]$tcp1setwindow_24 $nsattach-agent$n2$tcp1settcp1sink[newAgent/TCPSink]$nsattach-agent$n3$tcp1sink$nsconnect$tcp1$tcp1sinksetftp1[newApplication/FTP]$ftp1attach-agent$tcp1$nsat0.0"$ftp0start"$nsat10.0"$ftp0stop"$nsat0.0"$ftp1start"$nsat10.0"$ftp1stop"$nsat0.0"record"$nsat10.0"finish"#执行模拟$nsrun
#Createasimulatorobjectsetns[newSimulator]#Opentracefilesetnf[openout.namw]$nsnamtrace-all$nf$nstrace-all[openout.trw]#Openoutputfileforwritingdata(inTCLsimulationscript)setf0[opencwnd-vegas.trw]setf1[opencwnd-reno.trw]setenable 1setdisable 0#Definea'finish'procedureprocfinish{}{globalnsnff0tcp0f1tcp1puts[format"Vegas-\tgoodput:%.1fKbps"[expr[$tcp0setack_]*([$tcp0setpacketSize_])*8/1000.0/10]]puts[format"Reno-\tgoodput:%.1fKbps"[expr[$tcp1setack_]*([$tcp1setpacketSize_])*8/1000.0/10]]$nsflush-trace #Closethetracefileclose$nfclose$f0close$f1 #Executenamonthetracefile#execnamout.nam&exit0}procrecord{}{ globalnstcp0f0tcp1f1 setnow[$nsnow] puts$f0"$now[$tcp0setcwnd_]" puts$f1"$now[$tcp1setcwnd_]" $nsat[expr$now+0.01]"record"}#Createtwonodessetr0[$nsnode]setr1[$nsnode]setn0[$nsnode]setn1[$nsnode]setn2[$nsnode]setn3[$nsnode]#Createaduplexlinkbetweenthenodes$nsduplex-link$n0$r010Mb1msDropTail$nsduplex-link$n2$r010Mb1msDropTail#$nsduplex-link$r0$r11Mb20msDropTailQueue/REDsetthesh_10Queue/REDsetmaxthresh_14Queue/REDsetlinterm_1$nsduplex-link$r0$r11Mb20msRED$nsduplex-link$r1$n110Mb1msDropTail$nsduplex-link$r1$n310Mb1msDropTailsetbuffer_size15$nsqueue-limit$r0$r1$buffer_sizesettcp0[newAgent/TCP/Vegas];$tcp0setv_alpha_1$tcp0setv_beta_3$tcp0setdebug_0$tcp0setwindow_24 $tcp0setfid_0$nsattach-agent$n0$tcp0settcp0sink[newAgent/TCPSink]$tcp0sinksetfid_0$nsattach-agent$n1$tcp0sink$nsconnect$tcp0$tcp0sinksetftp0[newApplication/FTP]$ftp0attach-agent$tcp0settcp1[newAgent/TCP/Reno]$tcp1setwindow_24 $tcp1setfid_1$nsattach-agent$n2$tcp1settcp1sink[newAgent/TCPSink]$tcp1sinksetfid_1$nsattach-agent$n3$tcp1sink$nsconnect$tcp1$tcp1sinksetftp1[newApplication/FTP]$ftp1attach-agent$tcp1$nsat00.0"$ftp0start"$nsat10.0"$ftp0stop"$nsat00.0"$ftp1start"$nsat10.0"$ftp1stop"$nsat00.0"record"$nsat10.0"finish"#Runthesimulation$nsrun
附录DMyPing.h/**File:HeaderFileforanew'Ping'AgentClassforthens*networksimulator*Author:MarcGreis(greis@cs.uni-bonn.de),May1998**/#ifndefns_myping_h#definens_myping_h#include"agent.h"#include"tclcl.h"#include"packet.h"#include"address.h"#include"ip.h"structhdr_MyPing{charret;doublesend_time;};classMyPingAgent:publicAgent{public:MyPingAgent();intcommand(intargc,constchar*const*argv);voidrecv(Packet*,Handler*);protected:intoff_MyPing_;};#endif
附录EMyPing.cc/**File:Codeforanew'Ping'AgentClassforthens*networksimulator*Author:MarcGreis(greis@cs.uni-bonn.de),May1998**/#include"MyPing.h"staticclassMyPingHeaderClass:publicPacketHeaderClass{public:MyPingHeaderClass():PacketHeaderClass("PacketHeader/MyPing", sizeof(hdr_MyPing)){}}class_MyPinghdr;staticclassMyPingClass:publicTclClass{public:MyPingClass():TclClass("Agent/MyPing"){}TclObject*create(int,constchar*const*){return(newMyPingAgent());}}class_MyPing;MyPingAgent::MyPingAgent():Agent(PT_MYPING){bind("packetSize_",&size_);bind("off_MyPing_",&off_MyPing_);}intMyPingAgent::command(intargc,constchar*const*argv){if(argc==2){if(strcmp(argv[1],"send")==0){//CreateanewpacketPacket*pkt=allocpkt();//AccessthePingheaderforthenewpacket:hdr_MyPing*hdr=(hdr_MyPing*)pkt->access(off_MyPing_);//Setthe'ret'fieldto0,sothereceivingnodeknows//thatithastogenerateanechopackethdr->ret=0;//Storethecurrenttimeinthe'send_time'fieldhdr->send_time=Scheduler::instance().clock();//Sendthepacketsend(pkt,0);//returnTCL_OK,sothecallingfunctionknowsthatthe//commandhasbeenprocessedreturn(TCL_OK);}}//Ifthecommandhasn'tbeenprocessedbyMyPingAgent()::command,//callthecommand()functionforthebaseclassreturn(Agent::command(argc,argv));}voidMyPingAgent::recv(Packet*pkt,Handler*){//AccesstheIPheaderforthereceivedpacket:hdr_ip*hdrip=(hdr_ip*)pkt->access(hdr_ip::offset());//AccessthePingheaderforthereceivedpacket:hdr_MyPing*hdr=(hdr_MyPing*)pkt->access(off_MyPing_);//Isthe'ret'field=0(i.e.thereceivingnodeisbeingpinged)?if(hdr->ret==0){//Sendan'echo'.Firstsavetheoldpacket'ssend_timedoublestime=hdr->send_time;//DiscardthepacketPacket::free(pkt);//CreateanewpacketPacket*pktret=allocpkt();//AccessthePingheaderforthenewpacket:hdr_MyPing*hdrret=(hdr_MyPing*)pktret->access(off_MyPing_);//Setthe'ret'fieldto1,sothereceiverwon'tsendanotherechohdrret->ret=1;//Setthesend_timefieldtothecorrectvaluehdrret->send_time=stime;//Sendthepacketsend(pktret,0);}else{//Apacketwasreceived.Usetcl.evaltocalltheTcl//interpreterwiththepingresults.//Note:IntheTclcode,aprocedure'Agent/MyPingrecv{fromrtt}'//hastobedefinedwhichallowstheusertoreacttotheping//result.charout[100];//PreparetheoutputtotheTclinterpreter.Calculatetheround//triptimesprintf(out,"%srecv%d%3.1f",name(),hdrip->src_.addr_>>Address::instance().NodeShift_[1], (Scheduler::instance().clock()-hdr->send_time)*1000);Tcl&tcl=Tcl::instance();tcl.eval(out);//DiscardthepacketPacket::free(pkt);}}
附录F实验4相关代码udp-mm.h////Author:JaeChung//File:udp-mm.h//Written:07/17/99(forns-2.1b4a)//Modifed:10/14/01(forns-2.1b8a)//#ifndefns_udp_mm_h#definens_udp_mm_h#include"udp.h"#include"ip.h"//MultimediaHeaderStructurestructhdr_mm{ intack;//isitackpacket? intseq;//mmsequencenumber intnbytes;//bytesformmpkt doubletime;//currenttime intscale;//scale(0-4)associatedwithdatarates //Packetheaderaccessfunctionsstaticintoffset_;inlinestaticint&offset(){returnoffset_;}inlinestatichdr_mm*access(constPacket*p){return(hdr_mm*)p->access(offset_);}};//UsedforRe-assemblesegmented(byUDP)MMpacketstructasm_mm{ intseq;//mmsequencenumber intrbytes;//currentlyreceivedbytes inttbytes;//totalbytestoreceiveforMMpacket};//UdpMmAgentClassdefinitionclassUdpMmAgent:publicUdpAgent{public: UdpMmAgent(); UdpMmAgent(packet_t); virtualintsupportMM(){return1;} virtualvoidenableMM(){support_mm_=1;} virtualvoidsendmsg(intnbytes,constchar*flags=0); voidrecv(Packet*,Handler*);protected: intsupport_mm_;//setto1ifaboveisMmAppprivate: asm_mmasm_info;//packetre-assemblyinformation};#endif
Udp-mm.cc////Author:JaeChung//File:udp-mm.cc//Written:07/17/99(forns-2.1b4a)//Modifed:10/14/01(forns-2.1b8a)//#include"udp-mm.h"#include"rtp.h"#include"random.h"#include<string.h>inthdr_mm::offset_;//MulitmediaHeaderClassstaticclassMultimediaHeaderClass:publicPacketHeaderClass{public: MultimediaHeaderClass():PacketHeaderClass("PacketHeader/Multimedia", sizeof(hdr_mm)){ bind_offset(&hdr_mm::offset_); }}class_mmhdr;//UdpMmAgentOTcllinkageclassstaticclassUdpMmAgentClass:publicTclClass{public: UdpMmAgentClass():TclClass("Agent/UDP/UDPmm"){} TclObject*create(int,constchar*const*){ return(newUdpMmAgent()); }}class_udpmm_agent;//Constructor(withnoarg)UdpMmAgent::UdpMmAgent():UdpAgent(){ support_mm_=0; asm_info.seq=-1;}UdpMmAgent::UdpMmAgent(packet_ttype):UdpAgent(type){ support_mm_=0; asm_info.seq=-1;}//AddSupportofMultimediaApplicationtoUdpAgent::sendmsgvoidUdpMmAgent::sendmsg(intnbytes,constchar*flags){ Packet*p; intn,remain; if(size_){ n=(nbytes/size_+(nbytes%size_?1:0)); remain=nbytes%size_; } else printf("Error:UDPmmsize=0\n"); if(nbytes==-1){ printf("Error:sendmsg()forUDPmmshouldnotbe-1\n"); return; } doublelocal_time=Scheduler::instance().clock(); while(n-->0){ p=allocpkt(); if(n==0&&remain>0)hdr_cmn::access(p)->size()=remain; elsehdr_cmn::access(p)->size()=size_; hdr_rtp*rh=hdr_rtp::access(p); rh->flags()=0; rh->seqno()=++seqno_; hdr_cmn::access(p)->timestamp()= (u_int32_t)(SAMPLERATE*local_time); //toeliminaterecvtouseMMfieldsfornonMMpackets hdr_mm*mh=hdr_mm::access(p); mh->ack=0; mh->seq=0; mh->nbytes=0; mh->time=0; mh->scale=0; //mmudppacketsaredistinguishedbysettingtheip //prioritybitto15(MaxPriority). if(support_mm_){ hdr_ip*ih=hdr_ip::access(p); ih->prio_=15; if(flags)//MMSeqNumispassedasflags memcpy(mh,flags,sizeof(hdr_mm)); } //add"beginningoftalkspurt"labels(tcl/ex/test-rcvr.tcl) if(flags&&(0==strcmp(flags,"NEW_BURST"))) rh->flags()|=RTP_M; target_->recv(p); } idle();}//SupportPacketRe-AssemblyandMultimediaApplicationvoidUdpMmAgent::recv(Packet*p,Handler*){ hdr_ip*ih=hdr_ip::access(p); intbytes_to_deliver=hdr_cmn::access(p)->size(); //ifitisaMMpacket(dataorack) if(ih->prio_==15){ if(app_){//ifMMApplicationexists //re-assembleMMApplicationpacketifsegmented hdr_mm*mh=hdr_mm::access(p); if(mh->seq==asm_info.seq) asm_info.rbytes+=hdr_cmn::access(p)->size(); else{ asm_info.seq=mh->seq; asm_info.tbytes=mh->nbytes; asm_info.rbytes=hdr_cmn::access(p)->size(); } //iffullyreassembled,passthepackettoapplication if(asm_info.tbytes==asm_info.rbytes){ hdr_mmmh_buf; memcpy(&mh_buf,mh,sizeof(hdr_mm)); app_->recv_msg(mh_buf.nbytes,(char*)&mh_buf); } } Packet::free(p); } //ifitisanormaldatapacket(notMMdataorackpacket) else{ if(app_)app_->recv(bytes_to_deliver); Packet::free(p); }}
Mm-app.h////Author:JaeChung//File:mm-app.h//Written:07/17/99(forns-2.1b4a)//Modifed:10/14/01(forns-2.1b8a)//#include"timer-handler.h"#include"packet.h"#include"app.h"#include"udp-mm.h"//Thisisusedforreceiver'sreceivedpacketaccountingstructpkt_accounting{intlast_seq;//sequencenumberoflastreceivedMMpktintlast_scale;//rate(0-4)oflastackedintlost_pkts;//numberoflostpktssincelastackintrecv_pkts;//numberofreceivedpktssincelastackdoublertt;//roundtriptime};classMmApp;//Senderusesthistimerto//schedulenextappdatapackettransmissiontimeclassSendTimer:publicTimerHandler{public: SendTimer(MmApp*t):TimerHandler(),t_(t){} inlinevirtualvoidexpire(Event*);protected: MmApp*t_;};//Reciverusesthistimertoschedule//nextackpackettransmissiontimeclassAckTimer:publicTimerHandler{public: AckTimer(MmApp*t):TimerHandler(),t_(t){} inlinevirtualvoidexpire(Event*);protected: MmApp*t_;};//MulitmediaApplicationClassDefinitionclassMmApp:publicApplication{public: MmApp(); voidsend_mm_pkt();//calledbySendTimer:expire(Sender) voidsend_ack_pkt();//calledbyAckTimer:expire(Receiver)protected: intcommand(intargc,constchar*const*argv); voidstart();//Startsendingdatapackets(Sender) void
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025版新能源项目投资合作协议范本大全
- 二零二五年度离婚后房产转让合同模板
- 2025版文化创意产业劳务分包合同范本
- 二零二五年度电力工程承包合伙合同示范
- 二零二五年度洗碗工劳动合同与社会保险配套服务合同
- 2025版茶叶包装设计及印刷服务合同范本
- 2025版道路货物运输合同责任保险示范文本
- 二零二五年度防盗门品牌形象设计与推广合同
- 二零二五年度抵押担保企业借款合同附三方担保细则
- 2025年滑雪教练职业技能测试卷:滑雪场地设施管理与维护试题
- GB/T 45891-2025肥料和土壤调理剂肥料原料中腐植酸和疏水性黄腐酸含量的测定
- 浙江典当行管理办法
- 道路交通安全生产制度
- 家电采购项目管理机构及人员配置
- 电力笔试题目及答案
- 员工减肥奖励管理办法
- 旅游服务礼仪说课课件
- 顾客特定要求CSR清单
- 公路养护安全管理办法
- 医疗行风警示教育
- 电力采集系统培训课件
评论
0/150
提交评论