劉存才,梁 禹,袁 舒
(1.中國電子科技集團公司第五十四研究所,河北 石家莊 050081;2.中國人民解放軍32180部隊,北京 100072)
在數(shù)字通信領(lǐng)域中,信息與通信網(wǎng)絡(luò)發(fā)揮著重要的作用。隨著信息戰(zhàn)的快速發(fā)展,數(shù)字通信網(wǎng)的組成越來越復雜,對網(wǎng)絡(luò)類復雜系統(tǒng)的依賴性越來越大,時延精度要求越來越高[1]。然而,一般實驗室里的通信環(huán)境缺少對實際通信拓撲的模擬,而且實裝通信設(shè)備對實時性要求非常高,因此亟需一種通信系統(tǒng)模擬器[2]來對數(shù)字通信網(wǎng)進行合理的模擬,在不改變實裝通信設(shè)備的設(shè)計基礎(chǔ)上,提供高精度的時延服務(wù)[3]。
目前,大部分針對數(shù)字通信系統(tǒng)的模擬器都是同實裝通信設(shè)備一起研制[4],在需求上統(tǒng)一進行分析論證,或多或少都需要在實裝通信設(shè)備中進行相關(guān)設(shè)計[5],而且同實裝通信綁定的模擬器往往局限于特定的適用場景,很難擴展到其他領(lǐng)域[6]。因此需要設(shè)計一種通用的適用于定型之后的通信設(shè)備且對實裝通信設(shè)備無感的通信系統(tǒng)模擬器。
本文針對數(shù)字通信系統(tǒng)設(shè)計了一種數(shù)字模擬器,能夠模擬數(shù)字通信基礎(chǔ)網(wǎng)的能力,為網(wǎng)絡(luò)信息體系各通信設(shè)備節(jié)點之間通過不同介質(zhì)、不同帶寬和不同背景流量情況下傳輸信息提供時間延遲等通信效果支持,模擬通信傳輸全流程,支撐數(shù)字通信網(wǎng)絡(luò)信息體系全數(shù)字仿真。同時提出了一種基于HOOK[7]SOCKET[8]的設(shè)計,不對實裝通信設(shè)備進行任何更改,使得通信設(shè)備間進行無感操作,提供通信設(shè)備間按需按時的業(yè)務(wù)傳輸服務(wù)。
通信系統(tǒng)數(shù)字模擬器包括主機和端機兩部分,其中,主機指通信系統(tǒng)數(shù)字模擬器的主體軟件部分,部署在獨立的服務(wù)器上,用于提供通信網(wǎng)絡(luò)模擬服務(wù)。端機指分布在各模擬通信節(jié)點上的通信模擬代理軟件,主要用于為實裝通信設(shè)備間的信息傳輸提供通信延遲。通信模擬器主機、端機以及模擬通信節(jié)點之間的連接關(guān)系如圖1所示。
通信系統(tǒng)數(shù)字模擬器系統(tǒng)運行在由交換機、路由器等構(gòu)成的綜合試驗床網(wǎng)絡(luò)環(huán)境中,其中主機通過試驗網(wǎng)絡(luò)與所有模擬通信節(jié)點相連,端機軟件嵌入到每個模擬通信節(jié)點設(shè)備中。
圖1 通信系統(tǒng)數(shù)字模擬器系統(tǒng)組成
通信系統(tǒng)數(shù)字模擬器功能組成如圖2所示。
圖2 通信系統(tǒng)數(shù)字模擬器功能組成
1.2.1 模擬器主機
模擬器主機用于模擬數(shù)字通信網(wǎng)絡(luò),為模擬通信節(jié)點之間的信息傳輸提供通信延遲、界面顯示以及數(shù)據(jù)統(tǒng)計。主要包括:配置與初始化、業(yè)務(wù)生成、通信路由、時延計算、資源管理、數(shù)據(jù)處理、統(tǒng)計評估和通信[9]。
配置與初始化模塊:基于想定和模擬通信節(jié)點的部署情況,配置通信網(wǎng)絡(luò)[10],包括骨干網(wǎng)拓撲、模擬通信節(jié)點接入點與接入方式等;設(shè)置各種參數(shù)[11],包括位置、帶寬、背景流量、節(jié)點地址、模擬通信節(jié)點接入時延、用于離線工作方式時的業(yè)務(wù)流量矩陣和業(yè)務(wù)分布等參數(shù)等初始化操作。
業(yè)務(wù)生成模塊:該模塊用于離線工作方式,在離線工作方式時,模擬器的業(yè)務(wù)生成模塊按想定生成模擬通信節(jié)點之間的通信業(yè)務(wù),驅(qū)動通信模擬器運行[12],模擬結(jié)果存入數(shù)據(jù)庫;而在在線工作方式時,模擬通信節(jié)點實時發(fā)送待傳信息的摘要信息完成業(yè)務(wù)驅(qū)動,模擬結(jié)果實時反饋給目的端機。
通信路由模塊:基于SPF路由算法[13]對每個節(jié)點產(chǎn)生到所有其他節(jié)點的初始化備選路由[14],同時基于當前數(shù)據(jù)包的源和目的地址、鏈路資源狀態(tài)等,動態(tài)計算出通信路由[15]。
時延計算模塊:基于通信業(yè)務(wù)信息和通信路由,模擬產(chǎn)生通信延遲τ,該通信延遲涵蓋排隊時延、傳輸時延、傳播時延和處理時延[16]。
通信資源管理模塊:實現(xiàn)網(wǎng)絡(luò)資源的占用與釋放等動態(tài)變化與記錄,主要為節(jié)點隊列資源管理[17]。
數(shù)據(jù)處理模塊:完成數(shù)據(jù)存儲功能,對通過通信系統(tǒng)數(shù)字模擬器主機的信息交互內(nèi)容按格式進行記錄并保存,包括業(yè)務(wù)摘要、主機發(fā)送消息及返回消息;匹配端機返回的時間信息,判斷時序關(guān)系并分支處理。
統(tǒng)計評估模塊:統(tǒng)計各種數(shù)據(jù),包括業(yè)務(wù)傳輸成功率、時序判斷和平均通信時延等等,進行通信評估。
通信顯示模塊:提供可視化的通信網(wǎng)模擬界面功能,顯示網(wǎng)絡(luò)拓撲、路由信息、狀態(tài)輸出信息、業(yè)務(wù)信息以及統(tǒng)計評估數(shù)據(jù)等信息。
1.2.2 模擬器端機
模擬器端機用于為模擬通信節(jié)點之間的信息傳輸提供通信效果加載。主要包括參數(shù)管理、收發(fā)代理、消息映射以及時序處理模塊。
參數(shù)管理模塊:負責端機軟件部分的諸如主機/端機IP地址、端口號和在線離線工作方式等參數(shù)配置。
收發(fā)代理模塊:實現(xiàn)模擬通信節(jié)點的真實信息的收發(fā)和信息緩存處理。即在信源端,模擬通信節(jié)點生成真實數(shù)據(jù)時,將提取并產(chǎn)生的摘要信息傳給通信模擬器主機;在信宿端,接收信源模擬通信節(jié)點發(fā)送的真實數(shù)據(jù)包并進行緩存。
消息映射模塊:接收到主機發(fā)送的通信時延值時,根據(jù)主機傳遞的通信信息與緩存數(shù)據(jù)進行匹配,實現(xiàn)該時延值與某緩存數(shù)據(jù)包的映射。
時序處理模塊:根據(jù)映射結(jié)果,判斷時序關(guān)系并進行分支處理。時序正常時,在相應(yīng)時間點將真實數(shù)據(jù)包遞交給模擬通信節(jié)點;時序關(guān)系不滿足時,立即遞交真實數(shù)據(jù)包給目的通信節(jié)點,并且記錄異常時序信息。
通信系統(tǒng)數(shù)字模擬器系統(tǒng)流程主要分為試驗準備、試驗執(zhí)行以及結(jié)果展示與分析3個階段,由模擬通信節(jié)點、模擬器主機以及端機共同完成全流程,如圖3所示。
圖3 通信系統(tǒng)數(shù)字模擬器系統(tǒng)流程
1.3.1 試驗準備階段
在試驗準備階段,通信系統(tǒng)數(shù)字模擬器系統(tǒng)中的主機和端機分別進行相應(yīng)的初始化工作。主機按照初始化配置文件中的試驗想定內(nèi)容完成通信網(wǎng)絡(luò)想定編輯(包括網(wǎng)絡(luò)拓撲、模擬通信節(jié)點部署與接入等),并進行相關(guān)屬性配置(包括帶寬、背景流量、路由協(xié)議、接入時延和地址信息等各種參數(shù)和屬性),端機通過讀取試驗運控臺下發(fā)的初始化配置文件完成地址設(shè)置等初始化工作。
1.3.2 試驗執(zhí)行階段
待系統(tǒng)初始化運行后進行業(yè)務(wù)驅(qū)動,各模擬通信節(jié)點開始進行各自數(shù)據(jù)的發(fā)送與接收,模擬通信節(jié)點在發(fā)送數(shù)據(jù)的同時將摘要信息發(fā)送給通信系統(tǒng)數(shù)字模擬器主機。
通信系統(tǒng)數(shù)字模擬器主機接收到待傳輸信息的摘要信息后,映射到邏輯拓撲的源和目的并作為一條邏輯業(yè)務(wù)驅(qū)動通信網(wǎng)模擬運行,自動尋找通信路由,結(jié)合需傳輸信息情況、路由、當前背景流量和信道特性等,計算得出該信息傳輸所需要的延時,并將時延消息打包發(fā)送給目的通信節(jié)點的端機軟件。同時,在該業(yè)務(wù)驅(qū)動過程中管理網(wǎng)絡(luò)節(jié)點、鏈路等通信資源的占用與釋放,最后通信系統(tǒng)數(shù)字模擬器主機將相關(guān)資源信息進行存儲。
模擬目的通信節(jié)點的端機軟件收到模擬源通信節(jié)點發(fā)送的業(yè)務(wù)信息后首先進行緩存,待收到主機發(fā)送的通信時延消息后,與緩存的業(yè)務(wù)信息進行映射,找到與之匹配的業(yè)務(wù)信息,進行時序判斷與處理,等滿足延時要求后將該業(yè)務(wù)信息遞交給目的模擬通信節(jié)點。
1.3.3 結(jié)果展示與分析
根據(jù)存儲的試驗運行資源數(shù)據(jù)信息,一方面,能夠進行數(shù)據(jù)展示和通信顯示;另一方面,能夠?qū)ο嚓P(guān)信息進行統(tǒng)計、分析與評估,得到本次試驗任務(wù)的分析評估結(jié)果。
實驗室里的模擬通信節(jié)點大部分為實裝通信設(shè)備,這些設(shè)備經(jīng)過試驗定型后是不能夠?qū)ζ浯a設(shè)計進行任何的更改,為了達到目的通信設(shè)備在相應(yīng)的延時值收到業(yè)務(wù)信息,需要將發(fā)出的業(yè)務(wù)進行截取以及緩存,而HOOK(掛鉤)能夠做到通信設(shè)備間的無感操作,能夠有效地截取源通信設(shè)備發(fā)出的業(yè)務(wù)包。
截取發(fā)送業(yè)務(wù)包的關(guān)鍵在于鉤取SOCKET信息,由于WINDOWS預設(shè)的消息類型中沒有直接有關(guān)SOCKET的鉤子定義,因此,需要對SOCKET的HOOK進行相應(yīng)的設(shè)計。一種可行的思想是將socket api的函數(shù)入口與所要截取處理的函數(shù)入口進行替換,即系統(tǒng)檢測到發(fā)送socket消息時,首先進入自己的處理函數(shù)中,等待處理完畢后,再調(diào)用真正的底層socket api的函數(shù)發(fā)送該消息。
HOOK程序需要放到動態(tài)鏈接庫中進行執(zhí)行,在動態(tài)鏈接庫DLL[18]的DLL_PROCESS_ATTACH初始化中,需要將socket api的函數(shù)入口與自處理程序入口進行替換。
以UDP[19]的發(fā)送消息為例,需要執(zhí)行函數(shù)hookapi(“ws2_32.dll”,“sendto”,(DWORD)MySendto,&sendtoapi)。其中,hookapi函數(shù)以及MySendto函數(shù)為自定義函數(shù),調(diào)用系統(tǒng)GetProcAddress、OpenProcess以及WriteProcessMemory等函數(shù)將“ws2_32.dll”中的“sendto”函數(shù)入口替換為MySendto函數(shù)入口。這樣一旦系統(tǒng)檢測到調(diào)用sendto函數(shù)時,就會首先跳轉(zhuǎn)到自定義的MySendto函數(shù)中進行處理。
只有當用戶手動選擇開啟鉤子時,才會對發(fā)送的業(yè)務(wù)進行截取,此時調(diào)用系統(tǒng)函數(shù)g_hHook=SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)Hook,g_hinstDll,0),開始安裝SOCKET鉤子。其中g(shù)_hHook為鉤子過程的句柄;WH_GETMESSAGE表示安裝一個鉤子過程對發(fā)送到消息隊列的消息進行監(jiān)視;HOOK為自定義的鉤子過程,在該過程中只需要調(diào)用系統(tǒng)函數(shù)CallNextHookEx(g_hHook,nCode,wParam,lParam)直接將鉤子信息傳遞給鉤子鏈中下一個等待接收的信息即可[20];g_hinstDll為指向鉤子過程所在的DLL句柄,該值在DLL初始化時賦值為安裝鉤子過程的代碼所在的DLL的句柄;由于要截取所有進程發(fā)送的業(yè)務(wù)消息,因此,需要將該鉤子程序設(shè)置為全局鉤子,即將指定與鉤子過程相關(guān)的線程標識設(shè)置為0。
只有調(diào)用SetWindowsHookEx函數(shù)安裝鉤子后,系統(tǒng)才會開始監(jiān)視所有的隊列消息,而且只有當該隊列消息為SOCKET發(fā)送消息時,才會進行函數(shù)入口替換處理,開始進行HOOK操作。
每當系統(tǒng)調(diào)用sendto函數(shù)時,由于進行了函數(shù)入口轉(zhuǎn)換,業(yè)務(wù)截取會首先在自定義函數(shù)MySendto函數(shù)中進行操作。對鉤住的業(yè)務(wù)包進行分析,如果符合相關(guān)的解包協(xié)議,那么進行下一步的業(yè)務(wù)解析,否則直接調(diào)用底層真正的sendto api直接發(fā)送該原始業(yè)務(wù)消息。
針對本文的通信系統(tǒng)模擬器來說,如果截取的業(yè)務(wù)包符合相關(guān)解包協(xié)議,那么會對該業(yè)務(wù)包進行兩部分的處理:① 直接將該業(yè)務(wù)包發(fā)送至目的端機緩存起來;② 抽取該業(yè)務(wù)包的摘要信息發(fā)送給主機。對原始業(yè)務(wù)包進行相關(guān)操作后,統(tǒng)一調(diào)用底層真正的sendto api發(fā)送函數(shù)。
由于對系統(tǒng)sendto函數(shù)進行了函數(shù)入口替換,為了防止在調(diào)用底層api發(fā)送函數(shù)時出現(xiàn)死循環(huán),需要在解析該業(yè)務(wù)包前進行判斷。如果該業(yè)務(wù)包為本鉤子DLL發(fā)送或者目的接收通信設(shè)備同本鉤子DLL部署在同一臺計算機上,那么不執(zhí)行后續(xù)的解包操作,直接調(diào)用底層真正的sendto api函數(shù)發(fā)送該業(yè)務(wù)包。
在退出鉤子程序前,需要將sendto函數(shù)的入口還原為ws2_32.dll中sendto api函數(shù)的真正入口,然后調(diào)用系統(tǒng)函數(shù)UnhookWindowsHookEx將已經(jīng)安裝的鉤子進行移除。在關(guān)閉鉤子程序后,系統(tǒng)將不會對socket函數(shù)進行監(jiān)測。
為了更好地說明基于HOOK的通信系統(tǒng)數(shù)字模擬器的信息流程,特定義術(shù)語:
τ0: 節(jié)點接入時延值,該值為可設(shè)置的固定值;
τ: 通信模擬器主機計算出的邏輯通信時延值(包括了兩端通信節(jié)點的接入時延值);
T0:源模擬通信節(jié)點發(fā)送數(shù)據(jù)的時刻;
T1:目的端機接收完原始業(yè)務(wù)數(shù)據(jù)的時刻;
T2:目的端機得知τ(即接收到主機發(fā)送的τ)的時刻;
t3:該數(shù)據(jù)的最大可接受延遲值。
由于端機與模擬通信節(jié)點配置在同一臺計算機上,所以端機可以HOOK住這臺機子里系統(tǒng)發(fā)出的所有消息,包括模擬通信節(jié)點發(fā)送的SOCKET消息。在端機中設(shè)置相應(yīng)的鉤子程序,每當源模擬通信節(jié)點向目的節(jié)點發(fā)送信息時,在SOCKET消息發(fā)送出去之前,端機就可以HOOK該信息,通過相關(guān)協(xié)議解析該業(yè)務(wù),封裝新的業(yè)務(wù)發(fā)送目的地址為目的模擬通信節(jié)點處的端機,同時抽取出相關(guān)摘要信息發(fā)送給主機。目的端機接收到信息后進行緩存,當接收到主機發(fā)送的時延消息后,通過源和業(yè)務(wù)序列號進行匹配,進行時序處理之后將原業(yè)務(wù)信息按時發(fā)送給目的通信節(jié)點。基于HOOK的通信信息流程如圖4所示。
由源模擬通信節(jié)點經(jīng)由端機和主機發(fā)送業(yè)務(wù)信息至目的模擬通信節(jié)點的詳細流程步驟如下:
① 源模擬通信節(jié)點向目的模擬通信節(jié)點發(fā)送真實業(yè)務(wù)信息;
② 部署于源模擬通信節(jié)點的端機使用HOOK截取該真實業(yè)務(wù)信息,并且對該業(yè)務(wù)信息進行封裝與抽取處理,生成封裝以及摘要兩條業(yè)務(wù)信息;
③ 部署于源模擬通信節(jié)點的端機將封裝有原始業(yè)務(wù)信息的包發(fā)送給部署于目的模擬通信節(jié)點的端機,由目的端機將該業(yè)務(wù)包進行緩存;
④ 部署于源模擬通信節(jié)點的端機同時向主機發(fā)送待傳輸信息的摘要信息,包括信息源、信息目的、待傳信息大小、業(yè)務(wù)序列號、待傳信息時間發(fā)送時間T0和最遲可接受延時t3等;
⑤ 主機根據(jù)摘要信息自動尋找通信路由,結(jié)合需傳輸信息情況、當前背景流量、信道特性等,計算得出該信息傳輸所需要的通信延時τ;
⑥ 主機將τ,T0,t3值等時延信息包發(fā)送給部署于目的模擬通信節(jié)點的端機;
⑦ 目的端機將業(yè)務(wù)信息與時延信息進行映射并且判斷時間關(guān)系,當T1≤T0+τ且T2≤T0+τ且τ≤t3時,目的端機等待到T0+τ時刻將真實業(yè)務(wù)信息遞交給目的模擬通信節(jié)點;當時間關(guān)系不滿足以上要求時,在目的端機收到主機發(fā)來的時延信息時立即將真實業(yè)務(wù)數(shù)據(jù)遞交給目的模擬通信節(jié)點,并且記錄該異常時序信息[21];
⑧ 目的端機將映射信息反饋給主機,主機同步判斷時間關(guān)系,當滿足T1≤T0+τ且T2≤T0+τ且τ≤t3時,主機正常記錄并且顯示該業(yè)務(wù)的傳輸信息,當不滿足上述時間關(guān)系時,主機記錄該異常時序信息。
圖4 基于HOOK的通信信息流程
基于HOOK的通信系統(tǒng)數(shù)字模擬器設(shè)計,本文研發(fā)了一款通信模擬器軟件,其軟件界面示意如圖5所示。
模擬器主機采用MAPX[22]插件展示通信以及通信設(shè)備節(jié)點拓撲信息,能夠進行地圖的縮放、移動、拖拽和單擊雙擊等操作。每當模擬通信節(jié)點發(fā)送一條信息時,在地圖上動態(tài)顯示該業(yè)務(wù)信息的傳輸路徑,在業(yè)務(wù)信息輸出窗口顯示該業(yè)務(wù)信息的摘要信息、時延、路由以及傳輸成功與否等信息,在左側(cè)的統(tǒng)計評估窗口顯示鏈路利用率、傳輸成功率和通信時延等相關(guān)統(tǒng)計信息。
模擬器端機利用HOOK機制截取以及緩存相關(guān)業(yè)務(wù)信息,在相應(yīng)的時刻值將業(yè)務(wù)信息遞交給目的模擬通信節(jié)點。
圖5 通信系統(tǒng)數(shù)字模擬器界面示意圖
針對實驗室里的局域網(wǎng)缺少實際的數(shù)字通信網(wǎng)絡(luò)拓撲以及實裝通信設(shè)備在不能更改設(shè)計的前提下,需要高可靠延遲傳輸?shù)囊螅疚奶岢隽艘环N基于HOOK SOCKET的通信系統(tǒng)數(shù)字模擬器設(shè)計,能夠模擬按需的數(shù)字通信網(wǎng)絡(luò),提供業(yè)務(wù)生成、通信路由、時延計算、資源管理、數(shù)據(jù)處理、統(tǒng)計評估和通信顯示等功能設(shè)計,能夠使通信設(shè)備間進行無感操作,為傳輸信息提供時間延遲等通信效果支持,能夠較好地支撐數(shù)字通信網(wǎng)絡(luò)全數(shù)字仿真。
本文基于數(shù)字通信系統(tǒng)中特定協(xié)議應(yīng)用,按照文中的設(shè)計思想,研制通信模擬器并在試驗床上經(jīng)過全面驗證,能夠可靠有效地滿足數(shù)字通信網(wǎng)絡(luò)業(yè)務(wù)傳輸?shù)囊?。本文提出的通信系統(tǒng)數(shù)字模擬器設(shè)計方法對進一步研究數(shù)字網(wǎng)絡(luò)信息體系提供了一定的思路。由于數(shù)字通信系統(tǒng)是非常復雜的系統(tǒng),全面合理、高可信的全系統(tǒng)仿真還存在著許多困難,還有許多工作需繼續(xù)深入地研究。