TCP与UDP模拟实验.docx
- 文档编号:8117551
- 上传时间:2023-01-28
- 格式:DOCX
- 页数:13
- 大小:35.80KB
TCP与UDP模拟实验.docx
《TCP与UDP模拟实验.docx》由会员分享,可在线阅读,更多相关《TCP与UDP模拟实验.docx(13页珍藏版)》请在冰豆网上搜索。
TCP与UDP模拟实验
TCP与UDP模拟实验
一、实验目的
1.了解如何在NS2中建立TCP联机与UDP联机
2.如何把模拟过程输出到文件,最后通过工具的分析把结果显示出来
二、背景知识
NS2网络仿真程序(TCLScript)的结构大致上都如下面的程序所示,在以后的实验中都会有类似以下的程序代码。
“#”为注释
#产生一个仿真的对象
setns[newSimulator]
#定义一个结束的程序
procfinish{}{
exit0
}
#以下可以新增一些如网络结构和应用程序设置的程序代码
#在适当的时间调用finish程序,以结束仿真,下面的例子是在第5秒的时候
$nsat5.0“finish”
#开始执行模拟
$nsrun
三、实验步骤
在这个实验中,将以一个简单的网络环境为实例,练习如何在仿真结束后,使用一些工具(awk,xgraph和gnuplot)来分析和呈现模拟结果。
呈现的效果评比指标包括了端点到端点的延迟(End-to-EndDelay)、抖动率(Jitter)、封包遗失率(PacketLoss)和吞吐量(Throughput)。
分析所采用的方法则是去分析网络仿真过程记录文件(traffictracefile)的方式。
四、网络仿真实例
1.仿真的网络结构图
这个网络的环境包含了两个传输结点s1和s2,路由器r和数据端d。
s1到r之间与s2到r之间的网络频宽都是2Mbps,传递延迟时间是10ms。
网络结构中的频宽瓶颈是在r到d之间,频宽为1.7Mbps,传递延迟的时间为20ms。
所有链路的管理机制都是DropTail,且r到d之间的最大队列长度(QueueLimit)是10个封包的长度。
在s1到d之间会有一条FTP的联机,FTP应用程序是建构在TCP之上,所以在写仿真环境的描述语言时,必须先建立一条TCP的联机,因此在来源端s1上使用TCPagent产生“tcp”来发送TCP的封包;在目的地d使用TCPsinkAgent产生“sink”来接收TCP的数据,并产生回复封包(ACK)返回发送端,最后释放接收的TCP封包。
另外,还必须要把这两个agent连起来(connect),联机才能建立。
若是没有额外的参数设置,TCP封包的长度为1KB。
此外,若想查看NS2模拟参数内定值,可以在~\ns-allinone-2.29\ns-2.29\tcl\lib目录下的ns-default.tcl中找到。
另外,在s2到d之间有一条固定的传输速率的联机(ConstantBitRate,CBR),CBR应用程序的结构在UDP之上,为此必须在s2使用UDPagent来产生,“udp”用来发送UDP封包,在d上使用NullAgent来产生“sink”,以接收由s2传送过来的UDP封包,然后再把接收的封包释放出来。
CBR的传输速率为1Mbps,每一个封包大小为1KB。
CBR是在0.1s开始传送,在4.5s结束传输;FTP是在1.0s开始传送,4.0s结束传输。
2.TCL程序代码:
#产生一个仿真的对象
setns[newSimulator]
#针对不同的数据流定义不同的颜色,这是要给NAM用的
$nscolor1Blue
$nscolor2Red
#打开一个NAM记录文件
setnf[openout.namw]
$nsnamtrace-all$nf
#打开一个仿真过程记录文件,用来记录封包传送的过程
setnd[openout.trw]
$nstrace-all$nd
#定义一个结束的程序
procfinish{}{
globalnsnfnd
$nsflush-trace
close$nf
close$nd
#以背景执行的方式去执行NAM
execnamout.nam&
exit0
}
#产生传输结点,s1的id为0,s2的id为1
sets1[$nsnode]
sets2[$nsnode]
#产生路由器结点,r的id为2
setr[$nsnode]
#产生数据接收结点,d的id为3
setd[$nsnode]
#s1-r的链路具有2Mbps的频宽,10ms的传递延迟时间,DropTail的队列管理方式
#s2-r的链路具有2Mbps的频宽,10ms的传递延迟时间,DropTail的队列管理方式
#r-d的链路具有1.7Mbps的频宽,20ms的传递延迟时间,DropTail的队列管理方式
$nsduplex-link$s1$r2Mb10msDropTail
$nsduplex-link$s2$r2Mb10msDropTail
$nsduplex-link$r$d1.7Mb20msDropTail
#设置r到d之间的QueueLimit为10个封包大小
$nsqueue-limit$r$d10
#设置结点的位置,这是要给NAM用的
$nsduplex-link-op$s1$rorientright-down
$nsduplex-link-op$s2$rorientright-up
$nsduplex-link-op$r$dorientright
#观测r到d之间queue的变化,这是要给NAM用的
$nsduplex-link-op$s1$rqueuePos0.5
#建立一条TCP的联机
settcp[newAgent/TCP]
$nsattach-agent$s1$tcp
setsink[newAgent/TCPSink]
$nsattach-agent$d$sink
$nsconnect$tcp$sink
#在NAM中,TCP的联机会以蓝色表示
$tcpsetfid_1
#在TCP联机之上建立FTP应用程序
setftp[newApplication/FTP]
$ftpattach-agent$tcp
$ftpsettype_FTP
#建立一条UDP的联机
setudp[newAgent/UDP]
$nsattach-agent$s2$udp
setnull[newAgent/null]
$nsattach-agent$d$null
$nsconnect$udp$null
#在NAM中,UDP的联机会以红色表示
$tcpsetfid_2
#在UDP联机之上建立CBR应用程序
setcbr[newApplication/CBR]
$cbrattach-agent$udp
$cbrsettype_CBR
#设置传送封包的大小为1000byte
$cbrsetpacket_size_1000
#设置传送的速率为1Mbps
$cbrsetrate_1mb
$cbrsetrandom_false
#设置FTP和CBR数据传送开始和结束时间
$nsat0.1“$cbrstart”
$nsat1.0“$ftpstart”
$nsat4.0“$ftpstop”
$nsat4.5“$cbrstop”
#结束TCP的联机(不一定需要写下面的程序代码来实际结束联机)
$nsat4.5“$nsdetach-agent$s1$tcp;$nsdetach-agent$d$sink”
#在模拟环境中,5s后去调用finish来结束模拟(这样要注意模拟环境中的5s并不一定等#于实际模拟的时间)
$nsat5.0“finish”
#执行模拟
$nsrun
3.执行方法
在执行此TCLscript时,请先进入绘图模式。
($是在cygwin下的提示符号)
$startxwin.bat
$nslab3.tcl
4.执行结果
在与lab3.tcl同一个目录下会产生一个out.tr(仿真过程记录文件)和一个out.nam(NAM记录文件),另外会打开两个新窗口(图略)。
5.执行NAM,观察网络仿真的过程(图略)。
五、分析模拟结果
1.仿真过程记录文件内容与格式
模拟结束后,除了使用NAM观看模拟的过程,另外就是使用仿真过程记录文件去做一些数值的分析,因此这个记录文件很重要,所以需要先了解这些记录文件中记录的格式。
以下是out.tr的部分记录
+0.10812cbr1000…………21.03.111
-0.10812cbr1000…………21.03.111
r0.11412cbr1000…………21.03.100
+0.11412cbr1000…………21.03.100
……………………………………………………………
Event
time
from
node
to
node
pkt
type
pkt
size
flags
fid
src
addr
dst
addr
seq
num
pktid
r:
receive(atto_node);
+:
enqueue(atqueue);
-:
dequeue(atqueue);
d:
drop(atqueue);
src_addr:
node.port;
dst_addr:
node.port.
每一笔记录的开始都是封包事件发生的原因,若是“r”,则表示封包被某个结点所接收;若是“+”则表示进入了队列;若是“-”则表示离开队列;若是“d”则表示封包被队列所丢弃。
接着的第二个字段表示的是事件发生的时间;字段三和字段四表示事件发生的地点(从fromnode到tonode);字段五表示封包的类型;字段六是封包的大小,字段七是封包的标记标注;字段八表示封包是属于哪一个数据流;字段九和字段十表示封包的来源端和目的端,这两个字段的格式是a.b,a代表结点编号,b表示端口号(PortNumber);字段十一表示封包的序号;字段十二表示封包的id。
以前面仿真过程记录文件的第一笔为例,意思说有一个封包packetid为1,数据流id为2,序号为1,长度为1000bytes,类型为CBR,它是从来源端1.0要到目的地3.1,在时间0.1s的时候,从结点1(s2)进入了结点2(r)的队列中。
2.端点到端点的延迟(End-to-EndDelay)
#这是测量CBR封包端点到端点延迟时间的awk程序
BEGIN{
#程序初始化,设置一变量以记录目前最高处理封包的ID
highest_packet_id=0;
}
{
action=$1;
time=$2;
from=$3;
to=$4;
type=$5;
pktsize=$6;
flow_id=$8;
src=$9;
dst=$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!
=“d”){
if(action==“r”){
end_time[packet_id]=time;
}
}else{
#把不是flow_id=2的封包或者是flow_id=2但此封包被drop的时间设为-1
end_time[packet_id]=-1;
}
}
END{
#当数据行全部读取完后,开始计算有效封包的端点到端点的延迟时间
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 } } 执行方法: ($为cygwinshell的符号) $awk–fmeasure-delay.awkout.tr 若要把结果存到文件中,可使用导向的方式,把结果存到cbr_delay文件中。 $awk–fmeasure-delay.awkout.tr>cbr_delay 3.抖动率(Jitter) 抖动率就是延迟时间变化量(DelayVariance),由于网络的流量随时都在变化,当流量大的时候,许多封包就是必须在结点的队列中等待被传送,因此每个封包从传送端到目的地端的时间也不一定会相同,而这个不同的差异就是所谓的抖动率。 抖动率越大,则表示网络越不稳定。 #这是测量CBR封包jitter的awk程序 #jitter=((recvtime(j)–sendtime(j))-(recvtime(i)-sendtime(i)))/(j-i),其中j>i BEGIN{ #程序初始化,设置一变量以记录目前最高处理封包的ID highest_packet_id=0; } { action=$1; time=$2; from=$3; to=$4; type=$5; pktsize=$6; flow_id=$8; src=$9; dst=$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){ #记录下包的seq_no pkt_seqno[packet_id]=seq_no; start_time[packet_id]=time; } #记录CBR(flow_id=2)的接收时间 if(flow_id==2&&action! =“d”){ if(action==“r”){ end_time[packet_id]=time; } }else{ #把不是flow_id=2的封包或者是flow_id=2但此封包被drop的时间设为-1 end_time[packet_id]=-1; } } END{ #初始化jitter计算所需变量 last_seqno=0; last_delay=0; seqno_diff=0; #当数据列全部读取完后,开始计算有效封包的端点到端点的延迟时间 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 #得到了delay值(packet_duration)后计算jitter seqno_diff=pkt_seqno[packet_id]–last_seqno; delay_diff=packet_duration–last_delay; if(seqno_diff==0){ jitter=0; }else{ jitter=delay_diff/seqno_diff; } printf(“%f%f\n”,start,jitter); last_seqno=pkt_seqno[packet_id]; last_delay=packet_duration; } } } 执行方法($为cygwinshell的提示符号)。 $awk–fmeasure-jitter.awkout.tr 若要把结果存到文件中,可使用导向的方式,把结果存到cbr_jitter文件中。 $awk–fmeasure-jitter.awkout.tr>cbr_jitter 执行结果: (略) 4.封包遗失率(PacketLoss) #这是测量CBR封包遗失率的awk程序 BEGIN{ #程序初始化,设置一变量记录packet被drop的数目 fsDrops=0; numFs=0; } { action=$1; time=$2; from=$3; to=$4; type=$5; pktsize=$6; flow_id=$8; src=$9; dst=$10; seq_no=$11; packet_id=$12; #统计从n1送出多少packets if(from==1&&to==2&&action==“+”) numFs++; #统计flow_id为2,且被drop的封包 if(flow_id==2&&action==“d”) fsDrops++; } end{ printf(“numberofpacketssent: %dlost: %d\n”,numFs,fsDrops); } 执行方式($为cygwinshell的提示符号)。 $awk–fmeasure-loss.awkout.tr 执行结果。 numberofpacketssent: 550lost: 8 这代表CBR送出了550个封包,但其中8个封包被丢掉了。 5.吞吐量(Throughput) #这是测量CBR封包平均吞吐量(AverageThroughput)的awk程序 BEGIN{ init=0; i=0; } { action=$1; time=$2; from=$3; to=$4; type=$5; pktsize=$6; flow_id=$8; src=$9; dst=$10; seq_no=$11; packet_id=$12; if(action==“r”&&from==2&&to==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; } } END{ #为了画图好看,把第一笔记录的throughput设为零,以表示传输开始 printf(“%.2f\t%.2f\n”,end_time[0],0); for(j=i;j #单位为kbps th=pkt_byte_sum[j]/(end_time[j]-start_time)*8/1000; printf(“%.2f\t%.2f\n”,end_time,th); } #为了画图好看,把第一笔记录的throughput设为零,以表示传输开始 printf(“%.2f\t%.2f\n”,end_time[i-1],0); } 执行方法($为cygwinshell的提示符号)。 $awk–fmeasure-throughput.awkout.tr 执行结果。 注: 利用绘图工具gnuplot呈现模拟结果。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- TCP UDP 模拟 实验