2008年3月10日 星期一

實驗三 Network Scenario Generator(NSG)

這個實驗的目的是使用NSG自動產生模擬TCL程式碼
NSG是專為NS2所設計的劇本產生器
最新版本是第二版(NSG2)
支援有線和無線網路劇本
不過目前沒有支援無線及有線混合的劇本
(意思就是這部分要自己來吧!)
這裡我大概列一些NSG2主要的功能及支援NS2的物件種類:
1. 產生有線及無線網路的劇本
2. 支援的Node種類:WirelessNode及WiredNode
3. 支援WirelessNode的移動設定
4. 支援的Link種類:Duplex-link及Simplex-link
5. 支援Agent種類:TCP、TCP/Tahoe、TCP/Reno、TCP/Newreno
、TCP/Vegas、TCPSink、UDP及Null
6. 支援的Application種類:CBR及FTP
7. 支援的Routing protocol種類:DSDV、DSR、AODV及TORA
8. 支援的Queue種類:DropTail、RED、FQ、DRR、SFQ及CBQ
9. 無線網路相關設定
10. 802.11參數設定(NSG提供一組802.11b的預設參數)

NSG2也是和nsBench一樣是以Java撰寫的
所以可以在任何支援Java的平台上執行
NSG2是以Java Jar檔案的形式來發佈
所以NSG2本身不需要再做安裝的動作
因此我只要把它下載下來存在Cygwin的資料夾底下
這裡我要把它放在ns-allinone-2.29/ns-2.29/book2/lab3/
NSG2下載網址: http://wushoupong.googlepages.com/nsg
這部分作者所附的ns-allinone-2.29裡面已經有附了
所以可以不需要再下載NSG2
接下來在執行NSG2之前要先確認電腦中有安裝
Java Runtime Environment(JRE)或Java SE Development Kit(JDK)
以Windows作業系統為例,要確定電腦中是否已安裝Java
在附屬應用程式的”DOS命令提示字元”輸入「java -version」
如果已經安裝過Java的話螢幕就會顯示所安裝的Java版本
下面的這個畫面顯示電腦中的Java版本是”1.5.0_03”
既然已經有裝了,所以我打算不再安裝
另外,如果電腦中沒有安裝JRE或JDK,也可以在Sun的
Java的網站上下載最新版本的JRE或JDK,
Sun的Java官方網站:http://java.sun.com/javase/downloads/index.jsp

在使用NSG2之前先大概介紹一下NSG2的五種模式
1. Hand mode
這個模式是可以調整要觀看的範圍,也就是可以調整顯示比例
2. Node mode
使用者可配置Node的位置,NSG2會根據所設定的Node相關
位置來配置NAM中Node的位置,在有線網路劇本的座標不影響
模擬結果;但是在無線網路劇本上,Node的座標就變得很重要,
因為座標會影響到傳輸範圍、訊號強度以及Routing protocol等。
NSG2會假設無線網路Node的傳輸距離為250m,所以當二個Node
的傳輸距離在250m以內時,NSG2會在二者之間畫一條連線,使
用者可以用滑鼠調整Node要擺放的位置。另外Node mode還提
供一次產生多個Node的方式。
3. Link mode
這個模式只適用有線網路劇本,無線網路劇本不需要,在這
個模式可以用來設定Node和Node間的鏈路相關參數。
4. Agent mode
這個模式是設定Node上的通訊協定,目前NSG2主要支援
TCP(包含多種版本)和UDP通訊協定,設定方式很簡單,先滑鼠
左鍵點要附加的Node,然後選要的Agent。這個模式除了設定
Agent所附的Node,還可以設定傳送端和接收端,一般來說NS2
的TCP對應TCPSink,UDP對應Null,如果沒有配對好,產生TCL
劇本檔時會忽略沒配對好的Agent。另外,還能用滑鼠右鍵的彈
出式選單的設定。
5. Application mode
這個模式設定最上層的應用程式,如CBR和FTP,使用方法
和Agent mode差不多。
最後除了上面這五種模式之外,還有參數設定(Parameter)的功能,
在有線網路劇本時,參數設定包含模擬時間和Trace檔的名稱(包括
NAM的Trace檔),在建立無線網路劇本時,除了上述設定之外還多
了無線網路(Wireless)及頻道特性(Channel)的相關設定。這裡NSG2
提供一組模擬802.11b的參考值,預設的情況下不會啟用,要啟用
的話要自己開啟,不過也是可以自己設定新的值。
全部都設好之後就可以按下TCL按鈕產生TCL劇本檔,這時候
還是可以自行在劇本檔上做一些調整,調整好後再存檔用NS2執行

