NS2网络仿真实验Word文档下载推荐.docx
- 文档编号:21646277
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:15
- 大小:538.17KB
NS2网络仿真实验Word文档下载推荐.docx
《NS2网络仿真实验Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《NS2网络仿真实验Word文档下载推荐.docx(15页珍藏版)》请在冰豆网上搜索。
所有的链路都是以队列的形式来管理封包的到达、离开和丢弃。
(4)代理(agent):
负责网络层封包的产生和接收,也可以用在各个层次的协议实现中。
每个agent连接到一个网络节点上,由该节点给它分配一个端口号。
(5)封包(packet):
由头部和数据两部封包成。
一般情况下,packet只有头部、没有数据部分。
(6)应用层(Application):
流量产生器(Trafficgenerators)创建了各种不同的概率模型来模拟产生实际网络中的业务流,它建立在UDP代理之上;
应用模拟器(Simulatedapplication)产生建立在TCP代理之上的业务流。
(7)数据记录:
Trace,功能是能够详细记录模拟过程,同时,用户也可以根据自己的需要记录模拟过程中的任何一个细节,模拟结束后会产生out.tr文件;
Monitor,NS2中有两种监测,队列监测(QueueMonitoring)和流量监测(Per-FlowMonitoring)。
(8)动画演示Nam,是基于Tcl/Tk的动画演示工具,用来把模拟的过程用可视化的方式呈现出来,模拟结束后会产生out.man文件。
(9)数据分析:
gawk。
awk是一种程序语言。
它具有一般程序语言常见的功能。
由于awk语言具有使用直译器(Interpreter)不需先行编译;
变量无型别之分(Typeless),可使用文字当数组的注标(AssociativeArray)等特色,所以使用awk撰写程序比起使用其它语言更简洁便利且节省时间。
awk还具有一些内建功能,使得awk擅于处理具资料列(Record),字段(Field)型态的资料。
此外,awk内建有pipe的功能,可将处理中的资料传送给外部的Shell命令加以处理,再将Shell命令处理后的资料传回awk程序,这个特点也使得awk程序很容易使用系统资源。
而gawk是GNU所开发的awk,最初在1986年完成,之后不断改进和更新,gawk包含awk的所有功能。
3.3Trace文件的格式
(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)
(9)
(10)
(11)
(12)
Event
Time
Fromnode
Tonode
Pkttype
Pktsize
Flags
Fid
Srcaddr
Dstaddr
Seqnum
Pktid
(1)Event发生的事件类型。
+表示封包进入链路队列(Enqueue)
-表示封包离开链路队列(Dequeue)
r表示目的队列接受(receive)事件
d表示队列丢弃(drop)封包事件
(2)time表示事件发生的时间
(3)Fromnode表示封包发送节点的id
(4)Fromnode表示封包传送目的节点的id
(5)Pkttype表示封包类型
(6)Pktsize表示封包的大小
(7)Flags表示标志项
(8)Fid为Flowid的简写,流标识符
(9)Srcaddr表示源地址,格式为:
node.port。
node为封包发送节点的id,port代表发送封包节点的端口号。
(10)Dstaddr表示目的地址,格式为:
node为封包接收节点的id,port代表接收封包节点的端口号。
(11)Seqnum封包的序列号
(12)Pktid封包的唯一标识符,表示封包的id。
3.4CBR和FTP简介
CBR:
ConstantBitRate,固定传输速率。
这是一个用来形容通信服务质量(QualityofService,QoS)的术语。
和该词相对应的词是可变码率或可变比特率(VariableBitRate,缩写VBR)。
当形容编解码器的时候,CBR编码指的是编码器的输出码率(或者解码器的输入码率)应该是固定制(常数)。
当在一个带宽受限的信道中进行多媒体通信的时候CBR是非常有用的,因为这时候受限的是最高码率,CBR可以更好的易用这样的信道。
但是CBR不适合进行存储,因为CBR将导致没有足够的码率对复杂的内容部分进行编码(从而导致质量下降),同时在简单的内容部分会浪费一些码率。
FTP:
FileTransferProtocol,文件传输协议,中文简称为“文传协议”,用于Internet上的控制文件的双向传输。
同时,它也是一个应用程序(Application)。
用户可以通过它把自己的PC与世界各地所有运行FTP的服务器相连,访问服务器上的大量程序和信息。
FTP的主要作用,就是让用户连接上一个远程计算机(这些计算机上运行着FTP服务器程序)查看远程计算机有哪些文件,然后把文件从远程计算机上复制到本地计算机,或把本地计算机的文件送到远程计算机去。
3.5其他概念
(1)丢包率:
是一个比率,表示在单位时间内未收到的数据封包数与发送的数据封包数的比率,由于信号衰减、网络质量等诸多因素的影响,可能产生数据封包的丢失。
(2)端到端时延:
是由各种因素引起的,包括打包和解包时延,以及网络传送时延,本文中主要讨论的是网络传输时延。
(3)吞吐量:
单位时间内某个节点发送和接受的数据量,单位一般为b/s。
(4)抖动率:
网络延迟的变化量,它是由同一应用的任意两个相邻数据包在传输路由中经过网络延迟而产生的,由相邻数据包延迟时间差除以数据包序号差得到。
4.实验步骤
4.1NS2的安装
本文NS2的安装参照博文:
最终运行NS2自带simple.tcl得到图1,以示成功:
图1NS2安装成功
4.2Tcl脚本运行
本实验中编写的脚本simulator.tcl见附录一。
实际模拟的网络结构图如图2所示。
包含4个node,各节点之间都是以全双工的链路相连。
n0和n2之间链路的带宽为2Mbps,延迟为10ms,为DropTail队列方式;
n1和n2之间链路带宽为2Mbps,延迟为10ms,也为DropTail队列方式;
n2和n3之间链路的带宽为1.7Mbps,延迟为20ms,也为DropTail方式。
n0处有一个FTP的TCP流量产生器,n1处为CBR的UDP流量产生器,n3有一个接收TCP的sink和接收UDP的NULL。
图2网络结构图
仿真结束后,会产生两个档案,一个是out.nam,这是给NAM用的,用来把仿真的过程用可视化的方式呈现出来,这可以让我们很直观的方式去了解封包传送是如何从来源端送到接收端。
另一个档案是out.tr,这个档案记录了仿真过程中封包传送中所有的事件,例如第一笔记录是一个CBR的封包,长度为1000bytes,在时间0.1秒的时候,从n1传送到n2。
4.3吞吐量、封包延迟、抖动率和封包丢失率
4.3.1封包延迟
测量CBR封包端点到端点间延迟时间的程序写在measure-delay.awk中。
measure-delay.awk的具体代码查看附录。
在终端输入如下命令:
gawk-fmeasure-delay.awkout.tr>
cbr_delay
此指令将运行结果存储到cbr_delay文件中,以便进行绘图。
接着输入gnuplot,得到下图
接着按下图输入,为接下来要画的时延图做标识:
运行上图最后一条指令后得到图3:
图3封包延迟随时间的变化
4.3.2抖动率
抖动率就是延迟时间变化量delayvariance,由于网络的状态随时都在变化,有时候流量大,有时候流量小,当流量大的时候,许多封包就必需在节点的队列中等待被传送,因此每个封包从传送端到目的地端的时间不一定会相同,而这个不同的差异就是所谓的Jitter。
Jitter越大,则表示网络越不稳定。
量测CBRflow抖动率的代码写在measure-jitter.awk内,具体见附录。
运行方法仿照4.3.1,可得下图4:
图4抖动率随封包序列的变化
4.3.3封包丢失率
测量CBR封包丢失率的代码写在measure-drop.awk内,具体见附录。
运行awk-fmeasure-drop.awkout.tr>
cbr_drop后,可在cbr_drop中找到如下信息:
其中第一行表示CBR总共送出了550个封包,丢失了8个。
第二行表示总的丢包率为0.014545。
接下来的几行中,第一列表示时间,第二列表示丢包率。
仿照上两例,只不不过为了利用gnuplot,要把先把前两行删除。
最终可得丢包率随时间的变化如图5所示:
图5封包丢失率随时间的变化
4.3.4吞吐量
量测CBR吞吐量的代码写在measure-throughput.awk内,具体见附录。
图6吞吐量随时间的变化
5.实验结果分析
从丢包率、时延、吞吐量和抖动率的变化图中,可以看出当丢包率增加时,端到端之间的时延也在增加,而吞吐量则下降,丢包率、时延和吞吐量在表示网络性能的好坏时有一定的关系。
在时延的变化图中,在一刚开始的时候,由于只有CBR的封包,所以端到端时延都是固定的,但在1.0秒后,网络多了FTP的封包,这使得CBR封包和FTP封包必须互相的抢夺网络的资源,因此端到端时延变得不在固定,但等到FTP传输结束后,CBR封包的端到端时延又变成是固定值了。
在抖动率的变化图中,抖动率产生变化的原因同时延变化的原因相同,都是由于FTP封包的加入才使得端到端时延产生变化。
6.附录
6.1网络拓扑仿真脚本simulator.tcl:
#有线场景,四个节点,FTT+TCP用蓝色表示,CBR+UDP用红色表示
setns[newSimulator]
#设置颜色
$nscolor1Blue
$nscolor2Red
settracefd[openout.trw]
$nstrace-all$tracefd
setnamtracefd[openout.namw]
$nsnamtrace-all$namtracefd
procfinish{}{
globalnstracefdnamtracefd
$nsflush-trace
close$tracefd
close$namtracefd
execnamout.nam&
exit0
}
setn0[$nsnode]
setn1[$nsnode]
setn2[$nsnode]
setn3[$nsnode]
$nsduplex-link$n0$n22Mb10msDropTail
$nsduplex-link$n1$n22Mb10msDropTail
$nsduplex-link$n2$n31.7Mb20msDropTail
$nsqueue-limit$n2$n310
#用于设置NAM显示时,各节点的相对位置
$nsduplex-link-op$n0$n2orientright-down
$nsduplex-link-op$n1$n2orientright-up
$nsduplex-link-op$n2$n3orientright
$nsduplex-link-op$n2$n3queuePos0.5
settcp[newAgent/TCP]
$tcpsetclass_2
$nsattach-agent$n0$tcp
setsink[newAgent/TCPSink]
$nsattach-agent$n3$sink
$nsconnect$tcp$sink
$tcpsetfid_1
setftp[newApplication/FTP]
$ftpattach-agent$tcp
$ftpsettype_FTP
setudp[newAgent/UDP]
$nsattach-agent$n1$udp
setnull[newAgent/Null]
$nsattach-agent$n3$null
$nsconnect$udp$null
$udpsetfid_2
setcbr[newApplication/Traffic/CBR]
$cbrattach-agent$udp
$cbrsettype_CBR
$cbrsetpacket_size_1000
$cbrsetrate_1mb
$cbrsetrandom_false
$nsat0.1"
$cbrstart"
$nsat1.0"
$ftpstart"
$nsat4.0"
$ftpstop"
$nsat4.5"
$cbrstop"
#以下这一行可有可无
$nsdetach-agent$n0$tcp;
$nsdetach-agent$n3$sink"
$nsat5.0"
finish"
puts"
CBRpacketsize=[$cbrsetpacket_size_]"
CBRinterval=[$cbrsetinterval_]"
$nsrun
6.2丢包率awk处理脚本measure-drop.awk:
BEGIN{
dropNum=0;
totalNum=0
i=0;
lossrate[i]=0;
timeArr[i]=0;
{
event=$1;
time=$2;
fromNode=$3;
toNode=$4;
pktType=$5;
pktSize=$6;
flags=$7;
fid=$8;
srcAddr=$9;
stAddr=$10;
seqNum=$11;
pktId=$12;
if(fromNode==1&
&
toNode==2&
event=="
+"
)
totalNum++;
timeArr[i]=time;
lossrate[i]=(float)(dropNum/totalNum);
i++;
if(fid==2&
d"
dropNum++;
END{
printf("
#numberofpacketsent:
%d,lost:
%d\n"
totalNum,dropNum);
#lostrateofpackets:
%f\n"
dropNum/totalNum);
%f\t%f\n"
timeArr[j],lossrate[j]);
6.3处理时延的awk脚本measure-delay.awk:
#程序初始化,设定一变量以记录目前最高处理封包的ID。
highest_packet_id=0;
action=$1;
node_1=$3;
node_2=$4;
type=$5;
flow_id=$8;
node_1_address=$9;
node_2_address=$10;
seq_no=$11;
packet_id=$12;
#记录目前最高的packetID
if(packet_id>
highest_packet_id)
highest_packet_id=packet_id;
#记录封包的传送时间
if(start_time[packet_id]==0)
start_time[packet_id]=time;
#记录CBR(flow_id=2)的接收时间
if(flow_id==2&
action!
="
){
if(action=="
r"
)
end_time[packet_id]=time;
else{
#把不是flow_id=2的封包或者是flow_id=2但此封包被drop的时间设为-1
end_time[packet_id]=-1;
#当资料列全部读取完后,开始计算有效封包的端点到端点延迟时间
for(packet_id=0;
packet_id<
=highest_packet_id;
packet_id++)
start=start_time[packet_id];
end=end_time[packet_id];
packet_duration=end-start;
#只把接收时间大于传送时间的记录列出来
if(start<
end)printf("
%f%f\n"
start,packet_duration);
6.4吞吐量awk代码measure-throughput.awk:
init=0;
i=0;
src=$5;
pktsize=$6;
if(action=="
&
node_1==2&
node_2==3&
flow_id==2){
pkt_byte_sum[i+1]=pkt_byte_sum[i]+pktsize;
if(init==0){
start_time=time;
init=1;
end_time[i]=time;
i=i+1;
#为了画图好看,把第一笔记录的throughput设为零,以表示传输开始
%.2f\t%.2f\n"
end_time[0],0);
for(j=1;
j<
i;
j++){
th=pkt_byte_sum[j]/(end_time[j]-
start_time)*8/1000;
end_time[j],th);
#为了画图好看,把第后一笔记录的throughput再设为零,以表示传输结束
end_time[i-1],0);
6.5抖动率awk代码measure-jitter.awk:
#程序初始化
old_time=0;
old_seq_no=0;
#判断是否为n2传送到n3,且封包型态为cbr,动作为接受封包
if(node_1==2&
type=="
cbr"
action=="
){
#求出目前封包的序号和上次成功接收的序号差值
dif=seq_no-old_seq_no;
#处理第一个接收封包
if(dif==0)
dif=1;
#求出jitter
jitter[i]=(time-old_time)/dif;
seq[i]=seq_no;
i=i+1;
old_seq_no=seq_no;
old_time=time;
for(j=1;
j<
j++)
%d\t%f\n"
seq[j],jitter[j]);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- NS2 网络 仿真 实验