张国超 金巧园 何旭 代中华
(中国船舶重工集团公司第七二六研究所 上海市 201108)
今年来计算机技术和网络应用的蓬勃发展,各类基于网络编程技术的应用软件也伴随着各种应用场景大规模的涌现出来,网络应用软件编写好后除了自身软件的调试外,还需要利用网络接口模拟器验证网络通信功能的正确性,因此随之而来的网络开发调试的需求越来越迫切。传统的做法是根据每个项目的需求和具体的协议要求编写不同的网络接口调试模拟器,绑定指定的IP地址和端口号,并根据需求设计界面显示内容,网络接收到数据后根据约定好的接口通信协议进行网络数据报文的解析,将解析后的数据送到显示界面进行显示,数据报文的发送根据实际协议要求定制进行发送。上述做法的优点是设计的通信接口模拟器能够很好的匹配实际应用场景,能够实现与真实设备最接近的模拟测试环境,发送报文也能够最大限度的与实际需求相符合,但是这种做法的主要缺点是只要有一个新的网络应用软件出现就需要开发一个与之配套的网络接口调试模拟器,无法实现软件的重用,软件的复用性很低,大大增加了软件开发调试的时间成本和人力成本,与此同时网络接口模拟器本身也需要调试,增加了开发调试的复杂性。
针对一些简单网络应用的调试,可以采用网络抓包工具例如应用最为广泛的Wireshark软件和EtherPeek NX软件等,还有基于命令行的抓包工具例如tcpdump等,这种做法的优势是能够对报文的正确性进行验证而不需要定制网络接口模拟器软件,节省了模拟器软件的开发成本,但是缺点也很明显,缺点就是接收到的报文解析需要对照人工按照网络通信接口协议拼接字节后依次进行解析,很耗费时间精力而且容易解析失误,另外一个缺点就是无法实现网络报文的发送,无法完全覆盖网络通信功能。目前还有一种网络调试手段就是利用网络调试助手软件,网络调试助手软件集成了网络报文抓取的基本功能,能够抓取网络报文序列,同时支持简单的报文发送功能,该方法的主要缺点与网络抓包软件的方法类似,需要人工进行字段的解析,比较复杂而且容易出错。
针对上述三种常用的网络接口通信调试方法的主要缺点,本文提出了一种基于XML的通用接口通信调试系统,利用XML技术进行网络接口通信协议的存储,实现不同协议只需要修改稍作修改即可以使用,不需要重新编写接口模拟器软件,重新运行即可。接口通信调试系统按照功能主要软件模块包括接口通信协议存储模块、接口通信协议加载模块、网络数据报文捕获模块、界面显示控制模块、网络数据报文发送模块、网络数据报文过滤解析模块。本文针对接口通信调试系统的各个软件模块分别进行了详细设计,并开展验证试验验证软件的可行性,在文章最后给出了试验结果及结果分析。
近年来计算机网络技术得到了长足发展,移动互联网更是深刻影响现代人们的日常生活,互联网由可联网设备(包括计算机、移动联网设备等)、链路联通设备(路由器、交换机和集线器)等结点连接的链路组成,网络也可以通过路由器、交换机等网络互联设备与另外一个网络向连接,形成更大的网络,所谓因特网就是全球所有网络的连接形成的最大的互联网。由于互联网连接的设备是多样的,可以是计算机、手机、智能设备等,与此同时各个网络结点的硬件环境和操作系统都存在巨大的差异性,因此如果没有统一的网络通信方式会导致网络通信软件编写过于复杂而难于维护,互联网的标准化工作使得互联网通信变得更容易,从而促进了互联网的蓬勃发展。
所有的互联网标准都是通过RFC的形式对公众发布的,任何人都可以免费下载。互联网上的任意两个通信设备被称为两个端(end),端与端之间的通信可以看作两个主机的进程之间的通信,在端系统中运行的软件之间网络通信方式可以分为客户端服务器模式(C/S架构)和对等模式(P2P架构),客户端服务器模式是应用最为广泛的网络通信模式,如果浏览器作为客户端就变成客户端服务器模式的特殊形态浏览器服务器模式(B/S架构)。对等模式也得到了广泛应用,这种模式主要优点是不需要中心服务器,被广泛用于下载等类型应用中。OSI将互联网通信分为物理层、数据链路层、网络层、传输层、会话层、表示层、应用层七个抽象层次,但作为事实上的互联网通信标准TCP/IP协议将网络分为物理层、数据链路层、网络层、传输层和应用层五个层次。由于TCP/IP协议的实用性,成为全球应用最为广泛的网络通信标准协议。TCP/IP协议簇顾名思义,包括传输控制协议(TCP协议)和网际协议(IP协议),不仅仅包括TCP协议和IP协议,还包括用户数据报协议(UDP协议)、地址解析协议(ARP协议)、文件传输协议(FTP协议)、远程连接协议(Telnet协议)。TCP/IP协议簇最核心的协议是IP协议,IP协议是很多其他协议的基础,例如UDP和TCP协议就是IP协议前面添加了标准的报文头。IP协议是一种无连接的网络数据传输协议,提供尽力发送的不可靠传输方式,传输过程中出现校验错误时采取的处理方法是直接丢弃错误报文。IP协议头部由20个字节组成,分别用来存储IP协议的版本、数据总长度、源IP地址和端口号、目的IP地址和端口号、数据校验和等。UDP协议报文头部包括8个字节,是一种不可靠的传输层协议,如果需要可靠的数据传输,需要应用TCP协议,TCP协议头部包括20字节报文头,TCP通过三次握手的方式保证了TCP报文的可靠传输,如果发送超时会自动重复发送。TCP/IP协议的实现有很多版本,最著名的实现版本是由伯克利(Berkeley)的加利福尼亚大学计算机系统研究组提供的实现,伯克利的TCP/IP协议栈是在Unix操作系统实现的,很多非Unix或者类Unix操作系统都是基于伯克利实现的TCP/IP协议栈开展的。伯克利实现的协议栈利用套接字(socket)进行编程,提供一套用户接口完成网络通信的功能,很多非Unix系统完成了伯克利套接字的移植工作,使得套接字应用接口成为网络编程的通用用户接口。
套接字的类型包括TCP类型、UDP类型和原始套接字(Raw Socket)类型,在创建时候指定。使用接口函数socket创建套接字,对于C/S架构软件服务器端需要绑定IP地址和端口号首先启动进程在绑定IP和端口号等待客户端网络数据,客户端向指定的IP地址和端口号,对于套接字被指定为原始套接字类型的套接字能够接收所有经过网卡的IP数据包,常常被用于网络报文抓取。
XML的全名是可扩展标签语言(Extensible Markup Language),XML是标准通用标记语言的一个子集,是一种与HTML类似的纯文本标记语言,XML利用结构性的标签属性和属性数值来表达数据物理含义。HTML语言也是标记语言,XML和HTML主要区别是扩展性、结构性、校验性,在扩展性方面HTML标签属性是固定的不可修改的,但XML能够根据需要表示数据的含义自定义添加标签属性,大大丰富了数据表达的能力;在结构性方面HTML无法实现复杂结构,而XML的标签结构支持复杂的嵌套,能够清晰的反应要表达数据的层级关系;在校验能力方面HTML使用语言文法做文件结构的校验,但是没有相应的标准化校验文件对其进行约束,XML有很多标准文件规定XML的正确性校验,从而保证了XML的校验能力。XML编写方法是创建后缀为“xml”的纯文本文件,根据实际情况创建标签,组成元素包括标签的版本描述、起止标记、标记的字符数据部分、标签注释、文档类型声明(DTD,Document Type Definition)等。由于XML具有容易理解、便于维护修改、支持复杂层次结构、纯文本编写方式具有系统无关的跨平台性,因此XML被广泛应用于配置文件的编写,使用XML配置的软件不需要进行重新编译,修改配置后只需要软件重新启动即可,具有很好的封装性。
XML文件包括文档对象模型(Document Object Model)解析方式、简易APIXML(simple API for XML)解析方式、DOM4J解析方式、Java文档对象模型(Java Document Object Model)解析方式。对于XML文件的读取和处理可以采取自己写代码打开文件,读取所有XML行数据,然后根据XML标签成对规则,逐个标签进行解析,比较复杂而容易出错,因此现在有很多软件库,提供简单方便的应用程序接口,通过接口的调用就可以很方便快捷的解析XML文件信息,Java、C++、PHP等各种主流编程语言都有很多优秀的XML解析库可用。Qt是全球应用最为广泛的C++界面开发库之一,设计为一款跨平台的GUI开发库,目前已经发展成为一个集界面开发、支持多进程/线程技术、支持数据库接口、网络通信处理、文件IO操作等功能的完备C++函数库。Qt对XML提供了一个Qt类库QDomDocument,可以调用QDomDocument类的接口进行XML文件的读取解析和写入工作。
接口通信调试系统主要功能是完成网络应用程序的接口通信调试,首先需要完成通过网卡数据的截取,然后根据设置好的过滤条件完成报文的过滤并存储到内存中,然后根据接口通信协议内容进行报文的解析和显示,支持通过界面方式进行接口协议的定义、过滤条件的定义,支持通过界面进行数据报文的发送功能。按照功能接口通信调试系统可以分为以下几个软件功能模块:网络接收软件模块、网络数据过滤软件模块、网络数据处理软件模块、界面显示软件模块、协议定义软件模块、网络数据发送软件模块。下面针对这几个软件模块开展详细设计。
网络接收模块主要功能是接收所有经过网卡的数据,采用的技术是原始套接字的方式。首先利用socket()函数创建类型为RawSocket的原始套接字,然后创建网络接收线程,以死循环方式在网络接收线程中调用recvfrom()函数阻塞式接收网络数据,接收到的数据存储在网络接收缓存中,作为参数传递给网络数据过滤模块,等待数据过滤和处理。
网络数据过滤模块主要功能是读取和写入过滤条件到配置文件,负责软件过滤条件的写入存储和读取加载工作。实现技术主要采用XML作为配置文件,软件启动时可以利用界面的方式对XML配置文件进行写入和加载。过滤条件包括:源IP地址、源端口号。过滤条件的存储利用的是XML文件存储,XML的过滤条件的标签名称源IP地址标签SRC_IP,端口号标签名称SRC_PORT。过滤条件XML的存储可以直接修改配置文件的SRC_IP和SRC_PORT标签字段的值,值以字符串的方式存储,软件重启后生效,另外一种方式是软件启动后通过界面方式修改过滤条件,界面传入待修改的源IP地址和源端口号,确定修改后,利用Qt自带的XML写入接口函数将修改字段写入到SRC_IP和SRC_PORT标签对应位置,完成过滤条件的XML文件存盘工作。
通信协议定义模块主要功能是完成通信接口协议的定义写入到接口协议XML配置文件,支持直接修改接口协议配置文件,也支持通过界面以可视化的方式新增或者修改通信协议条目。
通信协议XML标签结构包括协议名称字段标签名称PROTOCOL_NAME用于标志协议的名称(取值为中文字符串,用于界面显示协议名称),协议名称包括属性为PROTOCOL_INDEX用来标识协议唯一标志(取值从0开始,后面如有新的协议字段该属性值自动加一),协议名称的第二个属性为PROTOCOL_KEYOFFSET用来表示协议每一个数据报文的唯一数据标志的相对于首个字节的偏移量,协议名称的第三个属性是PROTOCOL_KEYLEN用于表示数据报文唯一数据标志的数据长度;协议的下一级包括协议条目字段标签名称为PROITEM用来定义报文的任意字段,协议条目字段包括属性PROITEM_INDEX用来标识各个条目的索引号(取值从0开始,后面的条目字段数值加一),PROITEM_NAME属性用来标识字段的名称(取值为字符串,用于界面显示使用),PROITEM_KEY属性用来标识该字段是否是协议条目是否为报文唯一标志号(属性字段如果为true代表该字段为协议唯一标识字段,属性值为false代表该字段为普通字段),PROITEM_TYPE属性用来标识字段的数据类型,协议字段类型包括有符号字符类型(1个字节长度)、有符号短整数型(2个字节长度)、有符号整数型(4个字节长度)、有符号长整数型(8个字节长度)、单精度浮点型(4个字节长度)、双精度浮点型(8个字节长度)、无符号字符类型(1个字节长度)、无符号短整数型(2个字节长度)、无符号整数型(4个字节长度)、无符号长整数型(8个字节长度),分别利用类型属性值char、short、int、long、float、double、uchar、ushort、uint、ulong来表示。通信协议XML文件的写入可采取人工直接编辑通信协议XML文件来完成,编辑时候需要注意协议条目字段的索引字段要手动加一,防止与前面索引字段取值重复,标签也需要仔细核对,有一定的难度和复杂性,因此推荐的方式是利用图形界面的协议设置窗口完成协议的新增修改或者删除操作。网络调试系统软件启动后会自动到指定路径打开并读取通信协议XML文件,如果文件不存在会创建一个空的通信协议XML配置文件。读取通信协议XML文件后,利用Qt的XML文件解析类进行XML文件的读取和解析,将XML的所有标签读取到内存中建立协议解析,首先将协议条目的唯一标志的偏移量和数据长度存储到局部变量中,然后建立协议条目数据结构表。协议条目结构体字段包括字符串型条目名称(itemName)、布尔型条目标识符号(bKeyitem)、整数型条目长度(itemLen)、QString类型条目显示数值(itemValue)。通信协议XML文件读取进来后,建立一个协议条目标识数值和协议条目结构体链表为序列对的QMap数据结构作为协议解析列表。后续的网络报文处理模块根据建立好的协议解析列表进行报文的解析和显示。
网络数据处理模块的功能是根据网络通信协议字段的定义对接收到的网络数据进行处理,处理后的结果作为界面显示的输入,完成协议字段的现实功能。首先根据协议条目的唯一标志的数据偏移量和数据长度解析出当前数据报文的报文标志,然后在建立好的网络通信协议结构表中查询是否存在该标志的协议条目,如果查询不到则忽略改条报文,如果查询成功,则获取对应数据标志的协议条目结构,将数据报文的对应到结构体链表的每一个节点,节点的数值根据节点结构体的字节数目进行字节拼接得到,解析后的数据发送信号到界面线程用于驱动界面显示。
界面显示及操作控制模块主要功能是显示接收到网络数据信息,显示报文的标志以及各个数据段的数值,同时可以通过界面设置通信协议、设置过滤条件,输入发送数据配合完成向目标IP地址和端口号发送网络数据任务。界面显示基于Qt框架进行开发,基类选择QMainWindow类,因为自带菜单比较适合网络调试软件的需求,网络数据显示部分选择控件QTableWidget,以分行显示的方式显示所有的符合条件网络报文(类似抓包软件一样),如果希望看到网络报文的详细信息,只需要用鼠标在需要查看的条目用鼠标双击操作,就可以弹出详细的字段信息,显示内容是改条网络数据报文对应通信协议解析后的每一个字段的显示,每一个显示字段分为两个部分,第一部分是字段本身的名称(选用QLabel控件),第二部分是字段在本条数据报文的数值(选用QLabel控件)。协议设置界面是在菜单里面选择协议设置,弹出协议设置界面,界面主要包括协议名称、协议条目唯一标志偏移量、协议唯一标志数据长度。软件启动后自动读取协议配置XML文件,利用通信协议定义软件模块建立网络协议结构表,界面显示模块完成网络协议的树形结构的显示任务,显示在界面的左侧,应用Qt自带的树形结构控件QTreeWidget完成协议树形结构的显示,显示层级包括顶级节点协议名称,展开后下一级是每一个报文结构名称,报文结构的下一级是改条报文的所有协议字段。界面显示控制模块支持通过鼠标右键菜单的方式对协议条目和报文任意字段的增加、删除、修改等工作,增、删、改的结果会自动写入通信协议XML配置文件中,下次软件启动后自动同步更新。界面中网络发送控制区域主要完成待发送网络数据的输入,输入目标IP地址和目标端口号、发送按钮,同时支持读取编辑好的发送文件,将文件内容发送到目标IP地址和目标端口。
网络数据发送模块主要功能是读取界面中网络发送控制区域的输入数据,利用套接字向界面中指定的IP地址和端口号发送界面中读取的待发送网络数据或者加载的发送文件内容。首先利用socket()函数创建类型为RawSocket的原始套接字,然后创建网络发送线程,以死循环方式在阻塞式等待在网络发送消息队列中,如果队列有数据,则取队列首部元素,并调用sendto()函数向指定的IP地址和端口号发送队列中的数据,直至队列数据为空。当界面网络发送区域用户设置好目标IP地址和端口号,输入完待发送网络数据或者加载好待发送文件后,鼠标点击发送数据按钮,就会将待发送的网络数据加入到网络发送数据消息队列中,从而驱动网络发送线程完成网络数据发送任务。
根据本文章节4给出的网络调试系统的总体设计和详细设计可以完成网络调试系统软件的编写,需要设计试验对软件的可用性和正确性进行验证。本文提出的网络调试系统方法是一种通用的、跨平台的方法,应用Qt和C++进行开发,操作系统支持Windows操作系统、Linux操作系统、VxWorks操作系统等。不失一般性的本文试验环境选用Windows7操作系统进行演示,首先安装VS2010(Microsoft Visual Studio 2010)软件,然后到Qt官方下载网站下载Qt5.0版本的x86软件安装包可执行文件,并在Win7下进行Qt5的安装,为了将Qt集成到VS2010上,需要下载安装Qt的VS2010插件,该插件也可以在Qt官方网站下载获得,安装好插件后,打开VS2010就可以在菜单栏出现Qt标志,表明插件安装成功。为了验证调试软件的功能,定义一个协议名称为“接口协议1”,包括协议条目1(接收)、协议条目2(接收)、协议条目3(接收)、协议条目4(接收)、协议条目5(发送),协议条目1-4包括字段1(无符号整数型)、字段2(有符号整数型)、字段3(无符号长整数型)、字段4(单精度浮点数)、字段5(双精度浮点数),协议条目5包括字段1(单精度浮点数)、字段2(双精度浮点数)、字段3(有符号整数型)。按照上述测试协议编写网络模拟器(绑定本地IP地址为192.9.30.66,端口号9856)发送UDP报文到目标机,目标机捕获报文后解析结构截图如图1所示。
图1:试验结果显示截图
试验结果表明本文提出的网络调试系统能够实现通用的网络数据的接收、解析以及显示功能,不仅能够在网络数据接收区域显示所有接收到的报文条目,也可以通过点击某一条关注的报文标志报文查看报文的各个字段数据信息,在右侧的报文字段显示区域显示,同时支持网络数据的发送功能和协议的配置等功能。本文提出的网络调试系统具有协议低耦合度,可以根据实际情况设置协议配置文件,重启软件就可以实现一个符合新协议定义的接口调试软件,具有很高的软件复用性,使网络接口调试工作变得更简单便捷,具备很高的实用价值。