NS节点

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引发节点运动。

posted @ 2012-04-17 14:21  always on the way  阅读(1868)  评论(0编辑  收藏  举报