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