网络仿真与模拟实验报告本科论文文档格式.docx
《网络仿真与模拟实验报告本科论文文档格式.docx》由会员分享,可在线阅读,更多相关《网络仿真与模拟实验报告本科论文文档格式.docx(66页珍藏版)》请在冰豆网上搜索。
![网络仿真与模拟实验报告本科论文文档格式.docx](https://file1.bdocx.com/fileroot1/2023-1/31/5ca304c1-609a-469e-bd45-d3effb4823a1/5ca304c1-609a-469e-bd45-d3effb4823a11.gif)
3)安装指令,进行编译安装,如图13所示:
图13进行编译安装
4)重新编译完后,如图14所示:
图14编译结果
5)设置环境变量:
6)测试NS2是否安装成功,如图15所示:
图15进入图形化接口窗口
7)在跳出的对话框中,输入nam,系统跳出一个图形界面,如图16所示:
图16Nam界面
8)在窗口中输入gnuplot,结果如图17所示,则NS2安装成功:
图17gnuplot界面
二、不同版本的TCP协议仿真模拟
2.1实验目的
通过本实验了解如何利用OTcl脚本编写NS仿真案例。
2.1实验步骤
●NS2下不同版本的TCP协议的OTcl脚本编写。
●在winx-server模式下键入命令:
ns<
文件名.tcl>
运行ns文件。
●对实验结果进行分析比较。
2.2实验过程及结果比较
⏹Tahoe执行方法,如下所示:
1.
nslab11.tclTahoe(lab11.tcl文件代码参考附录A,TCPV1)
2.gnuplot进入gnuplot>
提示符
会在目录下生成gif图片,见下面图片比较。
⏹Reno执行方法,如下所示:
⏹NewReno执行方法,如下所示:
(lab12.tcl)
⏹SACK执行方法,如下所示:
⏹Vegas执行方法,如下所示:
(lab13_1.tcl)
gnuplot>
settitle“Vegas”
setxlabel“time”
setylabel“cwnd”
setterminalgif
setoutput“cwnd-Vegas”
plot“cwnd0.tr”withlinespointslt1,“cwnd1.tr”withlinespointslt2
⏹Vegas和Re执行方法,如下所示:
(lab13_2.tcl)
1.nslab13_2.tcl
2.
settitle“VegasvsReno”
setoutput“cwnd-Vegas-Reno”
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放到这个目录里下。
这两个文件见附录D和E。
(红色字体为修订处)
文件说明:
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{
PingClass():
TclClass("
Agent/Ping"
){}
TclObject*create(int,constchar*const*){
return(newPingAgent());
}
}class_ping;
定义PingAgent的实现
PingAgent:
:
PingAgent():
Agent(PT_PING){
bind("
packetSize_"
&
size_);
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目录下编译文件
makeclean
makedepend
make
六、
编写测试的TCL代码
#Createasimulatorobject
setns[newSimulator]
#Openatracefile
setnf[openout.namw]
$nsnamtrace-all$nf
#Definea'
finish'
procedure
procfinish{}{
globalnsnf
$nsflush-trace
close$nf
execnamout.nam&
exit0
#Createthreenodes
setn0[$nsnode]
setn1[$nsnode]
setn2[$nsnode]
#Connectthenodeswithtwolinks
$nsduplex-link$n0$n11Mb10msDropTail
$nsduplex-link$n1$n21Mb10msDropTail
recv'
functionfortheclass'
Agent/MyPing'
Agent/MyPinginstprocrecv{fromrtt}{
$selfinstvarnode_
puts"
node[$node_id]receivedpinganswerfrom\
$fromwithround-trip-time$rttms."
#}
#Createtwopingagentsandattachthemtothenodesn0andn2
setp0[newAgent/MyPing]
$nsattach-agent$n0$p0
setp1[newAgent/MyPing]
$nsattach-agent$n2$p1
#Connectthetwoagents
$nsconnect$p0$p1
#Scheduleevents
$nsat0.2"
$p0send"
$nsat0.4"
$p1send"
$nsat0.6"
$nsat1.0"
finish"
#Runthesimulation
$nsrun
七、运行代码
四、添加Application和Agent协议
4.1实验目的
本部分通过编写一个UDP上的multimediaApplication来说明如何添加Application和Agent
4.2实验步骤
在ns-2.35下新建目录Multimedia,将udp-mm.cc,udp-mm.h,mm-app.cc,mm-app.h四个文件放到该目录下,这四个文件详细见附录F。
文件说明:
其中定义包头结构
编写MmAppSender
编写MmAppReceiver
具体见附录。
编写UdpMmAgent
UdpMmAgent继承了UdpAgent,添加了部分功能。
修改ns-2.35/packet.h
在如图两处,各添加一行,并做相应修改。
修改ns-2.35/tcl/lib/ns-packet.tcl
在protolist里添加
修改ns-2.35/common/agent.h
修改ns-2.35/apps/app.h:
在ns-2.35/tcl/lib/ns-default.tcl中设置新参数的默认值
七、
编辑ns-2.35/Makefile:
八、
在Makeflie目录下编译:
makeclean
make
九、运行
编写测试的TCL代码。
见附录F:
ex-mm-app.tcl
十、
运行程序
nsex-mm-app.tcl
附录A
TCPV1代码
if{$argc!
=1}{
Usage:
nslab11.tclTCPversion"
Example:
nslab11.tclTahoeornslab11.tclReno"
exit
setpar1[lindex$argv0]
#产生一个仿真的对象
$nscolor1Blue
#开启一个tracefile,用来记录封包传送的过程
setnd[openout-$par1.trw]
$nstrace-all$nd
setnf[openout-$par1.namw]
#开启一个档案用来记录cwnd变化情况
setf0[opencwnd-$par1.trw]
#定义一个结束的程序
globalnsndnff0tcppar1
#显示最后的平均吞吐量
puts[format"
averagethroughput:
%.1fKbps"
\
[expr[$tcpsetack_]*([$tcpsetpacketSize_])*8/1000.0/10]]
#关闭档案
close$nd
close$f0
execnamout-$par1.nam&
#定义一个记录的程序
#每格0.01秒就去记录当时的cwnd
procrecord{}{
globalnstcpf0
setnow[$nsnow]
puts$f0"
$now[$tcpsetcwnd_]"
$nsat[expr$now+0.01]"
record"
#产生传送节点,路由器r1,r2和接收节点
setr0[$nsnode]
setr1[$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$tcp
settcpsink[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变化情况
#在第10.0秒时去呼叫finish来结束模拟
#执行模拟
附录B
TCPV2代码
nslab12.tclTCPversion"
nslab12.tclRenoornslab12.tclNewrenoornslab12.tclSack"
globalnsndf0tcppar1
%.1fKbps"
[expr[$tcpsetack_]*([$tcpsetpacketSize_])*8/1000.0/10]]
#使用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--;