• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    基于Tcl语言配置简单网络环境过程解析

    1. Tcl脚本文件circle.tcl代码注释

    #设定模拟需要的一些属性
    set val(chan) Channel/WirelessChannel
    set val(prop) Propagation/TwoRayGround
    set val(netif) Phy/WirelessPhy
    set val(mac) Mac/802_11
    #将协议设置为 DSR 后,同时将队列设置为 CMUPriQueue
    set val(ifq) CMUPriQueue
    set val(ll) LL
    set val(ant) Antenna/OmniAntenna
    set val(ifqlen) 50
    #将节点个数预设为 0,待用户输入。此项要求用户一定输入,否则不执行模拟。
    set val(nn) 0
    set val(rp) DSR
    #场景大小默认值为 1000*1000
    set val(x) 1000
    set val(y) 1000
    #圆的半径缺省值为 400
    set 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,则节点个数认为0
    if { $val(nn) == 0 } {
      #打印用法
      usage
      exit
    }
    
    #创建模拟实例
    set ns [new Simulator]
    
    #设置记录文件
    set tracefd [open circle.tr w]
    $ns trace-all $tracefd
    set namtracefd [open circle.nam w]
    $ns namtrace-all-wireless $namtracefd $val(x) $val(y)
    
    #关闭trace文件并调用nam程序演示动画
    proc finish { } {
    	global ns tracefd namtracefd
    	$ns flush-trace
    	close $tracefd
    	close $namtracefd
    	exec 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.05s
    set 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重定向用法
    下一篇:VMware虚拟机三种连接方式实例解析
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

    基于Tcl语言配置简单网络环境过程解析 基于,Tcl,语言,配置,简单,