TCP与UDP模拟实验Word下载.docx

上传人:b****6 文档编号:21253804 上传时间:2023-01-28 格式:DOCX 页数:13 大小:35.80KB
下载 相关 举报
TCP与UDP模拟实验Word下载.docx_第1页
第1页 / 共13页
TCP与UDP模拟实验Word下载.docx_第2页
第2页 / 共13页
TCP与UDP模拟实验Word下载.docx_第3页
第3页 / 共13页
TCP与UDP模拟实验Word下载.docx_第4页
第4页 / 共13页
TCP与UDP模拟实验Word下载.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

TCP与UDP模拟实验Word下载.docx

《TCP与UDP模拟实验Word下载.docx》由会员分享,可在线阅读,更多相关《TCP与UDP模拟实验Word下载.docx(13页珍藏版)》请在冰豆网上搜索。

TCP与UDP模拟实验Word下载.docx

若是没有额外的参数设置,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呈现模拟结果。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 工学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1