网络仿真与模拟实验报告.docx
- 文档编号:3292142
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:66
- 大小:1.29MB
网络仿真与模拟实验报告.docx
《网络仿真与模拟实验报告.docx》由会员分享,可在线阅读,更多相关《网络仿真与模拟实验报告.docx(66页珍藏版)》请在冰豆网上搜索。
网络仿真与模拟实验报告
网络仿真和模拟课程设计实验报告
学院:
计算机学院
专业:
网络工程
组员(学号):
王荣达(13055522)、
李晨阳(13055318)、
张勇安(13055534)
指导老师:
郑秋华
完成时间2016年6月30日
一、NS2模拟环境搭建
在Windows操作系统下安装比较繁琐,需要根据NS不同版本,下载相关补丁进行修正。
下面介绍在Windows下安装NS-allinone过程。
1.1安装cygwin
1)点击安装setup.exe文件,如图1所示:
图1执行setup.exe文件
2)请点击“下一步”按钮,如图2所示:
图2安装步骤2
3)选择“InstallfromInternet”单选按钮,如图3所示:
图3安装步骤3
4)点击“下一步”按钮,如图4所示:
图4安装步骤4
5)点击“下一步”按钮,如图5所示:
图5安装步骤5
6)点击“下一步”按钮,如图6所示:
图6安装步骤6
7)点击“下一步”按钮,如图7所示:
图7安装步骤7
8)点击“下一步”按钮,如图8所示:
图8安装步骤8
9)选择“Curr”,点击“View”按钮,使右方出现“full”,然后把最下角的隐藏过期包组件那个勾去掉,如图9所示:
图9安装步骤9
10)由于是初次接触该软件,在不清楚各个包作用的情况下将所有的包都安装,然后点击“下一步”按钮,如图10所示:
图10安装步骤10
11)安装结束后,点击“完成”按钮,如图11所示:
图11安装步骤11
1.2安装NS2
1)解压缩并改变路径到ns-allinone-2.35,如图12所示:
图12切换到NS目录
2)修改ls.h错误代码行(进入C:
cygwinhome/Administartor/ns-allinone-2.35/ns-2.35/linkstate/ls.h第137行):
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”
gnuplot>setxlabel“time”
gnuplot>setylabel“cwnd”
gnuplot>setterminalgif
gnuplot>setoutput“cwnd-Vegas”
gnuplot>plot“cwnd0.tr”withlinespointslt1,“cwnd1.tr”withlinespointslt2
⏹Vegas和Re执行方法,如下所示:
(lab13_2.tcl)
1.nslab13_2.tcl
2.
gnuplot>settitle“VegasvsReno”
gnuplot>setxlabel“time”
gnuplot>setylabel“cwnd”
gnuplot>setterminalgif
gnuplot>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放到这个目录里下。
这两个文件见附录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{
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目录下编译文件
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
#Definea'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"$p0send"
$nsat0.6"$p1send"
$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
makedepend
make
九、运行
编写测试的TCL代码。
见附录F:
ex-mm-app.tcl
十、
运行程序
nsex-mm-app.tcl
附录A
TCPV1代码
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$nd
setnf[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$nf
close$f0
execnamout-$par1.nam&
exit0
}
#定义一个记录的程序
#每格0.01秒就去记录当时的cwnd
procrecord{}{
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$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变化情况
$nsat0.0"record"
#在第10.0秒时去呼叫finish来结束模拟
$nsat10.0"finish"
#执行模拟
$nsrun
附录B
TCPV2代码
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$nd
close$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=="-"||a
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 仿真 模拟 实验 报告