NS節點及其配置[轉載]
原文網址:http://www.cnblogs.com/xyl-share-happy/archive/2012/04/17/2453598.html
---------------------------------------------
1、 NS中節點分為兩類:單播(一對一通訊)和多播(一點對多點通訊)。
2、 單播節點:
建立單播節點的基本方法是呼叫Simulator類的node過程:
Set ns [new Simulator]
Set n0 [$ns node]
以上TCL指令碼建立了一個單播節點n0。單播節點的基本結構如下圖所示,它包括兩個TCL物件:地址分類器(address classifier)和埠分類器(port classifier),他們用來判斷分組的目標地址以及分組的目標Agent。
3、 配置節點:
在建立節點之前定義它的各種屬性,包括節點的地址型別、移動節點的各個網路構件的型別、ad-hoc網路中移動節點的路由協議型別、是否開啟各層(Agent、Router、MAC)的trace功能等。(具體配置引數及意義自己看相關程式)
節點屬性配置以後,建立的所有節點都具有所配置的屬性。若需要建立一個和移動節點相同的基站:$ns_ node-config –wiredRouting ON (基站支援有線路由)
Set base_node [$ns node]
4、 分類器:(Classifier)
節點收到一個分組後,需要檢查分組的某些域(大多情況下是檢查目的地址,某些時候會檢查源地址),然後尋找與這個域的值匹配的接受者,這個工作由分類器Classifier完成。NS中有不同的Classifier物件,分別檢查分組不同部分,來完成不同的匹配、篩選工作。
Classifier的功能是從邏輯上匹配一個分組,並基於匹配的結果把該分組傳遞給相應的物件。每個Classifier都包括一個由slot number做索引的物件表。Classifier的工作是檢查收到的分組的slot number,然後把分組轉發給由該slot number索引的物件。C++中的Classifier類是各種不同型別的Classifier基類。
當分組到達時,recv(Packet *p,Handler *h)函式最先被呼叫,recv函式又呼叫find函式,find函式又呼叫了Classify函式,不同型別的分類器對Classify函式的定義不同,但各種Classify函式都會對分組做檢查後返回一個slot索引值,如果索引值是有效的,並指向一個有效的TclObject,recv()函式就會把分組傳遞給該TclObject物件,即呼叫該TclObject的recv()函式,如果索引是無效的就會清楚該分組並返回。
此外,alloc()成員函式動態地分配足夠空間來放置slot,install()成員函式用來在物件表中增加物件,而clear()函式用來刪除表中的一個物件。
AddressClassifier按照分組的目的地址進行匹配,用來支援單播分組轉發。
PortClassifier根據分組的埠進行匹配,將分組傳遞給相應的Agent物件。
Replicator也是從Classifier繼承而來,但它不使用classify()函式,它的作用是生成一個分組的多分拷貝,並把這些拷貝轉發給slot表中的所有物件。
Classify類提供的例項過程,使得使用者可以在Tcl中對classifier物件進行控制。
(dmux_是節點的PortClassifier物件,命令[$node set dmux_]會返回$node的PortClassifier物件)
set ns [new Simulator]
set node [$ns node]
set udp0 [new Agent/UDP]
set udp1 [new Agent/UDP]
set null [new Agent/Null]
$ns attach-agent $node $udp0
puts "[[$node set dmux_] slot 0]" //查詢號碼為0的slot對應的物件名
puts "$udp0"
puts "[[$node set dmux_] findslot $udp0]" //查詢objest所在的slot號碼,如果在表//中沒有找到該objest,返回-1
puts "[[$node set dmux_] findslot $null]"
puts "====================================="
puts "[[$node set dmux_] installNext $udp1]" //在最後一個slot後插入一個新的指向udp1的表項,並返回該表項的slot號碼
puts "[[$node set dmux_] slot 1]"
puts "$udp1"
puts "====================================="
[$node set dmux_] install 0 $udp1 //將號碼為0的slot所指的物件設為udp1
puts "[[$node set dmux_] slot 0]"
puts "======================================"
puts "[[$node set dmux_] alloc-port $null]" //尋找一個空閒的slot
[$node set dmux_] clear 0 //將號碼為0的slot清空
puts "[[$node set dmux_] alloc-port $null]"
puts "======================================"
puts "[[$node set dmux_] slot 0]"
$ns run
執行結果如下圖所示:
5 移動節點
移動節點由一系列的網路構建構成,包括鏈路層(LL),連線到LL上的ARP模組、介面佇列(IFq)、MAC層、網路介面等。
下圖顯示了MobileNode的結構。
無線網路模擬場景的建立:
(1) 建立一個拓補物件,設定移動節點運動的範圍。
Set topo [new Topography]
$topo load_flatgrid $opt(x) $opt(y)
(2) 配置節點,呼叫模擬器物件ns的內部過程node-config{}配置節點
(3) 建立一個God物件,動態地儲存個移動節點之間的連線關係。
Set god [create-god $val(nn)]
其中create-god方法用於建立God物件,引數$val(nn)為無線網路的移動節點數,該命令實際上是建立了一個$val(nn)*$val(nn)的矩陣,儲存個移動節點之間的連線關係。
(4) 呼叫模擬器物件ns的node{}內部過程建立移動節點。
(5) 呼叫god物件的set-dist{}內部過程,設定個節點之間的最短跳數。
(6) 利用setdest引發節點運動。