1. 首页
  2. 技术知识

基于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)节点上建立一个UDPX

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 run2. gawk脚本代码аnalysis.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
>= 0)
                        sum_delay += delay;
                }#总延迟时间
        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文件进行分析。发现随着网络节点数的增加,导致丢包率和平均延时都增加了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持共生网络。

原创文章,作者:starterknow,如若转载,请注明出处:https://www.starterknow.com/107432.html

联系我们