目录

一、协议栈

二、离散事件仿真

三、QualNet协议模型

四、QualNet仿真器架构

(一)初始化的层次结构

(二)事件调度层次结构

(三)终结的层次结构


本文简要介绍QualNet仿真器的实现机制。

一、协议栈

QualNet使用与TCP/IP网络协议栈类似的分层体系结构。在该体系结构中,数据在相邻层之间移动。QualNet的协议栈自上而下为应用层、传输层、网络层、链路(MAC)层和物理层。物理层之下还有传输信道和节点移动性(不能算一层,但都可以配置属性并仿真)。协议栈中的相邻层通过定义好的API进行通信,通常层通信只发生相邻层之间。例如,传输层协议可以从应用和网络层协议获得并传递数据,但不能使用链路(MAC)层协议或者物理层协议来执行。当然,用户也可以自定义函数实现通信功能,不过在函数内部还是会调用系统提供的更底层函数,通常情况下没有必要自定义新的函数。

QualNet仿真实现
图1 QualNet协议栈标题

 

TCP/IP网络协议栈是网络领域的最基础知识,此处不再赘述。

二、离散事件仿真

QualNet是一个离散事件仿真器。在离散事件仿真中,随着时间的推移,系统通过一种表示来建模,在这种表示中,当事件发生时,系统状态会立即发生变化。其中将事件定义为导致系统更改其状态或执行特定操作的瞬时事件。事件的例子有:一个包的到达,一个周期性的提示信息,通知路由协议向邻居发送路由更新等。发生事件时采取的操作包括:向相邻层发送数据包,更新状态变量,启动或重新启动定时器等。

在离散事件仿真中,仿真器维护事件队列。与每个事件相关联的是其事件时间,即事件被设置为发生的时间,事件队列中的事件按活动时间安排。仿真器还维护一个仿真时钟,用于仿真时间。仿真时钟是按离散步骤提出的,如下所述。

仿真器通过在仿真结束前不断重复以下一系列步骤来操作:

1.仿真器从事件队列中删除第一个事件,即计划用于最早时间的事件。

2.仿真器将仿真时钟设置为事件的发生时间,即跳过中间没有发生事件的时段,提前到达事件发生时刻。

3.仿真器处理该事件,即执行与事件有关的行动。这可能导致更改系统状态、调度其他事件,或两者兼而有之。如果安排了其他事件,它们可能会在当前时刻或将来时刻发生。

三、QualNet协议模型

QualNet中的每个节点都运行协议栈,每个层使用其下方层的服务并向其上层提供服务。协议在协议栈的某一层上运行。QualNet中的协议本质上是一个有限状态机。事件的发生对应于有限状态机的转变。各层之间的接口也是基于事件的。每个协议都可以创建使其更改自己状态的事件(或执行某些事件处理),也可以创建由其他协议处理的事件。如:向相邻层传递数据或请求服务,协议将为该相邻层创建一个事件。

QualNet仿真实现
图2 QualNet的协议模型标题

 

图2显示了QualNet中协议的有限状态机表示。协议模型的核心是一个事件调度器,它由一个等待事件状态和一个或多个事件处理程序状态组成。在等待事件状态中, 协议等待事件发生。当协议的事件发生时,协议转换到与该事件相对应的事件处理程序状态(例如,当事件1发生时,协议转换到事件1处理程序状态)。在此事件处理程序状态中,协议执行与事件对应的操作,然后返回到等待事件状态。事件处理程序状态所执行的行动可包括更新协议状态,或调度其他事件,或两者兼而有之。

协议有限状态机除了事件调度器外,还有两种状态:初始化状态和终结状态。在初始化状态下,协议读取外部输入来配置其初始状态。然后,协议转换到等待事件状态。在仿真结束时自动转换到终结状态。在终结状态,仿真过程中收集的统计信息将被输出出来。

四、QualNet仿真器架构

