摘要:详细介绍了面向 应用 软件的 网络 监控系统中管理代理和监控模块通信的设计与实现过程。包括管理信息存储的优化设计、内存映射文件的存储数据结构设计、监控指令转发技术、内存映射文件的通信方式、同步机制应用等。通过内存映射文件方式存储管理信息,高效地完成了收集各应用程序实例的监控信息任务,并实现了监控信息的存储、共享和监控模块与管理代理间实时信息交换的功能。
关键词:优化存储;内存文件映射;消息机制;同步机制
随着网络规模增大,网络结构及网络应用日渐复杂,传统的物理安全技术和措施已经不足以保证信息系统的安全,因此网络管理系统作为网络安全运行的保证,其重要性越来越突出。为了提高 计算 机网络信息安全,许多相关的网络安全产品被开发,但大多是基于网络硬件设备,如路由器、集线器、交换机等,而对网络应用软件的 研究 和开发相对较少[1~4]。为了保证网络环境中的应用程序正常高效地运行,笔者设计了基于snmp的asnms(application software net monitoring system,网络应用软件监控系统)。该系统选择运行于网络环境中的应用程序为研究对象[5,6]。
1网络应用软件监控系统(asnms)简介
asnms的主要监控目标是网络中的应用软件,通过及时获取软件中重要变量值(如系统配置、状态指示等),从而及时了解整个网络中应用程序的状态,并且还可以通过管理站点对各受控站点中的应用程序进行控制操作,提高整个网络和应用系统的安全性。Www.133229.cOM该网络应用软件监控系统主要有三个模块[5,6]:
(1)管理站点主程序。该程序在管理站点上运行。通过该程序,管理站点可以使用udp/ip协议与管理范围内的所有受控站点进行通信,收集网络应用程序的监控信息,并下发各种控制命令。
(2)管理代理。每一个受控站点上运行一个管理代理程序(有且仅有一个)。管理代理是系统的通信中心。一方面通过内存映射文件与受控站点上的各应用程序实例进行通信,收集各应用程序实例的监控信息;另一方面通过udp协议与管理站点通信,发送受控站点的管理信息以及转发管理站点的控制信息。
(3)监控模块。该模块是供软件开发人员使用的一个通用接口模块。它负责从受控应用程序中获取监控信息,发送到管理站点,并且也能接收从管理代理转发的管理站点命令,对受控应用程序执行一定的控制操作。从结构上来看,监控模块附属于受控应用程序,但它以单独的线程形式存在。
2管理信息存储的设计
为了监控模块工作的需要,同时为了能更方便地将监控信息传送给管理代理,监控模块需要将监控信息以一定的形式存储起来。监控模块监控的目标是应用程序中的变量。由于现在软件开发大多使用的是面向对象的 方法 ,在其程序中各种变量是有层次结构关系的,这一点必须在监控信息中体现出来[7]。监控信息从逻辑上看应该是以树的形式存在,并且存储的是各种变量的信息,而变量的长度是不相同的,在这棵树中各个节点的空间大小有可能不相同。由此看来,无论是从存储 内容 上还是从逻辑结构上看,监控信息的存储结构均是相对较为复杂的。下面三种设计方案可以满足这样的要求:
(1)在监控模块内存空间内生成一棵二叉树。这是最常规的存储方法。在此情况下,只需要设计一个较为合理的树结构,二叉树就能直接存储在监控模块的内存空间中,访问方便。同时因为在许多语言中均有任意类型的数据类型,由此可以将不同数据类型的数据方便地存储在一种数据结构中。但是由于这棵树存在于监控模块的内存空间中,不方便管理代理程序对其读取,监控模块还需要通过一定的方法将该树传送给管理代理[4,7]。
优点:实现简单,监控模块可以很方便地对其进行读写操作。
缺点:不方便管理代理程序对监控信息读取,需要使用其他方法将信息传送给管理代理。
(2)将监控信息存储在磁盘文件中。为了解决管理代理和监控模块共享监控信息的 问题 ,监控模块可以将监控信息存储为磁盘文件形式。在此情况下,需要设计一套完整合理的文件空间使用策略,保证能够完整地存储监控信息。由于在windows程序中采用了虚拟内存策略,不同应用程序内存空间是不同的,即使某应用程序获取了另一个程序中的某个指针,也不能正确地访问到其数据。在对变量值进行存储时,一定要注意不能存储有关变量的指针信息,而应该想办法存储其中变量的实际数据[8]。同时因为是将监控信息存储于磁盘上,需要采取一定的措施尽量避免出现垃圾文件的情况,同时还要防止在工作状态下用户有意或无意地修改、删除该文件。
优点:多个程序可以方便地共享数据。
缺点:实现较复杂,容易产生垃圾文件,容易泄漏和丢失监控信息。
(3)将监控信息存储在内存文件映射中。这是对方案(2)的改进。方案(2)将监控信息存储于磁盘文件中,由此使得容易产生垃圾文件、容易泄漏和丢失监控信息。那么如果将监控信息直接存储在内存当中呢?采用内存映射文件是一个很好的解决办法。应用程序在需要时在内存中开辟一定的空间存储数据,当应用程序关闭后,由于操作系统的内存管理机制,内存文件将自动被回收,安全性高。但是在生成内存映射文件时,必须要指定文件的大小,此时如果处理不当将可能出现存储空间不够用的情况[4,8]。
优点:多个程序可以方便地共享数据,数据不易泄漏,安全性高。
缺点:实现较复杂,必须指定文件大小,处理不当可能出现空间不够用的情况。
综合三种方案,方案(3)是最合适的。只要指定足够的文件大小,它不仅满足监控模块存储管理信息的需要,信息安全性高,同时可方便地实现监控模块与管理代理之间实时信息交换功能,从而解决它们之间的通信问题。 3管理代理与监控模块通信的设计
3.1管理代理与监控模块间通信
通信包括系统初始化连接建立、命令转发和自定义消息。
(1)系统初始化连接建立。管理代理随受控站点启动后,必须接收各个应用程序实例的监控模块的注册信息,与监控模块建立初始连接。
(2)命令转发。管理代理接收到管理站点发送的udp报文后,先识别该报文是发送给哪个监控模块的,然后通过windows消息形式发送给指定的监控模块。
(3)管理代理与监控模块之间约定一系列自定义消息,并向windows注册,保证双方能够正确地通过自定义消息进行通信。
3.2监控信息的收集与组织
在受控站点上,管理代理与多个应用程序实例的监控模块之间是通过内存映射文件进行通信的。监控信息存储在内存映射文件中。
(1)监控信息收集就是对监控模块对应的内存映射文件进行遍历。通过遍历获得最新的被监控应用程序的状态、监控变量的值等。
(2)监控信息收集时,需提供有效的同步机制,防止管理代理与监控模块同时访问同一个监控信息文件时出错。
(3)监控信息组织就是提供安全高效的数据存储结构,能够完整地记录所有监控信息。
3.3内存映射文件存储数据结构设计
为了能存储完整的变量结构信息,可将监控信息的逻辑存储结构设计为如图1所示。在监控信息的逻辑结构中存在两种结构指针,即横向指针表示父子关系和纵向指针表示兄弟关系,由此而构成了一棵二叉树。
本文原文
在图1所示结构中,由于不同变量类型存储大小不同,从而导致二叉树中各个节点的大小不统一。为了方便地进行存储空间管理,同时又能准确完整地记录如上变量结构信息,笔者设计了一套内存映射文件的存储数据结构。其基本思想为:将数据本身与数据间的逻辑关系分开进行处理,每次根据实际使用的需要在文件空闲空间中分配相应大小的空间,并在该空间的起始位置生成一个空间信息记录。其中包括存放的变量类型、变量大小、变量指针、结构指针等数据信息。此外还包括了该空间的地址、前后相邻区域地址、本空间大小等空间管理信息。真正的记录数据实体存放在该空间信息记录之后的剩余空间中(剩余空间的大小可以是不同的)。文件的存储结构如图2所示。
由图2可以看出,在监控信息存储文件中所有的存储空间均是前后紧连着的。通过空间信息记录可以得知某区域的大小以及是否正在被使用。这样就能够方便地进行空间分配和回收工作。又因为在空间信息记录中存在变量结构指针,因而通过空间信息记录也能方便地访问到数据之间的逻辑结构关系。由此看出,空间信息记录在整个存储设计中占有很重要的位置,正是利用它才实现了对存储空间的灵活使用。空间信息记录的数据结构设计如下:
typedef struct titeminfo
{//以下为数据(变量)信息
char nodename[max_nodename];//节点名
char nodeinfo[max_nodeinfo];//节点信息
int nodetype;//1:程序节点;2:类节点;3:变量节点;其他未定义
int vartype;
//存储数据的变量类型,特别:程序节点存储了句柄信息,long型
int varsize; //数据大小
bool writable; //变量是否可写
void *varaddr; //数据在程序中的地址
void *pbrother; //前一个同级(兄弟)节点
void *nbrother; //下一个同级(兄弟)节点
void *father; //父亲节点
void *child; //下一级(孩子)节点
//以下为空间管理信息
void *addr; //本区域在文件中的相对地址
long itemsize; //本区域大小
void *paddr; //前一个区域在文件中的相对地址
void *naddr; //后一个区域在文件中的相对地址
bool inuse; //本区域是否正在使用
}titeminfo;
4关键技术及其具体实现
4.1命令转发
管理代理接收到的命令有查询被监控 应用 程序状态、刷新监控变量、锁定监控变量、锁定应用程序窗口等。管理代理根据udp报文 内容 ,将命令发送给指定的监控模块。命令的转发均是通过自定义消息实现的。本文使用windows消息机制自定义了一系列消息并实现其消息的处理,结合到本监控系统的需要,管理代理中主要定义了如下消息及其处理:
(1)wm_readapphandle:读应用程序实例中监控模块的相关句柄;
(2)wm_readappstruct:读应用程序实例中的mib子树结构;
(3)wm_readappdata:读应用程序实例中的mib节点的值;
(4)wm_setappdata:设置应用程序中的mib节点的值;
(5)wm_readapptrap:读应用程序发送来的trap信息;
(6)wm_readproxyset:为应用程序实例的mib子树中某个mib节点设置阈值;
(7)wm_miberror:代理与应用程序之间的通信发生错误。
由于在一个标准的windows应用程序中,消息是由窗口处理的,而在管理代理中没有窗口,也不是从窗口继承的一个类,管理代理不能直接进行消息操作。在程序中使用allocate-hwnd函数为监控模块虚拟生成一个消息窗口,专用来进行消息捕获、发送与处理。
4.2内存文件映射与同步机制
4.2.1内存文件映射实现管理代理与监控模块之间通信
管理代理与应用程序实例的监控模块之间的数据交换采用内存文件映射这种进程间的通信方式。管理代理的文件映射和文件映射视图的创建代码如下:
handle h_filemap; //内存文件映射句柄
handle h_localmapview; //内存文件映射视图句柄
//创建内存文件映射对象,有读写权限,对象名为proxyfilemap
h_filemap=createfilemapping((handle)0xffffffff, null, page_readwrite, 0, viewsize, "proxyfilemap");
if (h_filemap==null)
{afxmessagebox("create local file map error!");
return false;}//创建内存文件映射视图
if((h_localmapview=mapviewoffile(h_filemap,file_map_all_access,0,0,0))==null)
{afxmessagebox("create local map view error!");
return false;}
管理代理启动后,在其内存文件映射视图中写入自己的窗口句柄,供各个应用程序实例读取。监控模块初始化时,从管理代理的内存文件映射视图中得到管理代理的窗口句柄,向管理代理的内存文件映射视图中写入自己的内存文件映射对象名,并发送请求注册消息给管理代理。管理代理收到消息后,从自己的内存文件映射视图中读出应用程序实例的内存映射文件对象名,创建应用程序实例内存文件映射视图[9]。代理和监控模块的通信通过读写内存文件映射视图和互相发送消息实现。
4.2.2同步机制
管理代理和监控模块通过对内存映射文件进行读操作和写操作来完成数据交换。由于存在多个独立的应用程序实例进程,它们可能同时对管理代理进行写操作。可能存在这样的情况:当一个应用程序的实例向管理代理的内存文件中写入数据,并通知管理代理读取时,另外一个应用程序的实例也在做同样的写操作,它写入的数据将前一次写入的数据覆盖了。当管理代理响应消息从内存文件中读入时,得到的是第二个应用程序实例的数据,第一个应用程序实例写入的数据已丢失了。在应用程序实例的内存文件上也存在类似的情况:当一个应用程序实例连续向内存文件中写入时,管理代理可能还来不及对第一次写入的数据进行读取,第二次的写入已经将第一次写入的内容覆盖了。在对内存文件的读写过程中引入同步机制是必要的。程序中采用的同步机制是信号灯机制[9]。
在管理代理上为内存文件创建信号灯:
/*创建信号灯,信号灯名为proxymapviewsemaphore ,初始计数为1,最大计数也是1,h_semaccessmapview为该信号灯的句柄*/
h_semaccessmapview=createsemaphore(null,1,1,"proxymapviewsemaphore");
在监控模块中,打开这个信号灯:
/*打开名为proxymapviewsemaphore 的信号灯,h_semaccessmapview为信号灯句柄*/
h_semaccessmapview=opensemaphore(semaphore_all_access,false, "proxymapviewsemaphore");
监控模块每次对管理代理内存文件写操作前,均要等待信号灯的信号:
/*等待信号灯h_semaccessmapview的信号,知道信号灯为有信号时才返回*/
::waitforsingleobject(h_semaccessmapview,infinite);
//对管理代理内存文件映射的写操作管理代理在每次对内存文件进行读操作后,都要增加信号灯的计数:
//对内存文件的读操作
//增加信号灯h_semaccessmapview的计数,每次增加1
releasesemaphore(h_semaccessmapview,1,null);
5结束语
在对snmp中mib信息和协议数据单元扩充的基础上,设计并实现了面向应用软件的 网络 监控系统。该系统提供了对应用程序类中成员变量和成员函数的监控功能。
参考 文献 :
[1]唐亚哲,张鹏,李增智,等. diinms分布智能网络管理系统的设计与实现[j].小型微型 计算 机系统 ,2002,23(8):926-929.
[2]田力威,尹朝万.基于corba的智能网络管理系统的结构及实现[j].小型微型计算机系统,2002,23(7):810-813.[3]hunter, philip.integrated security and network management remain elusive[j].network security,2004,10(6):15-16.
[4]bhutani,kiran r,khan,et al.optimal distribution of a hierarchy of network management agents[j]. information sciences,2003,149(4):235-248.
[5]费洪晓,康松林,施荣华.基于snmp的网络应用软件监控系统的设计与实现[j].计算机工程与应用,2004,40(15): 122-125.
[6]康松林,费洪晓,施荣华.网络应用软件监控系统监控模块的设计与实现[j].中南大学学报: 自然 科学 版,2004,35(6):993-997.
[7]罗雪松,罗蕾,许子辛.嵌入式snmp agent的设计与实现[j].计算机应用 研究 ,2004,21(10):220-222.
[8]douglas e c, david l s.internetworking with tcp/ip vol ii:design,implementation, and internals[m].北京:清华大学出版社,1998:95-126.
[9]douglas e c, david l s. internetworking with tcp/ip vol iii:client-server programming and applications[m].windows sockets version.北京:清华大学出版社,1998:147-183.