您现在的位置是:首页 > 服务器服务器
基于Tcl语言配置简单网络环境过程解析
2022-06-26 08:34:07服务器0人已围观
简介这篇文章主要介绍了基于Tcl语言配置简单网络环境过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
1. Tcl脚本文件circle.tcl代码注释
#设定模拟需要的一些属性set val(chan) Channel/WirelessChannelset val(prop) Propagation/TwoRayGroundset val(netif) Phy/WirelessPhyset val(mac) Mac/802_11#将协议设置为 DSR 后,同时将队列设置为 CMUPriQueueset val(ifq) CMUPriQueueset val(ll) LLset val(ant) Antenna/OmniAntennaset val(ifqlen) 50#将节点个数预设为 0,待用户输入。此项要求用户一定输入,否则不执行模拟。set val(nn) 0set val(rp) DSR#场景大小默认值为 1000*1000set val(x) 1000set val(y) 1000#圆的半径缺省值为 400set val(r) 400#该过程用于在屏幕上打印在终端输入 ns circle.tcl 后添加参数的格式proc usage {} { global argv0 puts "\nusage: $argv0 \[-nn nodes\] \[-r r\] \[-x x\] \[-y y\]\n" puts "note: \[-nn nodes\] is essential, and the others are optional.\n"}#该过程用来根据用户的输入更改一些预设参数的值proc getval {argc argv} { global val lappend vallist nn r x y z #argc 为参数的个数,argv 为整条参数构成的字符串 for {set i 0} {$i < $argc} {incr i} { #变量 arg 为 argv 的第 i 部分,以空格为分界 set arg [lindex $argv $i] #略过无字符“-”的字符串,一般是用户键入的数字 #string range $arg m n 表示取字符串$arg 的第 m 个字符到第 n 个字符 if {[string range $arg 0 0] != "-"} continue set name [string range $arg 1 end] #更改预设变量(节点个数,半径,场景大小) set val($name) [lindex $argv [expr $i+1]] }}#调用 getval 过程getval $argc $argv#用户没有输入参数,只键入了 ns circle.Tcl,则节点个数认为0if { $val(nn) == 0 } { #打印用法 usage exit}#创建模拟实例set ns [new Simulator]#设置记录文件set tracefd [open circle.tr w]$ns trace-all $tracefdset namtracefd [open circle.nam w]$ns namtrace-all-wireless $namtracefd $val(x) $val(y)#关闭trace文件并调用nam程序演示动画proc finish { } {global ns tracefd namtracefd$ns flush-traceclose $tracefdclose $namtracefdexec nam circle.nam &exit 0}set topo [new Topography]$topo load_flatgrid $val(x) $val(y)create-god $val(nn)#节点配置。由于版本原因,addressType设为def$ns node-config -addressType def\-adhocRouting $val(rp) \ -llType $val(ll) \ -macType $val(mac)\ -ifqType $val(ifq) \ -ifqLen $val(ifqlen) \ -antType $val(ant) \ -propType $val(prop) \ -phyType $val(netif) \ -channelType $val(chan) \ -topoInstance $topo \ -agenttrace ON \ -routertrace ON \ -mactrace OFF \ -movementtrace OFF#初始化节点for {set i 0} {$i < $val(nn)} {incr i} {#创建节点set node_($i) [$ns node]$node_($i) random-motion 0#计算节点位置并设置,使用三角函数进行计算$node_($i) set X_ [expr $val(r) * cos($i * 2 * 3.14159 / $val(nn))] $node_($i) set Y_ [expr $val(r) * sin($i * 2 * 3.14159 / $val(nn))]$node_($i) set Z_ 0#设置在nam中移动节点显示大小,否则,nam中无法显示节点$ns initial_node_pos $node_($i) [expr $val(x) / 10]}#在node_(0)节点上建立一个UDP代理set tcp [new Agent/UDP]$ns attach-agent $node_(0) $tcp#在node(0)节点沿直径对面的节点上建立一个数据接收器set null [new Agent/Null]$ns attach-agent $node_([expr $val(nn)/2]) $null#新建CBR流量发生器,分组大小500B,间隔0.05sset cbr [new Application/Traffic/CBR]$cbr set packetSize_ 5000$cbr set interval_ 0.05#连接UDP和Null$cbr attach-agent $tcp$ns connect $tcp $null#在0.1s时发送数据,3.0s时停止发送数据,5.0s时调用finish过程$ns at 0.1 "$cbr start"$ns at 3.0 "$cbr stop"$ns at 5.0 "finish"$ns run
2. gawk脚本代码analysis.awk注释
BEGIN {#设置初始变量num_D = 0;#丢包数num_s = 0;#发送包数num_r = 0;#收到包数rate_drop = 0;#丢包率sum_delay = 0;#总延迟时间average_delay = 0;#平均延迟时间}{#读取trace文件记录event = $1;#第一列为包的操作(s为发送包,r为接收包)time = $2;#第二列为操作时间node = $3;#第三列为节点号trace_type = $4;#第四列为操作层flag = $5;#第五列为标志位uid = $6;#第六列为节点标识pkt_type = $7;#第七列为包类型pkt_size = $8;#第八列为包的大小#操作if (event == "s" && trace_type == "AGT" && pkt_type == "cbr"){send_time[uid] = time;#创建数组记录发包时间num_s++;#记录发送包总数}if (event == "r" && trace_type == "AGT" && pkt_type =="cbr"){delay[uid] = time - send_time[uid];#创建数组记录延迟时间num_r++;#记录收到包总数}if (event == "D" && pkt_type == "cbr")delay[uid] = -1;#-1表示包丢失,该包不会记入延迟时间}END {#计算丢包数和丢包率num_D =num_s-num_r;#丢包总数rate_drop = num_D / num_s * 100.0;#计算丢包率#计算延迟for ( i = 0; i < num_s; i++){if (delay[i] >= 0)sum_delay += delay[i];}#总延迟时间average_delay = sum_delay / num_r;#平均延迟时间#打印结果printf("number of packets droped: %d \n",num_D);printf("number of packets sent: %d \n",num_s);printf("drop rate: %.3f%% \n",rate_drop);printf("average delay time: %.9f \n",average_delay);}
3. 实验结果
(1)
将网络节点数设置为12,运行结果如下,生成了两个记录文件nam文件和trace文件。
此时的trace文件大小为91.8kb,nam文件大小为76.0kb。
接下来通过gawk工具对生成的trace文件进行分析。如果没有安装gawk工具,使用命令sudo apt-get install gawk进行安装。
结果得到网络模拟过程的丢包数、发包数、丢包率和平均延时。
(2)重新修改节点数为8,运行结果如下,但此时文件夹中并没有新增额外的circle.nam和circle.tr文件。
查看两文件的属性,发现大小发生了改变,说明应该是新建的网络模拟环境的记录文件发生了覆盖。
同样适用gawk对生成的trace文件进行分析。发现随着网络节点数的增加,导致丢包率和平均延时都增加了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持技术员网。
很赞哦! ()
相关文章
随机图文
Linux ftp 命令行中下载文件get与上传文件put的命令应用详解
这篇文章主要介绍了Linux ftp 命令行中下载文件get与上传文件put的命令应用详解,需要的朋友可以参考下Nginx配置本地图片服务器的实现
本文主要介绍了Nginx配置本地图片服务器的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下nginx实现动静分离的方法示例
Nginx的静态处理能力很强,但是动态处理能力不足,因此,在企业中常用动静分离技术,本文就详细的介绍一下如何使用,感兴趣的可以了解一下VPS搭建离线下载服务器(后网盘时代)
这篇文章利用vps来搭建自己的离线下载服务器,这样既能利用多余的带宽资源,又能提高下载速度,需要的朋友可以参考下
留言与评论 (共有 条评论) |