※當參數設定-1,表示在產生TCL劇本檔時NSG2會忽略這個參數,
另外,NSG2不會去檢查參數的正確性,如果輸入不對NSG2還是會
照著輸入的值寫到TCL檔中。

現在就開始來實際操作吧!
要啟動NSG2,先開啟Cygwin,然後切換到NSG2程式的存放目錄
(ns-allinone-2.29/ns-2.29/book2/lab3/),輸入「java –jar NSG2.jar」
一開始的視窗畫面
先做一個簡單的有線網路來練習一下
要建立UDP為通訊協定的CBR連線
各點間的頻寬是2Mbps
延遲時間設定為10ms
所有的鏈路皆為Duplex-link
Queue設計為DropTail
Queue limit: 10個封包長度
Cbr0封包大小設定為1500 bytes,Rate: 1Mbps
Start time:1,Stop time:4
Cbr1封包大小設定為1500 bytes,Rate: 1Mbps
Start time:2,Stop time:3
整個模擬時間設定為5秒
現在準備開始吧!
Scenario->New wired scenario
建立新有線網路劇本

開始建立劇本所需的Node,利用滑鼠直接點選想擺放的位置
右下方的橫桿是可以調整顯示不同的比例

點Link,設定參數:
Link-type: duplex-link
Queue type: DropTail
Capacity: 2Mbps
Propagation delay: 10ms
Queue size: 10
設定好之後把鏈路一一連上
如下圖所示
設定好連線之後,切換到Agent mode,設定通訊協定
先選取
Agent type: UDP
Packet size: 1500 bytes

在n0和n1上各建立一個Agent,接下來選
Agent type: Null
Packet size: 1500 bytes
在n4、n5個建立一個
Null Agent,建立好Agent之後要設定Agent之間的連線
設定的方式是用滑鼠左鍵選取,兩個連線分別是
(udp0、null2)和(udp1、null3)
切換到Application mode,設定
Application type: CBR
Start time: 1
Stop time: 4
Packet size: 1500 bytes
Rate: 1Mbps
然後在n0上建立一個CBR Application。
接著再設定
Application type: CBR
Start time: 2
Stop time: 3
Packet size: 1500 bytes
Rate: 1Mbps

在n1上建立一個CBR Application。
最後設定模擬參數,模擬時間設定為5.0
指定產生Trace檔案名稱即可。
都設定好之後就按TCL按鈕,這樣就會產生TCL檔
如下圖所示

下面是產生的TCL檔
====================================

# This script is created by NSG2 beta1
#

#===================================
# Simulation parameters setup
#===================================

set val(stop) 5.0 ;# time of simulation end

#===================================
# Initialization
#===================================
#Create a ns simulator

set ns [new Simulator]

#Open the NS trace file
set tracefile [open out.tr w]
$ns trace-all $tracefile


#Open the NAM trace file
set namfile [open out.nam w]
$ns namtrace-all $namfile

#===================================
# Nodes Definition
#===================================
#Create 6 nodes

set n0 [$ns node]
set n1 [$ns node]
set n2 [$ns node]
set n3 [$ns node]
set n4 [$ns node]
set n5 [$ns node]

#===================================
# Links Definition
#===================================
#Createlinks between nodes

$ns duplex-link $n0 $n2 2.0Mb 10ms DropTail
$ns queue-limit $n0 $n2 10
$ns duplex-link $n1 $n2 2.0Mb 10ms DropTail
$ns queue-limit $n1 $n2 10
$ns duplex-link $n2 $n3 2.0Mb 10ms DropTail
$ns queue-limit $n2 $n3 10
$ns duplex-link $n3 $n4 2.0Mb 10ms DropTail
$ns queue-limit $n3 $n4 10
$ns duplex-link $n3 $n5 2.0Mb 10ms DropTail
$ns queue-limit $n3 $n5 10

#Give node position (for 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 $n3 $n4 orient right-up
$ns duplex-link-op $n3 $n5 orient right-down


#===================================
# Agents Definition
#===================================
#Setup a UDP connection
set udp0 [new Agent/UDP]
$ns attach-agent $n0 $udp0
set null2 [new Agent/Null]
$ns attach-agent $n4 $null2
$ns connect $udp0 $null2
$udp0 set packetSize_ 1500

#Setup a UDP connection
set udp1 [new Agent/UDP]
$ns attach-agent $n1 $udp1
set null3 [new Agent/Null]
$ns attach-agent $n5 $null3
$ns connect $udp1 $null3
$udp1 set packetSize_ 1500


#===================================
# Applications Definition
#===================================
#Setup a CBR Application over UDP connection

set cbr0 [new Application/Traffic/CBR]
$cbr0 attach-agent $udp0
$cbr0 set packetSize_ 1500
$cbr0 set rate_ 1.0Mb
$cbr0 set random_ null
$ns at 1.0 "$cbr0 start"
$ns at 4.0 "$cbr0 stop"

#Setup a CBR Application over UDP connection
set cbr1 [new Application/Traffic/CBR]
$cbr1 attach-agent $udp1
$cbr1 set packetSize_ 1500
$cbr1 set rate_ 1.0Mb
$cbr1 set random_ null
$ns at 2.0 "$cbr1 start"
$ns at 3.0 "$cbr1 stop"


#===================================
# Termination
#===================================
#Define a 'finish' procedure
proc finish {} {
global ns tracefile namfile
$ns flush-trace
close $tracefile
close $namfile
exec nam out.nam &
exit 0
}
$ns at $val(stop) "$ns nam-end-wireless $val(stop)"
$ns at $val(stop) "finish"
$ns at $val(stop) "puts \"done\" ; $ns halt"
$ns run
===================================

用NAM執行的畫面
=================================

接著換來做一個無線網路劇本當作練習
下圖是要模擬的環境圖示
要在n4和n5之間建立一個以UDP為通訊協定的CBR連線
Cbr
Packet size: 512 bytes
Rate: 0.2 Mbps
Start time:10 s
Stop time: 280 s

讓n4在第20秒時以5 m/sec的速度移到n3下方200 m的位置
由於距離為600 m,所以n4會在第140秒時到達
到達後停留10秒,再以相同的速度移動到(200,100)
n4會在第280秒到達,由於是使用AODV做為Routing protocol
AODV是一個On-demand的Routing protocol,
因此n4再移動的過程中,封包傳送的路徑會隨著Node的位置
而有所不同。

現在就讓我來實際操作一次
點Scenario->New wireless scenario
建立新無線網路劇本
然後建立需要的Node,這裡我利用Node mode的選項Horizontal chain
選擇產生4個Node,Node間的距離設定為200 m
然後在座標(200,300)按一下,出現了四個Node
然後接著選Single的選項在n0下方200 m,以及n3上方200 m的位置
分別建立n4和n5
接著在n4的位置按又見選擇waypoint,設定移動參數,
新增兩筆移動參數
第一筆:在第20秒時以5 m/sec的速度往(800,100)移動
第二筆:在第150秒時以5 m/sec的速度往(200,100)移動

然後按下Done
設定完移動參數之後切換到Agent mode
設定建立在n4的Agent
Agent type: UDP
Packet size: 1500 bytes

設定建立在n5的Agent
Agent type: Null
Packet size: 1500 bytes


兩個Agent都建立好之後在兩個Agent之間建立一條連線
切換到Application mode,
設定CBR
Start time: 10 s
Stop time: 280 s
Packet size: 512 bytes
Rate: 0.2 Mbps
點選n4建立一個CBR application
最後設定模擬參數
模擬時間為300 s
無線網路的參數Routing protocol設定為AODV
最後channel的參數就不做改變
都設定好之後按下TCL按鈕產生TCL檔
下面是產生的TCL檔
====================================

