1、 若是没有额外的参数设置,TCP封包的长度为1KB。此外,若想查看NS2模拟参数内定值,可以在ns-allinone-2.29ns-2.29tcllib目录下的ns-default.tcl中找到。另外,在s2到d之间有一条固定的传输速率的联机(Constant Bit Rate,CBR),CBR应用程序的结构在UDP之上,为此必须在s2使用UDP agent来产生,“udp”用来发送UDP封包,在d上使用Null Agent来产生“sink”,以接收由s2传送过来的UDP封包,然后再把接收的封包释放出来。CBR的传输速率为1Mbps,每一个封包大小为1KB。CBR是在0.1s开始传送,在4.5
2、s结束传输;FTP是在1.0s开始传送,4.0s结束传输。2.TCL程序代码:#针对不同的数据流定义不同的颜色,这是要给NAM用的$ns color 1 Blue$ns color 2 Red#打开一个NAM记录文件set nf open out.nam w$ns namtrace-all $nf#打开一个仿真过程记录文件,用来记录封包传送的过程set nd open out.tr w$ns trace-all $ndproc finish global ns nf nd $ns flush-trace close $nf close $nd #以背景执行的方式去执行NAM exec nam
3、out.nam 产生传输结点,s1的id为0,s2的id为1set s1 $ns nodeset s2 $ns node#产生路由器结点,r的id为2set r $ns node#产生数据接收结点,d的id为3set d $ns node#s1-r的链路具有2Mbps的频宽,10ms的传递延迟时间,DropTail的队列管理方式#s2-r的链路具有2Mbps的频宽,10ms的传递延迟时间,DropTail的队列管理方式#r-d的链路具有1.7Mbps的频宽,20ms的传递延迟时间,DropTail的队列管理方式$ns duplex-link $s1 $r 2Mb 10ms DropTail
4、$ns duplex-link $s2 $r 2Mb 10ms DropTail$ns duplex-link $r $d 1.7Mb 20ms DropTail#设置r到d之间的Queue Limit为10个封包大小$ns queue-limit $r $d 10#设置结点的位置,这是要给NAM用的$ns duplex-link-op $s1 $r orient right-down$ns duplex-link-op $s2 $r orient right-up$ns duplex-link-op $r $d orient right#观测r到d之间queue的变化,这是要给NAM用的$n
5、s duplex-link-op $s1 $r queuePos 0.5#建立一条TCP的联机set tcp new Agent/TCP$ns attach-agent $s1 $tcpset sink new Agent/TCPSink$ns attach-agent $d $sink$ns connect $tcp $sink#在NAM中,TCP的联机会以蓝色表示$tcp set fid_1#在TCP联机之上建立FTP应用程序set ftp new Application/FTP$ftp attach-agent $tcp$ftp set type_FTP#建立一条UDP的联机set ud
6、p new Agent/UDP$ns attach-agent $s2 $udpset null new Agent/null$ns attach-agent $d $null$ns connect $udp $null#在NAM中,UDP的联机会以红色表示$tcp set fid_2#在UDP联机之上建立CBR应用程序set cbr new Application/CBR$cbr attach-agent $udp$cbr set type_CBR#设置传送封包的大小为1000byte$cbr set packet_size_1000#设置传送的速率为1Mbps$cbr set rate_1
7、mb$cbr set random_false#设置FTP和CBR数据传送开始和结束时间$ns at 0.1 “$cbr start”$ns at 1.0 “$ftp start”$ns at 4.0 “$ftp stop”$ns at 4.5 “$cbr stop”#结束TCP的联机(不一定需要写下面的程序代码来实际结束联机)$ns at 4.5 “$ns detach-agent $s1 $tcp; $ns detach-agent $d $sink”#在模拟环境中,5s后去调用finish来结束模拟(这样要注意模拟环境中的5s并不一定等#于实际模拟的时间)#执行模拟3.执行方法在执行此T
8、CL script时,请先进入绘图模式。($是在cygwin下的提示符号)$ startxwin.bat$ ns lab3.tcl4.执行结果 在与lab3.tcl同一个目录下会产生一个out.tr(仿真过程记录文件)和一个out.nam(NAM记录文件),另外会打开两个新窗口(图略)。5.执行NAM,观察网络仿真的过程(图略)。五、分析模拟结果1.仿真过程记录文件内容与格式 模拟结束后,除了使用NAM观看模拟的过程,另外就是使用仿真过程记录文件去做一些数值的分析,因此这个记录文件很重要,所以需要先了解这些记录文件中记录的格式。 以下是out.tr的部分记录+ 0.108 1 2 cbr 10
9、00 2 1.0 3.1 1 1- 0.108 1 2 cbr 1000 2 1.0 3.1 1 1r 0.114 1 2 cbr 1000 2 1.0 3.1 0 0+ 0.114 1 2 cbr 1000 2 1.0 3.1 0 0Eventtimefromnodetopkttypesizeflagsfidsrcaddrdstseqnumpkt idr :receive (at to_node);+ :enqueue (at queue);- :dequeue (at queue);d :drop (at queue);src_addr :node.port;dst_addr :node.
10、port. 每一笔记录的开始都是封包事件发生的原因,若是“r”,则表示封包被某个结点所接收;若是“+”则表示进入了队列;若是“”则表示离开队列;若是“d”则表示封包被队列所丢弃。接着的第二个字段表示的是事件发生的时间;字段三和字段四表示事件发生的地点(从from node到to node);字段五表示封包的类型;字段六是封包的大小,字段七是封包的标记标注;字段八表示封包是属于哪一个数据流;字段九和字段十表示封包的来源端和目的端,这两个字段的格式是a.b,a代表结点编号,b表示端口号(Port Number);字段十一表示封包的序号;字段十二表示封包的id。 以前面仿真过程记录文件的第一笔为例,
11、意思说有一个封包packet id为1,数据流id为2,序号为1,长度为1000bytes,类型为CBR,它是从来源端1.0要到目的地3.1,在时间0.1s的时候,从结点1(s2)进入了结点2(r)的队列中。2.端点到端点的延迟(End-to-End Delay)#这是测量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_
12、no=$11; packet_id=$12;#记录目前最高的packet ID if (packet_id highest_packet_id) highest_packet_id=packet_id;#记录封包的传送时间 if (start_timepacket_id=0) start_timepacket_id=time;#记录CBR(flow_id=2)的接收时间 if (flow_id=2 & action!= “d”) if (action= “r”) end_timepacket_id=time;else #把不是flow_id=2的封包或者是flow_id=2但此封包被drop的
13、时间设为1 end_timepacket_id=-1;END#当数据行全部读取完后,开始计算有效封包的端点到端点的延迟时间 for (packet_id=0;packet_id=highest_packet_id;packet_id+) start=start_timepacket_id; end=end_timepacket_id; packet_duration=end start;#只把接收时间大于传送时间的记录列出来 if(startcbr_delay3.抖动率(Jitter) 抖动率就是延迟时间变化量(Delay Variance),由于网络的流量随时都在变化,当流量大的时候,许多封
14、包就是必须在结点的队列中等待被传送,因此每个封包从传送端到目的地端的时间也不一定会相同,而这个不同的差异就是所谓的抖动率。抖动率越大,则表示网络越不稳定。#这是测量CBR封包jitter的awk程序#jitter=(recvtime(j) sendtime(j)-(recvtime(i)-sendtime(i)/(j-i),其中ji highest_packet_id) if (start_timepacket_id=0) #记录下包的seq_no pkt_seqnopacket_id=seq_no; #初始化jitter计算所需变量 last_seqno=0; last_delay=0; s
15、eqno_diff=0;#当数据列全部读取完后,开始计算有效封包的端点到端点的延迟时间end)#得到了delay值(packet_duration)后计算jitterseqno_diff=pkt_seqnopacket_id last_seqno;delay_diff=packet_duration last_delay;if (seqno_diff=0) jitter=0; jitter=delay_diff/seqno_diff;printf(“%f%fn”,start,jitter);last_seqno=pkt_seqnopacket_id;last_delay=packet_dura
16、tion;执行方法($为cygwin shell的提示符号)。$awk f measure-jitter.awk out.tr若要把结果存到文件中,可使用导向的方式,把结果存到cbr_jitter文件中。$awk f measure-jitter.awk out.trcbr_jitter执行结果:(略)4.封包遗失率(Packet Loss)#这是测量CBR封包遗失率的awk程序#程序初始化,设置一变量记录packet被drop的数目 fsDrops=0; numFs=0;#统计从n1送出多少packets if(from=1 & to=2 & action= “+”) numFs+;#统计f
17、low_id为2,且被drop的封包 if(flow_id=2 & action= “d”) fsDrops+;end printf(“number of packets sent:%d lost:%dn”,numFs,fsDrops);执行方式($为cygwin shell的提示符号)。 $awk f measure-loss.awk out.tr执行结果。 number of packets sent:550 lost:8这代表CBR送出了550个封包,但其中8个封包被丢掉了。5.吞吐量(Throughput)#这是测量CBR封包平均吞吐量(Average Throughput)的awk程
18、序 init=0; i=0;action=$1; if (action= “r” & from=2 & to=3 & flow_id=2) pkt_byte_sumi+1=pkt_byte_sumi+pktsize; if (init=0) start_time=time; init=1; end_timei=time; i=i+1;#为了画图好看,把第一笔记录的throughput设为零,以表示传输开始 printf(“%.2ft%.2fn”,end_time0,0); for (j=i;ji;j+)#单位为kbps th=pkt_byte_sumj/(end_timej-start_time)*8/1000; printf(“%.2ft%.2fn”,end_time,th); printf(“%.2ft%.2fn”,end_timei-1,0); $awk f measure-throughput.awk out.tr注:利用绘图工具gnuplot呈现模拟结果。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1