QualNet中的协议模型有三个组件:初始化、事件处理和终结。这些组件中的每一个都是按层次执行的:全局/节点——分层——协议——事件。所不同的是,初始化和终结是每个节点都要进行的,所以从全局出发进行初始化和终结,直到协议一级;而事件调度是有事件发生的节点才进行,所以是某个节点的事件调度而不是全局的事件调度,直到具体事件的响应为止。表现在函数命名上,初始化是PARTITION_InitializeNodes,终结是PARTITION_Finalize,而事件调度是NODE_ProcessEvent

(一)初始化的层次结构

1.仿真开始时调用函数PARTITION_InitializeNodes(如图3所示)初始化网络中的每个节点。

QualNet仿真实现

QualNet仿真实现
图3 函数PARTITION_InitializeNodes标题

 

2.通过调用每个层的初始化函数来初始化在节点上运行的协议栈层。层是按自下而上的顺序初始化的,从最底层开始。有些层是全局初始化的,而其他层则是一次初始化一个节点。如函数MAC_Initialize初始化所有节点的MAC层,而函数TRANSPORT_Initialize则在给定节点上初始化传输层。应用层有两个初始化函数:APP_Initialize初始化给定节点的应用层路由协议,APP_InitializeApplications初始化所有节点的应用层流量生成协议。

3.每个层初始化函数依次为在该层运行的每个协议调用一个初始化函数。函数TRANSPORT_Initialize(如图4所示),分别调用TCP和UDP协议TransportTcpInit和TransportUdpInit的初始化函数。

QualNet仿真实现
图4 函数TRANSPORT_Initialize标题

 

4.协议的初始化函数创建和初始化协议状态变量以及协议统计变量。如UDP协议初始化函数TransportUdpInit创建UDP状态变量udp如果启用了UDP统计信息收集功能, TransportUdpInit还创建和初始化UDP统计变量。

(二)事件调度层次结构

1.当事件发生时,QualNet内核将为该事件调度的节点获取句柄。

2.调用节点调度函数NODE_ProcessEvent(如图5所示)确定该节点发生事件发生的层,并调用相应层的事件调度函数

QualNet仿真实现
图5 函数NODE_ProcessEvent标题

 

层的事件调度函数确定事件发生的协议,并调用该协议的事件调度函数。如当Bellman-Ford 协议事件发生时,应用层Bellman-Ford是应用层路由协议)调度函数APP_ProcessEvent(如图6所示)调用Bellman-Ford协议的事件调度函数RoutingBellmanfordLayer。

QualNet仿真实现
图6 函数APP_ProcessEvent标题

 

协议事件调度,与其他调度函数类似,由switch语句组成。它将为发生的事件调用事件调度函数。事件调度是特定的并在发生该事件时执行所需的操作。例如,Bellman-Ford 调度函数RoutingBellmanfordLayer(如图7所示),当MSG_APP_FromTransport类事件发生时,调用函数HandleFromTransport。MSG_APP_FromTransport表示已从传输层接收到数据包,而函数HandleFromTransport执行处理接收到的数据包所需的操作。

QualNet仿真实现
图7 函数RoutingBellmanfordLayer标题

 

(三)终结的层次结构

1.仿真结束时,调用终结函数PARTITION_Finalize(如图8所示)终结所有节点。

2.终结函数调用在每个节点上运行的协议栈层的终结函数,同初始化类似,层是按自下而上的顺序终结的,从最底层开始。略有不同的是,各层终结都是逐个节点进行的,没有全局终结的。

QualNet仿真实现
图8 函数PARTITION_Finalize标题

 

层的终结函数调用在该层运行的每个协议的终结函数。如MAC层终结函数MAC_Finalize(如图9所示)。对于节点的每个接口,MAC_Finalize调用运行在该接口上的MAC协议的终结函数例如,如果CSMA协议在一个接口上运行,MAC_Finalize调用CSMA终结函数MacCsmaFinalize。

QualNet仿真实现
图9 函数MAC_Finalize标题

 

4.如果对协议所在的层启用了统计信息收集功能,则协议的终结函数会输出协议的统计信息。如函数MacCsmaFinalize(如图10所示)调用MacCsmaPrintStats函数来输出CSMA统计信息。

QualNet仿真实现
图10 函数MacCsmaFinalize标题

 

 

 

 

相关文章: