创建拓扑
在ns-2.35/indep-utils/cmu-scen-gen/setdest目录下,用setdes工具生成网络移动场景
./setdest -n100 -p 100.0 -M 10.0 -t 100 -x 300 -y 300 >scene_100n_100p_10M_100t_300_300
-n:节点数,
-p:某节点到达目的之后停留时间,
-M:指定节点随机移动时速度最大值,单位m/s,
-t:仿真持续时间,
-x:节点移动区域的长度
-y:节点移动区域的宽度
创建数据流:
在/ns-2.35/indep-utils/cmu-scen-gen目录下,用cbrgen来生成网络负载,文件名为scene_100n_100p_10M_100t_300_300。
ns cbrgen.tcl -type cbr -nn 100 -seed 1 -mc 10 -rate 10.0>cbr_n100_m10_r10
-type:数据流的类型,cbr流或tcp流
-nn:节点数
-seed:随机数
-mc:最大连接数量
-rete:源节点每秒发送的数据分组数量
tcl文件:
proc getopt { argc argv } {
global opt
lappend optlist nn
for {set i 0} {$i < $argc} { incr i } {
set opt($i) [lindex $argv $i]
}
}
getopt $argc $argv
# 参数设置
set opt(chan) Channel/WirelessChannel ;# channel type
set opt(prop) Propagation/TwoRayGround ;# radio-propagation model
set opt(netif) Phy/WirelessPhy ;# network interface type
set opt(mac) Mac/802_11 ;# MAC type
#若使用的DSR 所使用的接口队列类型则用CMUPriQueue
if { $opt(0) == "DSR"} {
set opt(ifq) CMUPriQueue
} else {
set opt(ifq) Queue/DropTail/PriQueue
}
set opt(ll) LL ;# link layer type
set opt(ant) Antenna/OmniAntenna ;# antenna model
set opt(x) 500 ;# X dimension of topography
set opt(y) 500 ;# Y dimension of topography
set opt(ifqlen) 2000 ;# max packet in ifq
set opt(seed) 0.0
#设置trace file
set opt(tr) trace1.tr ;#trace file
set namtrace [open test.nam w]
set opt(adhocRouting) $opt(0)
set opt(nn) 100
#设置traffic pattren文件
set opt(cp) "cbr_n100_m10_r10"
#设置节点移动场景
set opt(sc) "scene_100n_100p_10M_100t_300_300"
set opt(stop) 100.0 ;# time of simulation end
Mac/802_11 set CWMin_ 31
Mac/802_11 set CWMax_ 1023
Mac/802_11 set SlotTime_ 0.000020 ;# 20us
Mac/802_11 set SIFS_ 0.000010 ;# 10us
Mac/802_11 set PreambleLength_ 144 ;# 144 bit
Mac/802_11 set PreambleDataRate_ 1.0e6 ;# 1Mbps
Mac/802_11 set PLCPHeaderLength_ 48 ;# 48 bits
Mac/802_11 set PLCPDataRate_ 1.0e6 ;# 1Mbps
Mac/802_11 set RTSThreshold_ 3000 ;# bytes Disable RTS/CTS
Mac/802_11 set ShortRetryLimit_ 7 ;# retransmissions
Mac/802_11 set LongRetryLimit_ 4 ;# retransmissions
Mac/802_11 set dataRate_ 2Mb ;# 802.11 data transmission rate
Mac/802_11 set basicRate_ 1Mb ;# 802.11 basic transmission rate
set ns_ [new Simulator]
# set up topography object
set wtopo [new Topography]
set tracefd [open $opt(tr) w]
$ns_ trace-all $tracefd
$ns_ namtrace-all-wireless $namtrace $opt(x) $opt(y)
$wtopo load_flatgrid $opt(x) $opt(y)
set god_ [create-god $opt(nn)]
set chan_1_ [new $opt(chan) ]
# configure the nodes
$ns_ node-config -adhocRouting $opt(adhocRouting) \
-llType $opt(ll) \
-macType $opt(mac) \
-ifqType $opt(ifq) \
-ifqLen $opt(ifqlen) \
-antType $opt(ant) \
-propType $opt(prop) \
-phyType $opt(netif) \
-channel $chan_1_ \
-topoInstance $wtopo \
-agentTrace ON \
-routerTrace ON \
-macTrace OFF
for {set i 0} {$i <$opt(nn) } { incr i } {
set node_($i) [$ns_ node]
$node_($i) random-motion 0
}
#设置节点移动模式
puts "Loading connection pattern..."
#使用source去加载traffic pattern
source $opt(cp)
#设置联机传输模式
puts "Loading scenario file..."
#使用source去加载节点移动场景文件
source $opt(sc)
# Define node initial position in nam
for {set i 0} {$i<$opt(nn)} { incr i } {
# 30 defines the node size for nam
$ns_ initial_node_pos $node_($i) 20
}
# Telling nodes when the simulation ends
for {set i 0} {$i < $opt(nn) } { incr i } {
$ns_ at $opt(stop).1 "$node_($i) reset";
}
# ending nam and the simulation
$ns_ at $opt(stop) "$ns_ nam-end-wireless $opt(stop)"
$ns_ at $opt(stop).1 "puts \"ns exiting...\" ; $ns_ halt"
proc stop {} {
global ns tracefd namtrace
$ns_ flush-trace
close $tracefd
close $namtrace
exec nam test.nam &
exit 0
}
$ns_ run
实现方式:ns lab23.tcl AODV
awk分析文件:
awk文件分析路由协议发送的封包总数、接收的封包总数、封包接收率和平均端到端延迟以及第一个封包的接收时间。
#BEGIN表明这是程序开头执行的一段语句,且只执行一次。
BEGIN {
#程序初始化,设定一变量以记录目前处理的封包的最大ID号码。在awk环境下变量的使用不需要声明,直接赋值。
highest_packet_id = 0;
sends = 0;
receives = 0;
routing_packets = 0;
first_received_time = 0;
first = 0;
}
#下面大括号里面的内容会针对要进行处理的记录(也就是我们的trace文件)的每一行都重复执行一次
{
action = $1; #$1表示一行的第一栏,是事件的动作。每一栏默认是以空格分隔的。下同。
time = $2; #事件发生的时间
trace = $4; #trace文件跟踪事件的层次(指在路由层或mac层等等)
packet_id = $6;
type = $7;
if ( action=="s"||action == "r" || action == "f" )
{
if( action == "s" && trace =="AGT" && type=="cbr")
{sends++;}
if( packet_id> highest_packet_id )
{highest_packet_id = packet_id;}
if( start_time[packet_id] ==0 )
{ start_time[packet_id] = time;}
if( action == "r" && trace =="AGT" && type=="cbr")
{
if( first == 0){
first_received_time = time;
first=1;
}
receives++;
end_time[packet_id]=time;
}
else
end_time[packet_id]=-1;
}
}
END{
for(packet_id=0;packet_id<=highest_packet_id;packet_id++){
packet_duration=end_time[packet_id]-start_time[packet_id];
if( packet_duration>0 ) end_to_end_delay+= packet_duration;
}
avg_end_to_end_delay=end_to_end_delay/(receives);
pdfraction = (receives/sends)*100;
printf("Total packet sends: %d\n",sends);
printf("Total packet receives: %d\n",receives);
printf("Packet delivery fraction: %s\n",pdfraction);
printf("avg_end_to_end_delay: %f s\n",avg_end_to_end_delay);
printf("first packet recevied time: %f s\n",first_received_time);
}
执行语句:awk -f parse.awk trace1.tr