南邮NS仿真实验Word格式文档下载.docx
《南邮NS仿真实验Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《南邮NS仿真实验Word格式文档下载.docx(15页珍藏版)》请在冰豆网上搜索。
(6)测试:
在终端输入ns。
屏幕上出现%,说明安装成功了。
二、构造模型并仿真网络吞吐量与时间的关系
(1)我们确定基本模型是A主机经过节点B向节点C发送TCP包,AB和BC段都是1M的带宽。
带宽加倍就是将AB和BC变成2M的,而链路加倍就是增加一个节点D,从而增加AD和DC段,A通过B和D节点向C发送数据,并且AB和BC,AD和DC的带宽都是1M的。
(2)编写带宽加倍的脚本bandw.tcl如下
setns[newSimulator];
#产生一个模拟的对象
#定义数据流颜色
$nscolor1Red;
#1为红色
#开启Trace跟踪文件,记录分组传送的过程
settracefile[openbandwidth.trw]
$nstrace-all$tracefile
#开启NAM显示文件
setnamfile[openbandwidth.namw]
$nsnamtrace-all$namfile
#定义结束过程,关闭Trace文件和NAM显示文件,模拟结束时会进行调用
procfinish{}{
globalnstracefilenamfile
$nsflush-trace
close$tracefile
close$namfile
#以背景执行的方式去执行NAM
execnambandwidth.nam&
exit0
}
#定义节点n0~n2
setn0[$nsnode]
setn1[$nsnode]
setn2[$nsnode]
#定义节点间的双向链路(包括带宽、延时和队列的类型)
$nsduplex-link$n0$n14Mb10msDropTail
$nsduplex-link$n1$n24Mb10msDropTail
#建立一个TCP连接
settcp[newAgent/TCP];
#建立一个TCP发送代理
$tcpsetclass_2
$nsattach-agent$n0$tcp;
#绑定TCP发送代理到节点n0
setsink[newAgent/TCPSink];
#建立一个TCP接收代理
$nsattach-agent$n2$sink;
#绑定TCP接收代理到节点n2
$nsconnect$tcp$sink;
#连接TCP发送代理和接收代理
$tcpsetfid_1
#在TCP连接上建立FTP流
setftp[newApplication/FTP];
#建立一个FTP应用
$ftpattach-agent$tcp;
#将FTP流应用绑定到TCP发送代理
$ftpsettype_FTP
#设置代理的启动和停止时间
$nsat0.5"
$ftpstart"
;
#设定ftp流在0.5s开始
$nsat4.5"
$ftpstop"
#设定ftp流在4.5s结束
#在模拟结束时调用结束过程
$nsat5.0"
finish"
#执行模拟
$nsrun
编写链路加倍的脚本linkw.tcl如下
#产生一个仿真的对象
settracefile[openlink.trw]
setnamfile[openlink.namw]
#定义结束过程,关闭Trace文件和NAM显示文件,仿真结束时会进行调用
execnamlink.nam&
$nsrtprotoDV;
#告知simulator使用动态路由
NodesetmultiPath_1;
#simulator中所有新的节点均使用多径
#定义节点n0~n3
setn3[$nsnode]
$nsduplex-link$n0$n12Mb10msDropTail
$nsduplex-link$n0$n32Mb10msDropTail
$nsduplex-link$n1$n22Mb10msDropTail
$nsduplex-link$n3$n22Mb10msDropTail
$nsconnect$tcp$sink;
$ftpattach-agent$tcp;
#执行模拟
在终端键入两条命令:
nsbandwith.tcl和nslinkwidth.tcl,之后会生成nam文件和trace文件。
其中nam文件的图形如下:
带宽加倍的nam动画
链路加倍的nam动画
(3)编写gawk程序,分析trace文件
trace文件记录了仿真过程中事件的类型,事件发生的时间,分组的大小类型等等。
通过编写gawk程序来分析trace文件,从而分析网络的性能。
执行以上两条命令之后会生成bandwith.tr和linkwidth.tr,这里我们编写了throught.awk来分析它们,程序如下:
BEGIN{
init=0;
i=0;
{
action=$1;
time=$2;
node_1=$3;
node_2=$4;
src=$5;
pktsize=$6;
flow_id=$8;
node_1_address=$9;
node_2_address=$10;
seq_no=$11;
packet_id=$12;
if(action=="
r"
&
&
((node_1==1&
node_2==2)||(node_1==3&
node_2==2))&
flow_id==1){
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;
}
END{
#为了画图好看,把第一笔记录的throughput设为零,以表示传输开始
printf("
%.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;
printf("
end_time[j],th);
#为了画图好看,把第后一笔记录的throughput再设为零,以表示传输结束
end_time[i-1],0);
(3)利用gnuplot绘图
通过命令gawk-fthroughput.awkbandwidth.tr>
band_th将带宽加倍的分析结果存储到文件band_th中。
通过命令gawk-fthroughput.awklink.tr>
flink_th将链路加倍的分析结果存储到文件flink_th中。
我们因此得到了吞吐量与时间的关系的相关数据。
在终端中输入gnuplot,启动gnuplot绘图环境。
为了保证绘制的图片以~.jpg格式的图片文件形式输出,先键入两条命令:
settermjpeg
#设置输出图片的格式
setoutput'
band_th.jpg'
然后用以下命令将两条曲线画在一个坐标图中。
plot“band_th”
wl
plot“link_th”
wl
绘图如下:
网络的吞吐量与时间关系图
由Trace文件的分析结果,我们可以看出,带宽加倍链路的网络吞吐量比链路加倍链路的网络吞吐量大。
三、仿真网络吞吐量与数据包大小的关系
以上是在TCP下仿真的,我们还使用同样的网络模型在UDP下分析了网络的吞吐量与UDP包大小的关系。
(1)编写带宽加倍的Tcl脚本程序bandw.tcl如下
#全局变量opt(rate)和过程getopt
setopt(size)0;
#变量opt(rate)保存数据速率值
procgetopt{argcargv}{;
#过程getopt获取从命令行传递过来的数据值
globalopt
setopt(size)[lindex$argv0]
#建立一个模拟对象
setns[newSimulator]
#定义不同数据流的颜色
$nscolor1Blue
$nscolor2Red
#开启Trace跟踪文件,记录分组传递的过程
settracefd[openbandw.trw]
$nstrace-all$tracefd
setnf[openbandw.namw]
$nsnamtrace-all$nf
#定义结束过程,关闭Trace文件和NAM文件,模拟结束是进行调用
globalnstracefdnf
close$tracefd
close$nf
#定义节点n0-n2
#定义节点间的双向链路(包括带宽,延时和队列的类型)
#调用过程getopt获取数据发送的速率
getopt$argc$argv
puts"
opt(size)=$opt(size)"
#建立一个UDP连接
setudp[newAgent/UDP]
$nsattach-agent$n0$udp
setnull[newAgent/Null]
$nsattach-agent$n2$null
$nsconnect$udp$null
$udpsetfid_2
#在UDP连接代理上建立CBR流
setcbr[newApplication/Traffic/CBR]
$cbrattach-agent$udp
$cbrsettype_CBR
$cbrsetpacket_size_$opt(size)B;
#$opt(size)设定包的大小
$cbrsetrate_1900Kb
#设置代理的启动和停止时间
$cbrstart"
$cbrstop"
#模拟结束是调用结束过程
StartSimulation..."
链路加倍的Tcl脚本程序linkw.tcl如下
settracefd[openlinkw.trw]
setnf[openlinkw.namw]
NodesetmultiPath_1;
$nsduplex-link$n0$n11Mb10msDropTail
$nsduplex-link$n1$n21Mb10msDropTail
$nsduplex-link$n0$n31Mb10msDropTail
$nsduplex-link$n3$n21Mb10msDropTail
#$cbrsettype_CBR
$cbrsetpacket_size_$opt(size);
#设定包的大小
$cbrsetrate_1900Kb;
#将速率设置为1900
#$cbrsetrandom_false
(2)编写gawk程序,分析trace文件
运行以上两个Tcl脚本会生成两个trace文件bandw.tr和linkw.tr
用throught.awk来分析以上脚本生成的trace文件,程序如下:
event=$1;
time=$2;
from_node=$3;
to_node=$4;
pkt_type=$5;
pkt_size=$6;
flag=$7;
uid=$12;
if(event=="
to_node==2&
pkt_type=="
cbr"
){
pkt_byte_sum[i+1]=pkt_byte_sum[i]+(pkt_size-20);
if(init==0){
start_time=time;
init=1;
end_time[i]=time;
i++;
th=8*pkt_byte_sum[i-1]/(end_time[i-1]-start_time)/1000;
%d%.2f\n"
rate,th);
(3)编写shell脚本程序来控制包的大小变化
通过shell脚本程序get_performb和get_performl,我们可以改变UDP包的大小,从而观察出在不同的包大小下的网络的吞吐量,这样就避免了手动重复改变包大小这一参数,程序如下:
shell脚本程序get_performb
#!
/bin/sh
i=500
while["
$i"
-le2500];
do
nsbandw.tcl$i
gawk-fthrought.awksize=$ibandw.tr>
>
throught_b;
#存放数据
i=$(($i+50))
done
shell脚本程序get_performl
nslinkw.tcl$i
gawk-fthrought.awksize=$ilinkw.tr>
throught_l;
从程序可以看出包大小的起始值是500B,步长为50B,终止点是2500B。
在终端执行./get_performb可以分析bandw.tr,分析的数据存放在throught_b中;
同理执行./get_performl可以分析bandw.tr,分析的数据存放在throught_l中。
然后我们就可以利用throught_b和throught_l中的数据进行绘图了。
(4)绘图
绘图程序用gnuplot工具绘图,在终端键入gnuplot,启动gnuplot绘图环境,为了将图片以jpg格式输出,我们有如下程序:
gnuplot>
settermjpeg
#设置图片输出的格式
setoutput"
throught.jpg"
setxlabe'
packetsize'
#设置图片的x和y轴的含义
setylabe'
throughput'
plot"
throught_b"
wl,"
throught_l"
wl
#绘图
绘图如下:
网络的吞吐量与UDP包大小的关系图
从图中可以看出UDP包大小在1000B以下或在1850B以上时,两网络的吞吐两基本相同,但UDP包的大小超过1000B时,链路加倍网络的吞吐量急剧下降。
并且在1000B到1850B之间带宽加倍的吞吐量一直高于链路加倍的吞吐量。
综上分析了网络的吞吐量随时间的变化以及随包大小的变化,我们可以看出带宽加倍的吞吐量优于链路加倍的吞吐量。
.