TCP与UDP模拟实验Word下载.docx
《TCP与UDP模拟实验Word下载.docx》由会员分享,可在线阅读,更多相关《TCP与UDP模拟实验Word下载.docx(13页珍藏版)》请在冰豆网上搜索。
若是没有额外的参数设置,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程序代码:
#针对不同的数据流定义不同的颜色,这是要给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&
#产生传输结点,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并不一定等#于实际模拟的时间)
#执行模拟
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
pkt
type
size
flags
fid
src
addr
dst
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<
end)printf(“%f%f\n,start,packet_duration);
执行方法:
($为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
highest_packet_id){
}
if(start_time[packet_id]==0){
#记录下包的seq_no
pkt_seqno[packet_id]=seq_no;
#初始化jitter计算所需变量
last_seqno=0;
last_delay=0;
seqno_diff=0;
#当数据列全部读取完后,开始计算有效封包的端点到端点的延迟时间
end){
#得到了delay值(packet_duration)后计算jitter
seqno_diff=pkt_seqno[packet_id]–last_seqno;
delay_diff=packet_duration–last_delay;
if(seqno_diff==0){
jitter=0;
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程序
#程序初始化,设置一变量记录packet被drop的数目
fsDrops=0;
numFs=0;
#统计从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程序
init=0;
i=0;
action=$1;
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;
#为了画图好看,把第一笔记录的throughput设为零,以表示传输开始
printf(“%.2f\t%.2f\n”,end_time[0],0);
for(j=i;
j<
i;
j++){
#单位为kbps
th=pkt_byte_sum[j]/(end_time[j]-start_time)*8/1000;
printf(“%.2f\t%.2f\n”,end_time,th);
printf(“%.2f\t%.2f\n”,end_time[i-1],0);
$awk–fmeasure-throughput.awkout.tr
注:
利用绘图工具gnuplot呈现模拟结果。