计算机防火墙论文 第9页
scheduler就可以了。Scheduler的主要功能是处理分组(pack)的延迟和充当定时器。一个scheduler的执行过程是这样的;从所有事件中选择发生时刻最早的事件,调用它的handler函数,把该事件执行完毕,然后在剩余事件中选择发生时刻最早的事件执行,如此反复。NS 仿真器是单线程的,在任何给定的时刻它只能运行一个事件,如果多于一个事件要在同一时刻执行,它们的执行将按照事件代码插入的先后次序执行。
下面简单介绍一下这3个非实时的事件调度器。链表结构中按照时间先后顺序保存事件目录,通过查表方式插入和删除事件,通常用于FIFO 方式的仿真事件仿真中。在多事件应用中,堆栈结构优于链表结构,例如n 个事件的插入删除次数是O(logn) 。Calendar 队列类似一个全年的日历,年份不同但日月相同的事件可记录在一年的同一天中;它的执行效率更高,因此是目前NS中缺省的非实时事件调度器。
实时的事件调度器(Scheduler/RealTime类)尽可能使得事件的执行和真实的时间同步。目前它是用list Scheduler的一个子类实现的。NS该功能还在开发中,它能把一个NS的仿真网络引入到真实世界的拓扑中,但它只能在较慢的数据传输速率下工作。因为仿真器必须要能跟的上真实网络中的数据速率。
(2)事件
一个事件通常由触发时间(firing time)和Handler函数组成,Event类的定义如下(参考源文件ns/common/ Scheduler.h):
class Event {
public:
Event* next_; /* 指向下一个需要被Scheduler执行的事件 */
Handler* handler_; /* 事件触发后Scheduler会调用handler_指向的函数*/
double time_; /* 事件的触发时间 */
scheduler_uid_t uid_; /* 事件编号 */
Event() : time_(0), uid_(0) {}
};
class Handler {
public:
virtual void handle(Event* event) = 0;
};
与本节相关的Tcl命令:
Ø set ns [new Simulator];#建立仿真对象的一个实例
Ø $ns halt; #停止或暂停scheduler
Ø $ns run; #开始scheduler
Ø $ns at <time> <event>;#在<time>时刻执行<event>
$ns use-scheduler Heap; #让NS使用heap结构的事件调度器
3 、 节点
节点是ns最重要的模块,它主要的部件是分类器(classifier类)。节点也是一个由OTcl实现的解释类,也没有相应的编译对象。有关节点的函数可以在文件目录ns/tcl/lib下的文件ns-nodes.tcl, ns-rtmodule.tcl和ns目录下的rtmodule.{cc,h}、 classifier.{cc,h}、classifier-addr.cc、classifier-mcast.cc、classifiermpath.cc,和replicator.cc文件中找到。
当一个节点收到一个分组时,节点就需要检查分组的某些域(fields) ,通常是检查分组的目的地址,某些场合是源地址。然后就需要寻找与这个域的值相匹配的接收者。在NS中,这个工作是由一个简单的classifier对象执行的,NS中有各种不同的classifier对象,分别负责检查分组的不同部分,来完成不同的匹配和筛选工作。因此NS中的节点为了不同的目的会使用许多不同类型的classifiers类。
由以下Otcl代码可以得到一个节点:
set ns [new Simulator]
$ns node
缺省状况下,node为单播节点。要想得到多播节点需要加入参数“-multicast on”,如: set ns [new Simulator -multicast on]
节点的组分:分类器(Classifier)
node接收到一个包后,要检查特定的域,通常是目的地址(还有可能是源地址),决定如何处理这个包,如果是转发,则还要决定转发到哪里。这项任务由分类器对象来完成,不同类型的分类器对象分别负责检查分组的不同部分,以决定如何转发。
NS中共有五种分类器:base、address、multicast、multipath、replicator。
(1) base基类分类器(在文件ns/classifier.h定义)是一虚基类:
每一分类器带一指针,指向一张slot表,这张slot表记录TclObject对象与槽号的对应关系。分类器的工作是判断哪个槽号与接收到的数据包相关,然后将包转发给相应的TclObject类对象。
它用方法recv()接收一个包,交给另一方法classify()处理。不同类型的分类器定义了不同的classify()方法。通常的格式是,classify()返回槽下标,若此下标有效,指向一个有效的TclObject对象,则classifier将数据包转发给这个对象,而该对象用自己的recv()方法接收,若下标无效,分类器调用实例过程no-slot{}。基类的no-slot{}仅是输出出错信息,中止执行。
command()方法还提供了以下的命令:
_ clear{ (slot) } :清空slot表。
_ installNext{(object)}:将对象装入下一槽中,返回槽的号码。
_ slot{(index)}:返回指定的槽的对象。
_ install{_ index_ , _ object_ }:将指定的对象装入指定的槽中。
(2) address classifier(在ns/classifier-addr.cc中定义):
其功能是按照分组的目的地址进行匹配,用来支持单播分组转发。它通过对分组的目的地址作位移和掩码运算来产生一个slot表,从而将包的目的地址转化成槽的号码。
(3) multicast classifier(在ns/classifier-mcast.cc中定义):
保持一个哈希链表来匹配地址对和取到槽的号码。如为未知地址对,则用Node::new-group{}加入表中。
(4) multipath classifier(在ns/classifier-mpath.cc中定义):支持等价多路转发。
(5) hash classifier:使用哈希表,将包分发给“流”
(6) replicator:
replicator与普通的classifier不同,它不使用classify()函数,它的作用是生成一个分组的多个拷贝,并把这些拷贝转发给slot表中的所有对象。在组播分组转发时,一个分组需要被转发给多个目标对象,这个工作就是由replicator完成的。
与本节相关的Tcl命令有:
Ø set $node [$ns node];#建立一个节点实例
Ø $ns id;#返回该节点id
Ø $node neighbors;#返回邻居节点列表
Ø $node add-neighbor <neighbor_node>;#增加一个邻居节点(注意:这是单向的邻居
Ø $node node-addr;#返回节点的地址
Ø $node reset;#重置连到这个node上的所有agent
Ø $node agent <port_num>;#返回port_num端口所指向的agent对象,如果port_num端口没有指向任何对象,返回null字符串。
Ø $node attach <agent> <optional:port_num>;#将agent对象连接到节点上,如果没有指定端口号,节点会自己分配一个空闲的端口,并把agent连接到该端口上;如果指定端口为port_num,节点就会连接到端口port_num上
$node detach <agent> <null_agent>;#将agent与节点分离,并把一个null_agent连接到agent原来所在的端口上
4、 链路
这是继节点后的拓扑定义阶段。NS支持节点的简单连接,多通路 LAN的简单连接,无线和广播通讯媒体的连接。Link 类是Otcl的类中独立的一个类。SimpleLink 类提供两个结点之间的点到点连接的能力。
下面的Otcl语句创建了一条简单的连接:
set ns [new Simulator]
$ns simplex-link <node0> <node1> <bandwidth> <delay> <queue_type>
函数创建了一条从node0到node1的链,指定了带宽、延迟和使用的队列类型。同时还创建了ttl值。
每条链有五个实例变量:
Ø head_ 链的入口,指向链中的一个对象;
Ø queue_ 指向链的主要队列元素,一条链可以拥有一个或几个队列;
Ø link_ 指向由带宽、延迟等特性指定的链。
Ø ttl_ 指向完成ttl计算的对象该对象由C++的类TTLChecker实现的,TTLChecker类的recv()函数会对分组的ttl值作判断,如果ttl小于0,则丢弃该分组,否则调用send()函数将分组递交给target_。
Ø drophead_ 指向处理分组丢弃功能的对象。
链路的构造图如图2.6所示:若图片无法显示请联系QQ752018766
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] ... 下一页 >>