1. Tcl腳本文件circle.tcl代碼注釋
#設(shè)定模擬需要的一些屬性
set val(chan) Channel/WirelessChannel
set val(prop) Propagation/TwoRayGround
set val(netif) Phy/WirelessPhy
set val(mac) Mac/802_11
#將協(xié)議設(shè)置為 DSR 后,同時(shí)將隊(duì)列設(shè)置為 CMUPriQueue
set val(ifq) CMUPriQueue
set val(ll) LL
set val(ant) Antenna/OmniAntenna
set val(ifqlen) 50
#將節(jié)點(diǎn)個(gè)數(shù)預(yù)設(shè)為 0,待用戶(hù)輸入。此項(xiàng)要求用戶(hù)一定輸入,否則不執(zhí)行模擬。
set val(nn) 0
set val(rp) DSR
#場(chǎng)景大小默認(rèn)值為 1000*1000
set val(x) 1000
set val(y) 1000
#圓的半徑缺省值為 400
set val(r) 400
#該過(guò)程用于在屏幕上打印在終端輸入 ns circle.tcl 后添加參數(shù)的格式
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"
}
#該過(guò)程用來(lái)根據(jù)用戶(hù)的輸入更改一些預(yù)設(shè)參數(shù)的值
proc getval {argc argv} {
global val
lappend vallist nn r x y z
#argc 為參數(shù)的個(gè)數(shù),argv 為整條參數(shù)構(gòu)成的字符串
for {set i 0} {$i < $argc} {incr i} {
#變量 arg 為 argv 的第 i 部分,以空格為分界
set arg [lindex $argv $i]
#略過(guò)無(wú)字符“-”的字符串,一般是用戶(hù)鍵入的數(shù)字
#string range $arg m n 表示取字符串$arg 的第 m 個(gè)字符到第 n 個(gè)字符
if {[string range $arg 0 0] != "-"} continue
set name [string range $arg 1 end]
#更改預(yù)設(shè)變量(節(jié)點(diǎn)個(gè)數(shù),半徑,場(chǎng)景大小)
set val($name) [lindex $argv [expr $i+1]]
}
}
#調(diào)用 getval 過(guò)程
getval $argc $argv
#用戶(hù)沒(méi)有輸入?yún)?shù),只鍵入了 ns circle.Tcl,則節(jié)點(diǎn)個(gè)數(shù)認(rèn)為0
if { $val(nn) == 0 } {
#打印用法
usage
exit
}
#創(chuàng)建模擬實(shí)例
set ns [new Simulator]
#設(shè)置記錄文件
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)
#關(guān)閉trace文件并調(diào)用nam程序演示動(dòng)畫(huà)
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)
#節(jié)點(diǎn)配置。由于版本原因,addressType設(shè)為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
#初始化節(jié)點(diǎn)
for {set i 0} {$i < $val(nn)} {incr i} {
#創(chuàng)建節(jié)點(diǎn)
set node_($i) [$ns node]
$node_($i) random-motion 0
#計(jì)算節(jié)點(diǎn)位置并設(shè)置,使用三角函數(shù)進(jìn)行計(jì)算
$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
#設(shè)置在nam中移動(dòng)節(jié)點(diǎn)顯示大小,否則,nam中無(wú)法顯示節(jié)點(diǎn)
$ns initial_node_pos $node_($i) [expr $val(x) / 10]
}
#在node_(0)節(jié)點(diǎn)上建立一個(gè)UDP代理
set tcp [new Agent/UDP]
$ns attach-agent $node_(0) $tcp
#在node(0)節(jié)點(diǎn)沿直徑對(duì)面的節(jié)點(diǎn)上建立一個(gè)數(shù)據(jù)接收器
set null [new Agent/Null]
$ns attach-agent $node_([expr $val(nn)/2]) $null
#新建CBR流量發(fā)生器,分組大小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時(shí)發(fā)送數(shù)據(jù),3.0s時(shí)停止發(fā)送數(shù)據(jù),5.0s時(shí)調(diào)用finish過(guò)程
$ns at 0.1 "$cbr start"
$ns at 3.0 "$cbr stop"
$ns at 5.0 "finish"
$ns run
2. gawk腳本代碼analysis.awk注釋
BEGIN {
#設(shè)置初始變量
num_D = 0; #丟包數(shù)
num_s = 0; #發(fā)送包數(shù)
num_r = 0 ; #收到包數(shù)
rate_drop = 0; #丟包率
sum_delay = 0; #總延遲時(shí)間
average_delay = 0; #平均延遲時(shí)間
}
{
#讀取trace文件記錄
event = $1; #第一列為包的操作(s為發(fā)送包,r為接收包)
time = $2; #第二列為操作時(shí)間
node = $3; #第三列為節(jié)點(diǎn)號(hào)
trace_type = $4; #第四列為操作層
flag = $5; #第五列為標(biāo)志位
uid = $6; #第六列為節(jié)點(diǎn)標(biāo)識(shí)
pkt_type = $7; #第七列為包類(lèi)型
pkt_size = $8; #第八列為包的大小
#操作
if (event == "s" && trace_type == "AGT" && pkt_type == "cbr")
{ send_time[uid] = time; #創(chuàng)建數(shù)組記錄發(fā)包時(shí)間
num_s++; #記錄發(fā)送包總數(shù)
}
if (event == "r" && trace_type == "AGT" && pkt_type =="cbr")
{ delay[uid] = time - send_time[uid]; #創(chuàng)建數(shù)組記錄延遲時(shí)間
num_r++; #記錄收到包總數(shù)
}
if (event == "D" && pkt_type == "cbr")
delay[uid] = -1; #-1表示包丟失,該包不會(huì)記入延遲時(shí)間
}
END {
#計(jì)算丟包數(shù)和丟包率
num_D =num_s-num_r; #丟包總數(shù)
rate_drop = num_D / num_s * 100.0; #計(jì)算丟包率
#計(jì)算延遲
for ( i = 0; i < num_s; i++)
{if (delay[i] >= 0)
sum_delay += delay[i];
}#總延遲時(shí)間
average_delay = sum_delay / num_r; #平均延遲時(shí)間
#打印結(jié)果
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. 實(shí)驗(yàn)結(jié)果
(1)
將網(wǎng)絡(luò)節(jié)點(diǎn)數(shù)設(shè)置為12,運(yùn)行結(jié)果如下,生成了兩個(gè)記錄文件nam文件和trace文件。
![](/d/20211016/6f86222cc06716b8b7707bd047f0d899.gif)
此時(shí)的trace文件大小為91.8kb,nam文件大小為76.0kb。
![](/d/20211016/131d84188c54900c78da7bfd177f3325.gif)
![](/d/20211016/80e338f2f3954465d3c24371e3493e3f.gif)
接下來(lái)通過(guò)gawk工具對(duì)生成的trace文件進(jìn)行分析。如果沒(méi)有安裝gawk工具,使用命令sudo apt-get install gawk進(jìn)行安裝。
結(jié)果得到網(wǎng)絡(luò)模擬過(guò)程的丟包數(shù)、發(fā)包數(shù)、丟包率和平均延時(shí)。
![](/d/20211016/8ead9a37dbb910dddaa580bce29be1a4.gif)
(2)重新修改節(jié)點(diǎn)數(shù)為8,運(yùn)行結(jié)果如下,但此時(shí)文件夾中并沒(méi)有新增額外的circle.nam和circle.tr文件。
![](/d/20211016/de65bd5bd9b78c20f11c2f1136a03eb9.gif)
查看兩文件的屬性,發(fā)現(xiàn)大小發(fā)生了改變,說(shuō)明應(yīng)該是新建的網(wǎng)絡(luò)模擬環(huán)境的記錄文件發(fā)生了覆蓋。
![](/d/20211016/9fd80d538c41643c2168d6fb9e03c4b6.gif)
![](/d/20211016/ac73314c23800fc2238e917591a5ca64.gif)
同樣適用gawk對(duì)生成的trace文件進(jìn)行分析。發(fā)現(xiàn)隨著網(wǎng)絡(luò)節(jié)點(diǎn)數(shù)的增加,導(dǎo)致丟包率和平均延時(shí)都增加了。
![](/d/20211016/70a90f875ecf3ac8451dc1cb4e06debb.gif)
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。