# This script is created by NSG2 beta1
#

#===================================
# Simulation parameters setup
#===================================

set val(chan) Channel/WirelessChannel ;# channel type
set val(prop) Propagation/TwoRayGround ;# radio-propagation model
set val(netif) Phy/WirelessPhy ;# network interface type
set val(mac) Mac/802_11 ;# MAC type
set val(ifq) Queue/DropTail/PriQueue ;# interface queue type
set val(ll) LL ;# link layer type
set val(ant) Antenna/OmniAntenna ;# antenna model
set val(ifqlen) 50 ;# max packet in ifq
set val(nn) 6 ;# number of mobilenodes
set val(rp) AODV ;# routing protocol
set val(x) 900 ;# X dimension of topography
set val(y) 3315 ;# Y dimension of topography
set val(stop) 300 ;# time of simulation end

#===================================
# Initialization
#===================================
#Create a ns simulator
set ns [new Simulator]

#Setup topography object
set topo [new Topography]
$topo load_flatgrid $val(x) $val(y)
create-god $val(nn)

#Open the NS trace file
set tracefile [open out.tr w]
$ns trace-all $tracefile

#Open the NAM trace file
set namfile [open out.nam w]
$ns namtrace-all $namfile
$ns namtrace-all-wireless $namfile $val(x) $val(y)
set chan [new $val(chan)];#Create wireless channel

#===================================
# Mobile node parameter setup
#===================================
$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) \
-channel $chan \
-topoInstance $topo \
-agentTrace ON \
-routerTrace ON \
-macTrace ON \
-movementTrace ON

#===================================
# Nodes Definition
#===================================
#Create 6 nodes
set n0 [$ns node]
$n0 set X_ 200
$n0 set Y_ 300
$n0 set Z_ 0.0
$ns initial_node_pos $n0 20
set n1 [$ns node]
$n1 set X_ 400
$n1 set Y_ 300
$n1 set Z_ 0.0
$ns initial_node_pos $n1 20
set n2 [$ns node]
$n2 set X_ 600
$n2 set Y_ 300
$n2 set Z_ 0.0
$ns initial_node_pos $n2 20
set n3 [$ns node]
$n3 set X_ 800
$n3 set Y_ 300
$n3 set Z_ 0.0
$ns initial_node_pos $n3 20
set n4 [$ns node]
$n4 set X_ 200
$n4 set Y_ 101
$n4 set Z_ 0.0
$ns initial_node_pos $n4 20
set n5 [$ns node]
$n5 set X_ 800
$n5 set Y_ 502
$n5 set Z_ 0.0
$ns initial_node_pos $n5 20


#===================================
# Generate movement
#===================================

$ns at 20 " $n4 setdest 800 100 5 "
$ns at 150 " $n4 setdest 200 100 5 "

#===================================
# Agents Definition
#===================================
#Setup a UDP connection
set udp0 [new Agent/UDP]
$ns attach-agent $n4 $udp0
set null1 [new Agent/Null]
$ns attach-agent $n5 $null1
$ns connect $udp0 $null1
$udp0 set packetSize_ 1500


#===================================
# Applications Definition
#===================================
#Setup a CBR Application over UDP connection
set cbr0 [new Application/Traffic/CBR]
$cbr0 attach-agent $udp0
$cbr0 set packetSize_ 512
$cbr0 set rate_ 0.2Mb
$cbr0 set random_ null
$ns at 10.0 "$cbr0 start"
$ns at 280.0 "$cbr0 stop"


#===================================
# Termination
#===================================
#Define a 'finish' procedure

proc finish {} {
global ns tracefile namfile
$ns flush-trace
close $tracefile
close $namfile
exec nam out.nam &
exit 0
}
for {set i 0} {$i < $val(nn) } { incr i } {
$ns at $val(stop) "\$n$i reset"
}
$ns at $val(stop) "$ns nam-end-wireless $val(stop)"
$ns at $val(stop) "finish"
$ns at $val(stop) "puts \"done\" ; $ns halt"
$ns run
===================================

接著用NAM執行
n4正往(800,100)移動中,封包傳送路徑會因為位置不同而有不同

沒有留言: