QualNet统计信息

一、统计信息概述

在仿真结束时,QualNet生成一个统计文件,其中包含用于分析协议行为、网络性能等的信息。统计文件是一个纯文本文件,可以使用任何文本编辑器打开,也可以用QualNet分析器图形化地查看。

通常,仿真按配置的仿真时间(参数SIMULATION-TIME)运行。同时也可以在配置的仿真时间之前终止(例如通过键入Ctrl+C)。两种情况都会生成统计文件。统计文件的前两行表示配置的仿真时间和实际结束时的仿真时间。如果仿真运行直到配置的仿真时间结束,那么这两个条目是相同的。前两行的格式如下:

<Node ID>,,,,,Max Configured Simulation Time = <Max-Simulation-Time>

<Node ID>,,,,,Simulation End Time = <Simulation-End-Time>

其中:

<Node ID>                        场景中最低的节点ID,通常是1。

<Max-Simulation-Time>   最大配置仿真时间,以秒为单位。在(.config)文件 中设置参数SIMULATION-TIME配置。

<Simulation-End-Time>   仿真时间,以秒为单位,实际仿真结束时间。

统计文件前两行之后的每一行都列出了特定协议的一个统计信息。这些行首先按节点分组,然后按层分组,然后按协议分组,然后按接口分组。最后是索引。统计文件中的每一行都有以下格式:

<Node ID>, <Interface Address>, <Index>, <Layer>, <Protocol>, <Metric> = <Value>

其中:

<Node ID>                运行协议的节点的ID。

<Interface Address> 运行协议的接口的IP地址。此字段可选,如果不 适用,则留空。它通常只用于队列和调度程序。

<Index>                    索引,以区分在节点或接口上运行的同一协议的多 个实例。例如,这可以是应用层的端口号、网络层   

                                 的队列索引以及MAC和物理层的接口索引。此字 段可选,如果不适用,则留空。

<Layer>                   打印统计数据的协议层。

<Protocol>               打印统计数据的协议名称。

<Metric>                  统计变量的名称。

<Value>                   仿真结束时统计变量的值。

示例:

 

二、统计信息层次

要查看MAC统计信息,可从数据结构的层次开始。

1.首先是~/include/partition.h中的PartitionData结构体,包含整个域(一个域可包含多个节点)的全局信息。重要数据有:

struct PartitionData
{
    int 		    partitionId; 			
    D_Int32 	            numNodes; 
    NodeInput* 		    nodeInput;
    Node** 	            nodeData;
    Node*                   firstNode;
    STAT_StatisticsList*    stats;
}

 

2.其次是~/include/node.h中的Node结构体,包含节点的所有信息。比较常用的元素有:

struct Node
{
    unsigned    	nodeIndex;
    NodeAddress 	nodeId;
    PhyData**  		phyData;
    MacData**       	macData; 
    NetworkData     	networkData; 
    TransportData   	transportData; 
    AppData         	appData;            
}

3.接下来是协议层的数据结构,如~/include/mac.h中的MacData,包含MAC层的所有信息。常用元素有:

struct MacData
{
    MAC_PROTOCOL 		macProtocol;
    BOOL         	        macStats;
    MacHWAddress          	macHWAddr;
    void*			macVar;
    STAT_MacStatistics* 	stats;
}

其中的指针void* macVar很重要,指向的是MAC层具体某个协议的数据结构,使用时用相应指针格式替换即可,如MacDataDot11:

MacDataDot11* dot11 = (MacDataDot11*) node->macData[interfaceIndex]->macVar;

这里的stats是MAC层通用的统计信息,各协议下还有各自的统计信息。

4.先看通用统计信息,~/include/stats_mac.h中的STAT_MacStatistics类,它包括很多对自身属性的操作方法,其属性有:

STAT_MacAddressStatistics m_AddrStats[STAT_NUM_ADDRESS_TYPES];

STAT_Throughput m_CarriedLoad;

第二个属性是吞吐量或负载相关的,第一个属性是与MAC地址相关的。常见的输出统计信息来自第一个属性。

~/include/stats_mac.h中的STAT_MacAddressStatistics类包含MAC单播、广播,控制、数据帧的统计信息:

class STAT_MacAddressStatistics
{
protected:
    
    STAT_Sum         m_DataFramesSent;   
    STAT_Sum         m_DataFramesReceived;
    STAT_Sum         m_ControlFramesSent;
    STAT_Sum         m_ControlFramesReceived;
    STAT_Sum         m_DataBytesSent;
    STAT_Sum         m_DataBytesReceived;
    STAT_Sum         m_ControlBytesSent;
    STAT_Sum         m_ControlBytesReceived;
    STAT_Average     m_AverageQueuingDelay;
    STAT_Average     m_AverageMediumAccessDelay;
    STAT_Average     m_AverageMediumDelay;
    STAT_Average     m_AverageJitter;

    clocktype         m_LastDelay;  
}

STAT_Sum是一个类,提供了很多方便的处理属性的方法,这里不去计较。STAT_Average也类似。从这些属性的命名可以清晰的看出其分别代表说明意思。

再来看层内具体协议的统计信息,以MacDataDot11为例。~/libraries/wireless/src/mac_dot11.h中的MacDataDot11结构体主要属性有:

struct MacDataDot11
{
    MacData* 	myMacData;
    D_Int32 	pktsToSend; 
    D_Int32 	unicastPacketsSentDcf;
    D_Int32 	broadcastPacketsSentDcf;
    int 	unicastPacketsGotDcf;
    int 	broadcastPacketsGotDcf;
    int 	ctsPacketsSentDcf;
    int 	rtsPacketsSentDcf;
    int 	ackPacketsSentDcf;
    int 	retxDueToCtsDcf;
    int 	retxDueToAckDcf; 
    int 	retxAbortedRtsDcf;
    int 	pktsDroppedDcf;
}

其中myMacData属性又指回MAC层通用数据结构。这种通用和专用数据结构互相包含对方指针的方式,是协议栈各层都常用,使用时很方便。

三、自定义新统计信息

自定义新统计信息,可以在通用结构中新增,也可以在专用结构中新增。本人在实践中新增的是动态数组形式的统计信息,而对STAT_Sum结构了解不深,所以选择在专用结构中新增普通的int*型数据。

添加统计信息是为了统计到真实的数据,必须解决初始化、统计变化中的信息、输出的问题。本人在这个过程中,研究了大量qualnet源代码,弯弯绕走了很多,还费时费力把数据包从节点1的应用层发送至节点2的应用层的所有过程研究了个透,想弄明白各层统计信息是什么时候在哪个位置变化的。熬了两个晚上,某个瞬间突然开窍,发现所有统计信息的操作都是有函数来实现的,不是茫茫代码中的杂乱的语句。感慨之余,也非常感谢软件研发人员的思路清晰、代码友好。

1.初始化

统计信息初始化和整个协议数据结构的初始化同步进行的,新增函数在这里初始化即可。见~/libraries/wireless/src/mac_dot11.cpp中的MacDot11Init函数。

2.统计更新

见~/libraries/wireless/src/mac_dot11.cpp中的MacDot11UpdateStatsReceive函数和MacDot11UpdateStatsSend函数,分别更新接收帧和发送帧时的统计信息。

3.输出

见~/libraries/wireless/src/mac_dot11.cpp中的MacDot11PrintStats函数。

 

希望能对大家有所帮助。

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值