張浩然+耿戰霞+鹿海成
摘 要:為滿足跨正向隔離裝置傳輸文件的需求,設計了一種文件傳輸協議,制定了報文格式及工作機制,給出了發送端和接收端的狀態遷移過程。然后基于C++語言/Qt框架,實現了發送端和接收端的編程。該協議設計簡單、易于實現,便于擴展,具有一定的通用性。
關鍵詞:正向隔離裝置;文件傳輸協議;設計;實現
中圖分類號:TM769 文獻標志碼:A 文章編號:2095-2945(2017)24-0101-03
引言
為保障電力信息網絡的安全性,電力系統根據安全等級把信息網絡劃分為I、Ⅱ、Ⅲ等區。I/Ⅱ區向Ⅲ區傳遞數據要求有正向隔離裝置做隔離。
網絡隔離技術在確保保障電力信息網絡安全的同時,也給信息的跨區通信帶來了不便。本文設計了一個可透過正向隔離裝置的文件傳輸協議,據此實現的文件傳輸系統系統,為I/Ⅱ區向Ⅲ區的數據傳輸提供了很好的支持。
1 正向隔離裝置工作原理
正向隔離裝置主要功能體現在禁止兩個區域的應用之間直接建立TCP連接。它將兩個區域的應用之間的TCP連接分解成兩個區域的應用各自到隔離裝置內外兩個網卡的兩個TCP虛擬連接。隔離裝置內外兩個網卡在裝置內部為非網絡連接。正向隔離裝置工的作模式如圖1所示。
正向隔離裝置只允許表示層與應用層數據單向傳輸,即從安全區III到安全區I/II的應答報文禁止攜帶應用數據(最多只能通過一個字節的數據,而且要么全為0,要么全為1)。
電力二次系統I/Ⅱ區與Ⅲ區增設正向隔離裝置后,普通的C/S和B/S程序無法穿越該裝置,需按隔離裝置編程規定修改程序,才能進行數據通信。
這使得常規網絡中容易解決的問題,變得復雜了。如Ⅲ區的應用想要獲得I/Ⅱ區的文件,常見的文件共享方法如FTP服務、共享文件夾等都無法使用。需使用專門的跨正向隔離裝置的文件傳輸系統。雖然正向隔離裝置的生產商都提供了基于Java的文件透傳系統,但并非所有的設備都能運行Java程序,特別是資源緊張的嵌入式設備。而若部署專門的文件傳輸服務器,又增加了成本。因此,有必要自行開發跨正向隔離裝置的文件傳輸系統。
2 文件傳輸協議
現有的FTP等文件傳輸協議都需發送端和接收端交互大量的控制報文,以對數據的發送、接收、重傳等進行控制。而正向隔離裝置禁止從Ⅲ區到I/Ⅱ區的報文攜帶應用數據。這使得現有協議都無法使用。因此,本文設計了一種新的文件傳輸協議FTPAFID(跨正向隔離裝置文件傳輸協議,File Transfer Protocol Across Forward Isolating Device)以適應跨正向隔離裝置傳輸文件的需要。
2.1 報文格式
FTPAFID共定義了三種報文。其中數據報文和保活報文由發送端產生,確認報文由接收端產生。
數據報文用于傳送文件。第一個字段(1Byte)表示類型碼;第二個字段(2Byte)表示數據長度;從第三個字段開始到報文末為數據段。數據報文共定義了三種操作碼:文件名稱(值為0x01),文件內容(值為0x02)和文件hash字符串(值為0x03)。
保活報文用于在不傳送文件時檢測通信狀態。保活報文為一個字節,字節數值為0x0f。
確認報文為一個字節,用于確認接收到的報文。其值為0xff時表示收到的報文正確,而值為0x00時表示收到的報文錯誤或收到的文件校驗錯誤。
具體的報文結構如圖2所示。
2.2 工作模式
FTPAFID協議被設計為一種停止等待協議,采用一問一答方式工作。圖3顯示了FTPAFID協議在傳輸文件時,正常情況發送端和接收端的交互過程。
以傳輸一個文件為例,在開始工作時,FTPAFID的發送端首先發送一個文件名報文給接收端。接收端收到報文后返回一個OK報文。發送端在收到確認報文后發送一個文件數據報文。接收端收到數據報文后返回一個OK報文。重復這個過程直到文件傳送完。最后一個數據報文的數據長度字段的數值為0。當接收端收到數據長度字段數值為0的數據報文時,就知道文件數據傳輸結束。最后發送端會發送一個文件hash字符串報文。接收端在接收完文件后,會計算文件的hash字符串,并與收到的hash字符串進行對比,如兩者一致,就返回OK報文。
2.3 保活功能和差錯控制
FTPAFID協議的收/發兩端在工作時需經過一個正向隔離裝置中轉,因此無法基于TCP協議提供的控制功能判斷通信是否中斷,必須自己進行控制。
FTPAFID的保活功能設計為:在空閑時由發送端定時向接收端發送保活報文,接收端收到報文后返回確認報文;當發送端超時未收到確認報文或接收端超時未收到保活報文時,判定通信為中斷狀態。
保活功能對接收端尤其重要。若沒有保活功能,接收端無法判斷通道上沒有數據是因為沒有文件需要傳送,還是發送端已經崩潰。如果發送端已崩潰,使得在接收端上留下一個開放連接,而接收端又在等待發送端的數據,則發送端將永遠等待下去。
因為正向隔離裝置只允許接收端返回0xff和0x00兩種報文,無法表示太多含義,所以FTPAFID的差錯控制實現的很簡單。無論是在傳送文件還是在空閑狀態,發送端在超時未收到確認報文或收到的確認報文為0x00時都直接關閉通道。接收端在超時未收到報文時直接關閉通道;而在文件傳輸過程中收到錯誤報文或文件傳輸完畢后文件校驗錯誤時,先返回值為0x00的ERR報文,然后關閉通道。
2.4 發送端狀態變遷
FTPAFID發送端首先向接收端(實際是隔離裝置)發起連接請求,建立連接。建立連接后,發送端處于空閑狀態。如果無文件需要發送,則定時發送保活報文,以確認接收端工作正常。若有文件需要發送,則先發送文件名稱報文;收到確認后繼續發送文件內容報文;按照發送/確認機制持續發送文件內容報文直到文件內容完全傳送完畢;最后,發送端會發送文件hash報文,收到確認后完成整個文件的傳送并返回空閑狀態。接收端在發送任何報文后,如果超時未收到確認報文或收到ERR報文,都會關閉連接停止運行。這些工作流程都能從圖4所示的發送端狀態變遷圖中得出。endprint
2.5 接收端狀態變遷
FTPAFID接收端接收發送端(實際是隔離裝置)發起的連接請求并建立連接,隨后進入空閑狀態。此時,接收端會等待發送端傳送來的報文。如收到保活報文,接收端會發送OK報文,并繼續等待。如收到文件名稱報文,則在發送OK報文后,進入等待文件內容狀態。接收端持續接收文件內容報文,直至收到數據長度為0的文件內容報文。此時,接收端判定文件內容已全部傳送完畢,進入等待文件hash狀態。接收端收到文件hash報文并校驗無誤后,發送OK確認報文,進入空閑等待狀態。接收端在等待任何報文的狀態下,如果超時未收到報文,都會直接關閉連接;如果收到的報文無法識別,接收端會先回復一個ERR報文,然后關閉連接停止運行。圖5所示為FTPAFID接收端的工作狀態變遷。
3 協議實現
基于FTPAFID協議開發的跨正向隔離裝置文件傳輸系統已成功應用于許繼直流輸電系統故障分析處理輔助決策平臺。整個文件傳輸系統基于C++語言/Qt框架實現,可分為發送軟件和接收軟件兩部分,分別部署在正向隔離裝置的兩側。
3.1 發送端實現
發送軟件的發送器類負責具體的文件傳輸過程,它實現了FTPAFID的發送端部分。發送器結構如圖6所示。
發送器內部持有一個QTcpSocket對象client負責實際的通信功能,和一個定時器keepAliveTimer用于實現保活定時功能。
connect方法通過client對象來和接收端建立連接。在建立連接后,connect方法還會激活保活定時器keepAliveTimer,保活定時器會定時調用sendKeepAlive方法發送保活報文。disConnect方法則通過client對象實現斷開連接功能,同時關閉保活定時器。
sendFile方法調用了sendName、sendData和sendHash方法來發送文件。sendFile方法在開始執行時會關閉保活定時器,在方法執行完畢后會打開保活定時器。從而避免在發送文件時插入保活報文。
sendName、sendData和sendHash方法分別用于發送文件名稱、文件內容和文件hash字符串,它們都是通過client對象來實現具體的報文發送功能。
每發送一幀報文,發送器都會調用waitAnswer方法來等待接收端的確認。waitAnswer方法通過client對象來接收確認報文。如接收確認報文超時或確認報文為ERR(0x00),waitAnswer方法就調用disconnect方法關閉連接,并發出信號通知調用者文件傳輸失敗。
3.2 接收端實現
接收軟件的接收器負責具體的文件接收,它實現了FTPAFID協議的接收端部分。接收器結構如圖7所示。
接收器內部的QTcpServer對象listener負責監聽端口,QTcpSocket對象worker負責具體的通信。
open方法負責初始化listener,并調用listener監聽端口。在接受連接請求后,將產生套接字對象賦值給worker,最后調用run方法處理通信工作。close方法用于停止監聽端口,關閉listener。
run方法內部循環調用worker對象來接收報文。收到報文后,run方法會用doProcess來處理報文。stop方法則用于停止run的循環邏輯,并關閉worker。
doProcess是一個函數指針。接收器利用doProcess在內部維持一個狀態機,用以判定什么時候該接收哪一種報文。它初始指向doPackage。doPackage根據報文的操作碼區分調用doKeepAlive或doName。
doKeepAlive方法通過worker對象向發送端返回一個OK報文。
doName方法先通過worker對象返回一個OK報文,然后按照接收到的文件名創建文件對象file,最后將doProcess指向doData來處理文件數據報文。
doData方法使用file保存接收到的內容;在處理文件內容報文時doData會判斷是否到達文件末尾,如果未到達,doProcess繼續指向doData方法,否則doProcess會指向doHash方法來處理文件hash字符串報文。
doHash方法在接收完文件hash字符串后,會將doProcess重置為指向doProcess方法,從而完成一個狀態循環。
4 結束語
本文設計的跨正向隔離裝置傳輸文件的通信協議,完全能夠滿足電力系統中跨區傳輸文件的需求,彌補了信息跨區傳輸的不便問題。文中介紹了協議的報文格式、工作機制和狀態遷移過程。該協議設計簡單、易于實現,便于擴展,具有一定的通用性。本文給出了基于C++語言/Qt框架的實現作為參考,不過采用其他語言或框架也很容易實現該協議。協議的實現可以采用多種方式,協議的設計也可以根據具體的實際需要來擴展。
參考文獻:
[1]王子,徐澄宇.正向隔離裝置在電力信息外網中的應用[J].電腦開發與應用,2010,23(8):59-61.
[2]南瑞集團公司信息通信技術分公司.SysKeeper-2000網絡安全隔離設備(正向單比特版)用戶手冊[Z].2010.endprint