在这里我们将学习动态网络的建立
1、建立拓扑
当节点很多的时候,我们可以使用循环的方式来建立拓扑。
for {set i 0} {$i < 7} {incr i} {set n($i) [$ns node]
}
这里的数组不需要事先声明。
2、建立链接
这里我们要把7个节点链成一个环儿,同样使用循环的方式建立。
for {set i 0} {$i < 7} {incr i} {$ns duplex-link $n($i) $n([expr ($i+1)%7]) 1Mb 10ms DropTail
}
3、关掉链接,动态路由
这里有个hin有意思的东西,我们可以通过修改代码使得特定的一段链路在一段的时间宕机。
$ns rtmodel-at 1.0 down $n(1) $n(2)
$ns rtmodel-at 2.0 up $n(1) $n(2)
n(1)和n(2)之间的链路在1.0~2.0s时候停止工作,发送出的包皆被丢弃。
我们可以使用动态路由的方式来解决上述问题。 在创建模拟器对象后,在Tcl脚本的开始处添加以下行。
$ns rtproto DV
再次启动仿真,首先看到许多小数据包通过网络运行。 点击其中一个,会看到他们是'rtProtoDV'数据包,用于在节点之间交换路由信息。 当链路在1.0秒钟再次下降时,路由将被更新,流量将通过节点6,5和4重新路由。
完整代码
#Create a simulator object
set ns [new Simulator]#Tell the simulator to use dynamic routing
$ns rtproto DV#Open the nam trace file
set nf [open out.nam w]
$ns namtrace-all $nf#Define a 'finish' procedure
proc finish {} {global ns nf$ns flush-trace#Close the trace fileclose $nf#Execute nam on the trace fileexec nam out.nam &exit 0
}#Create seven nodes
for {set i 0} {$i < 7} {incr i} {set n($i) [$ns node]
}#Create links between the nodes
for {set i 0} {$i < 7} {incr i} {$ns duplex-link $n($i) $n([expr ($i+1)%7]) 1Mb 10ms DropTail
}#Create a UDP agent and attach it to node n(0)
set udp0 [new Agent/UDP]
$ns attach-agent $n(0) $udp0# Create a CBR traffic source and attach it to udp0
set cbr0 [new Application/Traffic/CBR]
$cbr0 set packetSize_ 500
$cbr0 set interval_ 0.005
$cbr0 attach-agent $udp0#Create a Null agent (a traffic sink) and attach it to node n(3)
set null0 [new Agent/Null]
$ns attach-agent $n(3) $null0#Connect the traffic source with the traffic sink
$ns connect $udp0 $null0 #Schedule events for the CBR agent and the network dynamics
$ns at 0.5 "$cbr0 start"
$ns rtmodel-at 1.0 down $n(1) $n(2)
$ns rtmodel-at 2.0 up $n(1) $n(2)
$ns at 4.5 "$cbr0 stop"
#Call the finish procedure after 5 seconds of simulation time
$ns at 5.0 "finish"#Run the simulation
$ns run