跨正向隔离装置文件传输协议的设计与实现

2017-09-08 04:59张浩然耿战霞鹿海成
科技创新与应用 2017年24期
关键词:实现设计

张浩然+耿战霞+鹿海成

摘 要:为满足跨正向隔离装置传输文件的需求,设计了一种文件传输协议,制定了报文格式及工作机制,给出了发送端和接收端的状态迁移过程。然后基于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

猜你喜欢
实现设计
BUBA台灯设计
有种设计叫而专
陈国兴设计作品
信息系统安全评价系统设计及实现
高校声像档案数字化管理的实现路径
办公室人员尚需制定个人发展规划
苏州信息学院教务管理系统的设计与实现
浅析铁路通信传输的构成及实现方法
匠心独运的场地设计画上完美句点
跨越式跳高递进与分层设计