摘要:詳細介紹了面向應(yīng)用軟件的網(wǎng)絡(luò)監(jiān)控系統(tǒng)管理信息存儲與傳輸優(yōu)化設(shè)計過程,包括三種存儲設(shè)計方案及其優(yōu)缺點的比較,內(nèi)存映射文件的存儲數(shù)據(jù)結(jié)構(gòu)設(shè)計,三種可逆轉(zhuǎn)換規(guī)則的分析與比較以及根據(jù)優(yōu)化的可逆轉(zhuǎn)換規(guī)則設(shè)計的二叉樹遍歷和恢復(fù)算法等。通過優(yōu)化的存儲與傳輸設(shè)計,實時、高效地完成了監(jiān)控信息的傳輸與交換。
關(guān)鍵詞:優(yōu)化存儲; 內(nèi)存文件映射; 可逆轉(zhuǎn)換規(guī)則; 二叉樹遍歷算法; 二叉樹恢復(fù)算法
中圖分類號:TP393文獻標志碼:A
文章編號:1001-3695(2008)04-1111-03
0引言
隨著網(wǎng)絡(luò)規(guī)模的增大,網(wǎng)絡(luò)結(jié)構(gòu)及網(wǎng)絡(luò)應(yīng)用日漸復(fù)雜,傳統(tǒng)的物理安全技術(shù)和措施已經(jīng)不足以保證信息系統(tǒng)的安全了,因此網(wǎng)絡(luò)管理系統(tǒng)作為網(wǎng)絡(luò)安全運行的保證,其重要性越來越突出。為了提高計算機網(wǎng)絡(luò)信息安全,許多相關(guān)的網(wǎng)絡(luò)安全產(chǎn)品被開發(fā),但大多是基于網(wǎng)絡(luò)硬件設(shè)備,如路由器、集線器、交換機等,而對網(wǎng)絡(luò)應(yīng)用軟件的研究和開發(fā)相對較少[1,2]。為了保證網(wǎng)絡(luò)環(huán)境中的應(yīng)用程序正常高效地運行,筆者設(shè)計了基于簡單網(wǎng)絡(luò)管理協(xié)議(simple network management protocol,SNMP)的網(wǎng)絡(luò)應(yīng)用軟件監(jiān)控系統(tǒng)(application software net monitoring system,ASNMS)。該系統(tǒng)選擇運行于網(wǎng)絡(luò)環(huán)境中的應(yīng)用程序為研究對象[3,4],對SNMP中MIB
(management information base,管理信息庫)信息和協(xié)議數(shù)據(jù)單元進行擴充,實現(xiàn)了對網(wǎng)絡(luò)中運行的應(yīng)用程
序類中成員變量和成員函數(shù)的監(jiān)控。
1網(wǎng)絡(luò)應(yīng)用軟件監(jiān)控系統(tǒng)
網(wǎng)絡(luò)應(yīng)用軟件監(jiān)控系統(tǒng)的主要監(jiān)控目標是網(wǎng)絡(luò)中的應(yīng)用軟件,通過及時獲取軟件中重要變量值(如系統(tǒng)配置、狀態(tài)指示等),從而及時了解整個網(wǎng)絡(luò)中應(yīng)用程序的狀態(tài),并且還可以通過管理站點對各受控站點中的應(yīng)用程序進行控制操作,提高整個網(wǎng)絡(luò)和應(yīng)用系統(tǒng)的安全性。
該網(wǎng)絡(luò)應(yīng)用軟件監(jiān)控系統(tǒng)主要有三個模塊[4]:
a)管理站點主程序。該程序在管理站點上運行。通過該程序,管理站點可以使用UDP/IP協(xié)議與管理范圍內(nèi)的所有受控站點進行通信,收集網(wǎng)絡(luò)應(yīng)用程序的監(jiān)控信息,并下發(fā)各種控制命令。
b)管理代理。每一個受控站點上運行一個管理代理程序(有且僅有一個)。管理代理是系統(tǒng)的通信中心。一方面,通過內(nèi)存映射文件與受控站點上的各應(yīng)用程序?qū)嵗M行通信,收集各應(yīng)用程序?qū)嵗谋O(jiān)控信息;另一方面,通過UDP協(xié)議與管理站點通信,發(fā)送受控站點的管理信息以及轉(zhuǎn)發(fā)管理站點的控制命令。
c) 監(jiān)控模塊。該模塊是供軟件開發(fā)人員使用的一個通用接口模塊。它負責從受控應(yīng)用程序中獲取監(jiān)控信息,發(fā)送到管理站點,并且也能接收從管理代理轉(zhuǎn)發(fā)的管理站點命令,對受控應(yīng)用程序執(zhí)行一定的控制操作。從結(jié)構(gòu)上來看,監(jiān)控模塊附屬于受控應(yīng)用程序,但它以單獨的線程形式存在。
2管理信息存儲的設(shè)計
2.1存儲設(shè)計方案比較與選擇
為了監(jiān)控模塊工作的需要,同時為了能更方便地將監(jiān)控信息傳送給管理代理,監(jiān)控模塊需要將監(jiān)控信息以一定的形式存儲起來,監(jiān)控模塊監(jiān)控的目標是應(yīng)用程序中的變量。由于現(xiàn)在軟件開發(fā)大多使用的是面向?qū)ο蟮姆椒ǎ谄涑绦蛑懈鞣N變量是有層次結(jié)構(gòu)關(guān)系的,這一點必須在監(jiān)控信息中體現(xiàn)出來。監(jiān)控信息從邏輯上看應(yīng)該是以樹的形式存在的。并且因為存儲的是各種變量的信息,而變量的長度是不相同的,在這棵樹中各個節(jié)點的空間大小有可能也不相同。由此看來,無論是從存儲內(nèi)容上還是從邏輯結(jié)構(gòu)上看,監(jiān)控信息的存儲結(jié)構(gòu)都是相對較為復(fù)雜的。筆者認為下面三種設(shè)計方案可以滿足這樣的要求:
a)在監(jiān)控模塊內(nèi)存空間中生成一棵二叉樹。
這是最常規(guī)的存儲方法。在此情況下,只需要設(shè)計一個較為合理的樹結(jié)構(gòu),二叉樹就能直接存儲在監(jiān)控模塊的內(nèi)存空間中,訪問方便。同時因為在許多語言中都有任意類型的數(shù)據(jù)類型,由此可以將不同數(shù)據(jù)類型的數(shù)據(jù)方便地存儲在一種數(shù)據(jù)結(jié)構(gòu)中[5]。由于這棵樹存在于監(jiān)控模塊的內(nèi)存空間中,不方便管理代理程序?qū)?/p>
其讀取,監(jiān)控模塊還需要通過一定的方法將該樹傳送給管理代理。其優(yōu)點是實現(xiàn)簡單,監(jiān)控模塊可以很方便地對其進行讀寫操作;其缺點是不方便管理代理程序?qū)ΡO(jiān)控信息讀取,需要使用其他方法將信息傳送給管理代理。
b)將監(jiān)控信息存儲在磁盤文件中。
為了解決管理代理和監(jiān)控模塊共享監(jiān)控信息的問題,監(jiān)控模塊可以將監(jiān)控信息存儲為磁盤文件形式。在此情況下,需要設(shè)計一套完整合理的文件空間使用策略,保證能夠完整地存儲監(jiān)控信息。由于在Windows程序中采用了虛擬內(nèi)存策略,不同應(yīng)用程序內(nèi)存空間是不同的,即使某應(yīng)用程序獲取了另一個程序中的某個指針,也不能正確地訪問到其數(shù)據(jù)[6]。由此,在對變量值進行存儲時,一定要注意不能存儲有關(guān)變量的指針信息,而應(yīng)該想辦法存儲其中變量的實際數(shù)據(jù)。同時因為是將監(jiān)控信息存儲于磁盤上,因此需要采取一定的措施盡量避免出現(xiàn)垃圾文件的情況,同時還要防止在工作狀態(tài)下用戶有意或無意地修改、刪除該文件。其優(yōu)點是多個程序可以方便地共享數(shù)據(jù);其缺點是實現(xiàn)較復(fù)雜,容易產(chǎn)生垃圾文件,容易泄漏和丟失監(jiān)控信息。
c)將監(jiān)控信息存儲在內(nèi)存文件映射中。
這是對方案二的改進。方案二將監(jiān)控信息存儲于磁盤文件中,由此使得容易產(chǎn)生垃圾文件、容易泄漏和丟失監(jiān)控信息。如何將監(jiān)控信息直接存儲在內(nèi)存中呢?采用內(nèi)存文件映射是一個解決的好辦法,應(yīng)用程序在需要時在內(nèi)存中開辟一定的空間存儲數(shù)據(jù)。當應(yīng)用程序關(guān)閉后,由于操作系統(tǒng)的內(nèi)存管理機制,內(nèi)存文件將自動被回收,安全性高。但是在生成內(nèi)存映射文件時,必須要指定文件的大小,此時如果處理不當將可能出現(xiàn)存儲空間不夠用的情況。其優(yōu)點是多個程序可以方便地共享數(shù)據(jù),數(shù)據(jù)不易泄漏,安全性高;其缺點是實現(xiàn)較復(fù)雜,必須指定文件大小,處理不當可能出現(xiàn)空間不夠用的情況。
綜合三種方案,筆者認為方案三是最合適的。只要指定足夠的文件大小,它不僅滿足監(jiān)控模塊存儲管理信息的需要,信息安全性高,同時可方便地實現(xiàn)監(jiān)控模塊和管理代理間實時信息交換的功能。
2.2內(nèi)存映射文件存儲數(shù)據(jù)結(jié)構(gòu)設(shè)計
為了能存儲完整的變量結(jié)構(gòu)信息,可將監(jiān)控信息的邏輯存儲結(jié)構(gòu)設(shè)計為如圖1所示。在監(jiān)控信息的邏輯結(jié)構(gòu)中存在兩種結(jié)構(gòu)指針,橫向指針表示父子關(guān)系,縱向指針表示兄弟關(guān)系,由此而構(gòu)成了一棵二叉樹。
在圖1所示結(jié)構(gòu)中,由于不同變量類型存儲大小不同,從而導致二叉樹中各個節(jié)點的大小不統(tǒng)一。為了方便地進行存儲空間管理,同時又能準確完整地記錄如上變量結(jié)構(gòu)信息,筆者設(shè)計了一套內(nèi)存映射文件的存儲數(shù)據(jù)結(jié)構(gòu)。其基本思想是將數(shù)據(jù)本身與數(shù)據(jù)間的邏輯關(guān)系分開進行處理[6],每次根據(jù)實際使用的需要在文件空閑空間中分配相應(yīng)大小的空間,并在該空間的起始位置生成一個空間信息記錄。其中包括存放的變量類型、變量大小、變量指針、結(jié)構(gòu)指針等數(shù)據(jù)信息。此外還包括了該空間的地址、前后相鄰區(qū)域地址、本空間大小等空間管理信息。真正的記錄數(shù)據(jù)實體存放在該空間信息記錄之后的剩余空間中(剩余空間的大小可以是不同的)。文件的存儲結(jié)構(gòu)如圖2所示。
由圖2可以看出,在監(jiān)控信息存儲文件中,所有的存儲空間都是前后緊連著的,通過空間信息記錄可以得知某區(qū)域的大小以及是否正在被使用,這樣能夠方便地進行空間分配和回收工作。又因為在空間信息記錄中存在變量結(jié)構(gòu)指針,因而通過空間信息記錄也能方便地訪問到數(shù)據(jù)間的邏輯結(jié)構(gòu)關(guān)系。
3管理信息傳輸?shù)脑O(shè)計
3.1可逆轉(zhuǎn)換規(guī)則的分析與比較
ASNMS設(shè)計中,管理信息庫MIB的組織方式采取類似于SNMP的管理信息組織方式,對于MIB中管理對象的存儲采用二叉樹的存儲方式。在管理站點與管理代理、管理代理與監(jiān)控模塊間通信過程中,都要用到將整個MIB進行傳輸,可能是同一機器進程間傳輸,也可能是不同機器間網(wǎng)絡(luò)傳輸。要對二叉樹進行正確傳輸,必須將二叉樹以特定的規(guī)則轉(zhuǎn)換成一個線性序列,將這個線性序列傳輸?shù)侥康牡睾螅侔凑仗囟ㄒ?guī)則的逆規(guī)則將這一線性序列重新生成一棵與原來一樣的二叉樹。轉(zhuǎn)換規(guī)則的選擇有很多,只要這個規(guī)則可逆就可以了。一般所用的二叉樹遍歷方法(如前序遍歷、中序遍歷、后序遍歷等)雖然可以將二叉樹轉(zhuǎn)換成線性結(jié)構(gòu),但這些方法都是不可逆的,即無法從線性結(jié)構(gòu)再恢復(fù)到原來的二叉樹形式,因此無法使用。
下面介紹三種可逆轉(zhuǎn)換規(guī)則:
a)將二叉樹以兩種不同的遍歷方式(如后序遍歷和中序遍歷)遍歷后的線性結(jié)果進行傳送,在目的地利用這兩種遍歷方式,將線性結(jié)果恢復(fù)成原來的二叉樹。這種方式的不利之處在于將遍歷結(jié)果傳送了兩次。一般情況下,MIB的信息量均比較大,傳送其遍歷結(jié)果需要占據(jù)比較大的網(wǎng)絡(luò)帶寬[7],傳送兩次所帶來的浪費是相當可觀的,勢必影響系統(tǒng)的效率。
b)將二叉樹按照滿二叉樹的形式補足節(jié)點,再按照層次從二叉樹的根開始逐層遍歷到樹葉節(jié)點。一般情況下,MIB樹都不是很規(guī)則[8],要補足成滿二叉樹形式所造成的浪費也很大。
c)由于ASNMS的MIB中管理對象節(jié)點在內(nèi)存中時,要么是度為2的節(jié)點,要么就是葉子節(jié)點,可將二叉樹以一種遍歷方式進行遍歷(如前序遍歷、中序遍歷、后序遍歷等),但在遍歷時對葉子節(jié)點加上空節(jié)點信息,在目的地根據(jù)空節(jié)點信息將遍歷結(jié)果恢復(fù)成原來的二叉樹形式。這種方案是用于傳輸MIB監(jiān)控信息較優(yōu)的可逆轉(zhuǎn)換規(guī)則。簡單的例子如圖3所示:根據(jù)二叉樹遍歷算法,由(a)二叉樹可以得到(b)的線性序列,根據(jù)二叉樹恢復(fù)算法,可以將(b)的線性序列恢復(fù)成(a)的二叉樹。采用這種方法,對網(wǎng)絡(luò)帶寬和存儲空間的浪費都比較小,效率得到了提高。
3.2三種可逆轉(zhuǎn)換規(guī)則算法空間復(fù)雜度的比較
具有n個節(jié)點的完全二叉樹,一定有(n+1)/2個葉子節(jié)點。若采用第一種可逆轉(zhuǎn)換規(guī)則算法,那么需要占用2n個非空節(jié)點的存儲空間;若采用第三種可逆轉(zhuǎn)換規(guī)則算法,只需要占用n個非空節(jié)點,以及(n+1)個空節(jié)點的存儲空間,而空節(jié)點所占用的存儲空間遠遠小于非空節(jié)點所占用的存儲空間。因此,第三種算法比第一種算法至少會節(jié)省n/2個非空節(jié)點的存儲空間。
具有n個節(jié)點的單枝二叉樹,只有一個葉子節(jié)點。若采用第二種可逆轉(zhuǎn)換規(guī)則算法,那么需要占用n個非空節(jié)點,以及(2n-n-1)個空節(jié)點的存儲空間;若采用第三種可逆轉(zhuǎn)換規(guī)則算法,只需要占用n個非空節(jié)點,以及兩個空節(jié)點的存儲空間。因此,第三種算法比第二種算法節(jié)省了(2n-n-3)個空節(jié)點的存儲空間。
由以上分析得出,采用第三種算法比前兩種算法幾乎節(jié)省n/2個節(jié)點的存儲空間,傳送一棵二叉樹的遍歷結(jié)果,幾乎節(jié)省一半的網(wǎng)絡(luò)帶寬。
3.3二叉樹的遍歷算法
根據(jù)優(yōu)化的可逆轉(zhuǎn)換規(guī)則設(shè)計的二叉樹遍歷算法如下:
//遍歷二叉樹
CString CMCWnd::MibTreeToString()
{CString string=\"\";
//二叉樹復(fù)位
MibTree .Reset();
//遞歸訪問二叉樹,并將訪問結(jié)構(gòu)記錄在string中
VisitTree(MibTree .GetNode(),string);
//返回結(jié)構(gòu)string——遍歷后形成的線性結(jié)構(gòu)
return string;}
//遞歸訪問函數(shù),node是要訪問的二叉樹的根節(jié)點
void CMCWnd::VisitTree(BTreeNode *node,CString string)
{ //將訪問到的二叉樹節(jié)點的名字加入線性結(jié)構(gòu)中
string=string+node->GetMember().Name;
if (node->GetLChild()!=NULL)
//訪問節(jié)點的左子樹
VisitTree(node->GetLChild(),string);
else
//添加空節(jié)點信息
string=string+\"*\";
if (node->GetRChild()!=NULL)
//訪問節(jié)點的右子樹
VisitTree(node->GetRChild(),string);
else
//添加空節(jié)點信息
string=string+\"*\";}
3.4二叉樹的恢復(fù)算法
根據(jù)優(yōu)化的可逆轉(zhuǎn)換規(guī)則設(shè)計的二叉樹恢復(fù)算法如下:
//恢復(fù)二叉樹
void CMCWnd::StringToMib(CString string)
{int length=string .GetLength();
int num=0;
//二叉樹清空
MibTree .Empty();
//遞歸建立二叉樹
CreateTree(\"\" ,string.GetBuffer
(string.GetLength()) ,num ,length);}
/*遞歸建立二叉樹函數(shù),path所要創(chuàng)建的二叉樹的根節(jié)點的哈夫曼路徑*/
//str為線性數(shù)組,num為當前所訪問的線性數(shù)組元素的下標
//length為線性數(shù)組的長度
void CMCWnd::CreateTree(CString path,char *str,int num,int length)
{ if(num if(str[num]!=′*′) { //加入新節(jié)點,新節(jié)點的名字是str[num],哈夫曼路徑為path MibTree.InsertNode(path,str[num]); num++; //加入左子樹 CreateTree(path+\"0\",str,num,length); //加入右子樹 CreateTree(path+\"1\",str,num,length);} } 4結(jié)束語 1)在對SNMP中MIB信息和協(xié)議數(shù)據(jù)單元擴充的基礎(chǔ)上,設(shè)計并實現(xiàn)了面向應(yīng)用軟件的網(wǎng)絡(luò)監(jiān)控系統(tǒng)。該系統(tǒng)提供了對應(yīng)用程序類中成員變量和成員函數(shù)的監(jiān)控功能。 2)詳細介紹了網(wǎng)絡(luò)應(yīng)用軟件監(jiān)控系統(tǒng)中管理信息存儲與傳輸?shù)膬?yōu)化設(shè)計過程。其中包括:a)三種存儲設(shè)計方案(在監(jiān)控模塊內(nèi)存空間中生成一棵二叉樹、將監(jiān)控信息存儲在磁盤文件中、將監(jiān)控信息存儲在內(nèi)存文件映射中)及其優(yōu)缺點的比較;b)內(nèi)存映射文件的存儲數(shù)據(jù)結(jié)構(gòu)設(shè)計;c)三種可逆轉(zhuǎn)換規(guī)則的分析與比較;d)根據(jù)優(yōu)化的可逆轉(zhuǎn)換規(guī)則設(shè)計的二叉樹遍歷和恢復(fù)算法等。 3)通過優(yōu)化的存儲與傳輸設(shè)計,實時、高效地完成了監(jiān)控信息的傳輸與交換。 參考文獻: [1]唐亞哲,張鵬,李增智,等.DIINMS分布智能網(wǎng)絡(luò)管理系統(tǒng)的設(shè)計與實現(xiàn)[J].小型微型計算機系統(tǒng),2002,23(8):926-929. [2]HUNTER, PHILIP. Integrated security and network management remain elusive[J]. Network Security, 2004,10(6):15-16. [3]林立新,蔣新華,陳特放.網(wǎng)絡(luò)監(jiān)控原理及實現(xiàn)[J].計算機工程,2004,30(7):92-94. [4]COMER D E, STEVENS D L.用TCP/IP進行網(wǎng)際互聯(lián)2卷:設(shè)計、實現(xiàn)與內(nèi)核[M].趙剛,林瑤,蔣慧,等譯.北京:電子工業(yè)出版社,2001. [5]MARK A, MILLER P E.用SNMP管理互聯(lián)網(wǎng)絡(luò)[M].晏明峰,李靜,晏峻峰,譯.3版.北京:中國水利水電出版社,2001:63-204. [6]唐浩,王振興,聶劍威.基于消息服務(wù)器的路由器網(wǎng)絡(luò)管理[J].計算機應(yīng)用研究,2005,22(11):169-170. [7]董文莉,孟洛明.基于XML和消息隊列的網(wǎng)絡(luò)管理信息交互方案[J].計算機應(yīng)用研究,2005,22(8):24-26. [8]FREY J, TANNENBAUM T, LIVNY M, et al. Condor-G: a computation management agent for multi-institutional grids[C]//Proc of the 10th International Symposium on High Performance Distributed Computing(HPDC-10). San Francisco:IEEE Press,2001:55-63. “本文中所涉及到的圖表、注解、公式等內(nèi)容請以PDF格式閱讀原文”