服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - 编程技术 - 基于Tcl语言配置简单网络环境过程解析

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

2020-09-09 20:51Sno_W_olF 编程技术

这篇文章主要介绍了基于Tcl语言配置简单网络环境过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#设定模拟需要的一些属性
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注释

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
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文件。

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

此时的trace文件大小为91.8kb,nam文件大小为76.0kb。

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

接下来通过gawk工具对生成的trace文件进行分析。如果没有安装gawk工具,使用命令sudo apt-get install gawk进行安装。
  结果得到网络模拟过程的丢包数、发包数、丢包率和平均延时。

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

(2)重新修改节点数为8,运行结果如下,但此时文件夹中并没有新增额外的circle.nam和circle.tr文件。

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

查看两文件的属性,发现大小发生了改变,说明应该是新建的网络模拟环境的记录文件发生了覆盖。

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

同样适用gawk对生成的trace文件进行分析。发现随着网络节点数的增加,导致丢包率和平均延时都增加了。

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://www.cnblogs.com/Sno-W-olF/p/13379343.html

延伸 · 阅读

精彩推荐