NS2 入门实例 1---有线网络,两节点(UDP 连接,CBR 应用)
实例 1:
# 场景描述:
# 两个节点 n0 和 n1 ,之间有一条 UDP 连接,
# 设置 CBR 应用,用作数据流发生器
# 模拟时间 5s
#建立一个 Simulator 对象, 并赋值给 ns, 用作模拟过程的时间调度
set ns [new Simulator]
#设置 trace 文件和 Nam 文件, trace 记录整个模拟过程的记录,
#Nam 用于 Nam 的动画显示
set tracefd [open example1.tr w]
$ns trace-all $tracefd
set namtracefd [open example1.nam w]
$ns namtrace-all $namtracefd
#定义结束过程, 将事件写入 trace, 并关闭相关文件, 最后启动 Nam 进行动
画显示
proc finish {} {
global ns tracefd namtracefd
$ns flush-trace
close $tracefd
close $namtracefd
exec nam example1.nam &
exit 0
}
#创建两个节点 n0 和 n1
set n0 [$ns node]
set n1 [$ns node]
#添加一条双向的连接, 传输速率: 1Mb, 时延: 10ms,
#队列管理方式: DropTail(丢弃尾部!)
$ns duplex-link $n0 $n1 1Mb 10ms DropTail
#创建 UDP Agent 发送端, 并与 n0 节点关联
set udp0 [new Agent/UDP]
$ns attach-agent $n0 $udp0
#创建 Null, 作为 UDP 的接收端,与 n1 关联
#Null:只接受, 不回复 ACK (与 TCP 和 TCPSink 的区别)
set null0 [new Agent/Null]
$ns attach-agent $n1 $null0
#连接 UDP 和 NULL,形成一条有开始和结束的数据通路
$ns connect $udp0 $null0
#添加 CBR 应用,绑定到 UDP Agent 上, 并设置发包属性
#CBR: 是一个流量发生器
set cbr0 [new Application/Traffic/CBR]
$cbr0 set packetSize_ 500
$cbr0 set interval_ 0.005
$cbr0 attach-agent $udp0
#设置 CBR 的起停, 使整个模拟过程开始
$ns at 0.5 "$cbr0 start"
$ns at 4.5 "$cbr0 stop"
$ns at 5.0 "finish"
$ns run
运行结果:(节点 0 和 1 之间有 UDP 连接,运行 CBR 应用。)
NS2 入门实例 2---无线网络,两节点(TCP 连接,FTP 应用)
Channel/WirelessChannel
Propagation/TwoRayGround ;# radio-propagation model
Phy/WirelessPhy
Mac/802_11
#场景描述:
#无线网络中,两个节点 node_(0) 和 node_(1), TCP+FTP, 并且设置了节点的移动
#======================================================
=====================
# 无线节点的参数设置
#======================================================
=====================
set val(chan)
set val(prop)
set val(netif)
set val(mac)
set val(ifq)
set val(ll)
set val(ant)
set val(ifqlen)
set val(nn)
set val(rp)
set val(x)
set val(y)
#======================================================
======================
Antenna/OmniAntenna
50
2
AODV
500
500
;# X dimension of the topography
;# Y dimension of the topography
Queue/DropTail/PriQueue
LL
;# link layer type
;# interface queue type
;# network interface type
;# MAC type
;# channel type
;# antenna model
;# max packet in ifq
;# number of mobilenodes
;# routing protocol
# 创建 Simulator 对象,用于模拟过程的事件调度
set ns [new Simulator]
#设置相关记录文件
set tracefd [open example2.tr w]
$ns trace-all $tracefd
set namtracefd [open example2.nam w]
# 注意: 与有线场景的命令有差别哦!
$ns namtrace-all-wireless $namtracefd $val(x) $val(y)
# 设置模拟结束时的操作, 将记录写入文件,并关闭文件, 最后启动 NAM 进行动画显示
proc finish {} {
global ns tracefd namtracefd
$ns flush-trace
close $tracefd
close $namtracefd
exec nam example2.nam &
exit 0
}
# 建立一个 Topography 对象,该对象保证移动节点会在拓扑边界范围内运动
set topo [new Topography]
# 500 X 500 的边界
$topo load_flatgrid $val(x) $val(y)
# God 对象主要用来对路由协议做性能评价,
# 它存储了: 节点的总数、各个节点间最短路径表等信息, 这些信息通常在模拟开始之前就计算好了!
# 节点的 MAC 对象会调用 God 对象, (初学者没必要关心!)
create-god $val(nn)
$ns node-config -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
# 创建两个节点,存储在数组 Node 中,
for {set i 0} {$i < $val(nn) } {incr i} {
set node_($i) [$ns node]
$node_($i) random-motion 0 ;# disable random motion
}
#设置节点的物理位置,一般第三位 Z_=0.0, 模拟过程实际上是在而为平面上的场景
$node_(0) set X_ 5.0
$node_(0) set Y_ 2.0
$node_(0) set Z_ 0.0
$node_(1) set X_ 390.0
$node_(1) set Y_ 385.0
$node_(1) set Z_ 0.0
#设置节点的移动, setdest 20.0 18.0 1.0: 向(20.0,18.0)位置以 1.0m/s 的速度移动!
$ns at 1.0 "$node_(0) setdest 20.0 18.0 1.0"
$ns at 5.0 "$node_(1) setdest 25.0 20.0 15.0"
$ns at 100.0 "$node_(1) setdest 490.0 480.0 15.0"
# 创建 TCP,及 TCP 对应的 TCPSink,并连接起来,最后在 TCP 连接上添加 FTP 应用
set tcp [new Agent/TCP]
$tcp set class_ 2
set sink [new Agent/TCPSink]
$ns attach-agent $node_(0) $tcp
$ns attach-agent $node_(1) $sink
$ns connect $tcp $sink
set ftp [new Application/FTP]
$ftp attach-agent $tcp
#设置 FTP 数据流的开始时间
$ns at 1.0 "$ftp start"
#模拟结束前调用各节点的 reset 函数, 无线场景中,一般照写就可!
for {set i 0} {$i < $val(nn) } {incr i} {
$ns at 150.0 "$node_($i) reset";
}
$ns at 150.0 "finish"
$ns run
运行结果:
请调整 NAM 右上角的时间按钮,可清洗地观察到 CP 慢启动过程哦!
NS2 入门实例 3---有线观察排队和丢包,三节点
(FTP/TCP+CBR/UDP)
实例 3:
# 场景描述:
# 主要用于观察数据包在节点 Agent 上的排队和丢包情况
# 有线场景,四个节点,FTT+TCP 用蓝色表示, CBR+UDP 用红色表示
set ns [new Simulator]
#设置颜色
$ns color 1 Blue
$ns color 2 Red
set tracefd [open out.tr w]
$ns trace-all $tracefd
set namtracefd [open out.nam w]
$ns namtrace-all $namtracefd
proc finish {} {
global ns tracefd namtracefd
$ns flush-trace
close $tracefd
close $namtracefd
exec nam out.nam &
exit 0
}
set n0 [$ns node]
set n1 [$ns node]
set n2 [$ns node]
set n3 [$ns node]
$ns duplex-link $n0 $n2 2Mb 10ms DropTail
$ns duplex-link $n1 $n2 2Mb 10ms DropTail
$ns duplex-link $n2 $n3 1.7Mb 10ms DropTail
$ns queue-limit $n2 $n3 10
#用于设置 NAM 显示时,各节点的相对位置
$ns duplex-link-op $n0 $n2 orient right-down
$ns duplex-link-op $n1 $n2 orient right-up
$ns duplex-link-op $n2 $n3 orient right
$ns duplex-link-op $n2 $n3 queuePos 0.5
set tcp [new Agent/TCP]
$tcp set class_ 2
$ns attach-agent $n0 $tcp
set sink [new Agent/TCPSink]
$ns attach-agent $n3 $sink
$ns connect $tcp $sink
$tcp set fid_ 1
set ftp [new Application/FTP]
$ftp attach-agent $tcp
$ftp set type_ FTP
set udp [new Agent/UDP]
$ns attach-agent $n1 $udp
set null [new Agent/Null]
$ns attach-agent $n3 $null
$ns connect $udp $null
$udp set fid_ 2
set cbr [new Application/Traffic/CBR]
$cbr attach-agent $udp
$cbr set type_ CBR
$cbr set packet_size_ 1000
$cbr set rate_ 1mb
$cbr set random_ false
$ns at 0.5 "$cbr start"
$ns at 1.0 "$ftp start"
$ns at 4.0 "$ftp stop"
$ns at 4.5 "$cbr stop"
#一下这一行可有可无!
$ns at 4.5 "$ns detach-agent $n0 $tcp ; $ns detach-agent $n3 $sink"
$ns at 5.0 "finish"
#会在命令窗口中输出, 因为默认的 stdout 是命令窗口啊!
puts "CBR packet size=[$cbr set packet_size_]"
puts "CBR interval=[$cbr set interval_]"
$ns run
运行结果:
只有 CBR 运行时: