天天看點

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
           

運作結果如下圖所示:

NS節點及其配置[轉載]

5 移動節點

移動節點由一系列的網絡建構構成,包括鍊路層(LL),連接配接到LL上的ARP子產品、接口隊列(IFq)、MAC層、網絡接口等。

下圖顯示了MobileNode的結構。

NS節點及其配置[轉載]

無線網絡模拟場景的建立:

(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引發節點運動。