王 娇,张惠刚,李广华,许家浩,迟 翔
(1.南京工程学院,南京市211167;2.南瑞继保电气有限公司,南京市211100)
IEC 61850 标准作为变电站自动化领域最为完善的通信标准,推动了一次设备智能化和二次设备集成化的快速发展[1-5]。其最大程度上实现了系统信息模型的统一,通信服务的统一和传输过程的统一。但是其未对网络冗余、安全等重要应用领域做出明确的规定。2008年,IEC SC65WG15 发布了IEC 62439 高可用性自动化网络协议,提出了几种典型的网络冗余技术,包括跨网冗余协议、分布冗余协议、媒介冗余协议、信标冗余协议、并行冗余协议和高可用性无缝冗余协议[6]。随着IEC 61850 第2 版引入IEC 62439-3 标准中高可用性无缝环网(high seamless ring,HSR)和并行冗余双网(parallel ring protocol,PRP),为数字化变电站的通信可靠性、安全性提供了参考性的实现方案[7-8]。目前,大量基于该种协议的网络构架层出不穷,文献[9]提出了PRP 的网络构架,在站控层网络和过程层网络均布置为星型双网。文献[10]根据HSR技术抵抗单点故障,实现无缝恢复的优势,设计了应用HSR 的变电站三层通信网络结构。文献[11]详细阐述了PRP 在站级总线中的组网方式,根据冗余丢弃算法、冗余检测和冗余管理的工作原理设计了PRP 的处理模块。文献[12]提出了站内信息网络结构简化技术路线和骨干、终端通信网框架建设方案。但是这些设计方案的可行性是否能够通过验证,需要一个强有力的监测工具来支撑。本文以Wireshark 开源代码为基础,以Visual Studio 2008 为开发平台,利用C+ +语言编码,融合GTK 界面设计工具,开发一个捕获、解析PRP 报文的插件。并通过WinPcap 库模拟相关设备发包,来验证PRP 报文插件开发的正确性。
并行冗余双网协议执行冗余的功能指的是在节点处实现双备用,而不是指网络,通常利用双连接节点(double attached node implementing,DANP)可达到冗余效果。
PRP 的环形拓扑结构如图1 所示。由图1 可知,一个DANP 连接到2个独立、并列的局域网,当其作为源端节点发送数据帧到各个局域网中时,发送的数据帧结构中带有冗余控制监测(redundancy check trailer,RCT),为目的DANP 节点处的链路冗余单元(link redundancy entity,LRE)识别重复报文提供帮助。然后目的DANP 节点在一定的时间内接收各个局域网传来的数据帧,并通过LRE 处理重复数据帧和管理冗余。
图1 含有单节点和双节点的PRP 环形拓扑结构Fig.1 PRP ring topology of with SANs and DANPs
图1中PRP网络中含有2 种连接方式:双连接节点(DANP)和单连接节点(SAN)。其中单连接节点的使用情况和PRP 网络有很大的不同。PRP 网络中的SAN 有2 种连接方式:(1)直接连接到局域网中,可通信的范围只限定在连接在本局域网中的单节点和所有的双节点;(2)通过冗余盒连接到2个局域网中,它可以和所有的DANP 和SAN 通信。
PRP 网络中每个节点包含2个以太网总线控制器,具有相同的MAC 地址和IP 地址,因此PRP 基于第2 层网络协议的网络拓扑结构,非常适用于GOOSE 报文和SV 报文的传输,工程配置相对简单。
在第二版IEC 61850 -9 -2 中,国际电工委员会第15 工作组提出将网络冗余配置添加到过程层网络中。其中,PRP 帧是映射到数据链路层,采用ISO/IEC 8802 -3 版本的以太网数据帧,帧的左侧标注了字节数,具体格式如表1 所示[13]。
表1 ISO/IEC 8802 -3 帧结构-链路冗余:并行冗余双网Tab.1 ISO/IEC 8802-3 frame format-link redundancy:PRP
表1 ISO/IEC 8802 -3 数据帧中部分字段的含义如下。
(1)目的地址:目的地址长度为6个字节。根据规定,对PRP 的目的地址的前5个字节固定为“01 -15 -4E-00 -01”。
(2)标签协议标识符:8 位,由802.1Q 标准以太网编码帧来确定,一般设定为0X8100。
(3)标签控制信息:8 位,主要涉及到优先级和虚拟局域网。如果数据单元是SV 或GOOSE 报文的话,则优先级为4,其他的报文优先级为1。
(4)应用标识符:16 位,它是由APPID 类型和实际ID 值组成。对于SV 报文APPID 取值范围为0X40000 ~0X70000。GOOSE 报文分配的取值范围为0X0000 ~0X3FFF[14]。
(5)长度:16 位,从APPID 开始到APDU 结束。
(6)保留位:保留位1 最高为simulate,当该值设置为1 时,表示采样值的报文是由测试装置产生的,而不是来自装置的配置文件。后面3 位为将来标准设置,一般为0。剩下的12 位与保留位2 合起来构成28 位的“保留安全性”,它是由标准IEC/TS62351-6 定义的。
(7)序列号:16 位,用以标识重复帧。每次从高层发送一帧,序列号加1。
(8)路径标识符:4 位,由网络标识符和局域网标识符构成。其中局域网标识符占1 位,确定冗余盒两端口的接收情况(端口A 为0,端口B 为1)。
(9)帧大小:12 位,前4 位与路径标识符结合,计算长度从APDU 数据单元开始,一直到PRP 类型结束。
(10)PRP 以太网类型:PRP 报文的以太网类型是由IEEE 的著作权注册机构进行了注册,一般是唯一的。PRP 报文的以太网类型为0X88FB。
PRP 报文中的链路冗余控制单元由(7)~(10)构成。由于PRP 链路冗余控制单元(LRE link redundancy trailer)的加入,可能会超过IEEE801.1D规定的数据最大长度1 522 字节,因此需要网络内交换节点单元的内部结构支撑这种协议,目前该类装置研究处于起步阶段,开发测试报文的平台可以为装置研发提供强有力的支撑。
Wireshark 是一款强大的网络协议分析开源的跨平台软件[15],具有简洁友好的用户界面。由于软件底层和界面涉及到许多LINUX 环境配置项,在Windows 系统中编译Wireshark 还需要以下软件来辅助:Visual Studio、Python、Cygwin,且采用C + +语言作为主要开发语言。
Wireshark 源代码的基本结构逻辑上是由5 部分组成[16]。(1)WinPcap 库文件中数据包监听设备驱动程序(netgroup packet filter,NPF)在操作系统核心内与网络接口驱动交互,调用用户级的packet.dll 和wpacp.dll 来实现报文的捕获,将捕获结果传递给Capture;(2)Capture 将捕获的数据储存在Wiretap 部分;(3)GTK1/2 提供图形窗口工具,将用户的输入信息传递出去;(4)Core 综合协调用户传入、传出的信息;(5)Epan 接收来自Core 传达的命令,指挥协议解析器,将结果传送到Core,最后调用GTK1/2 库文件在界面上显示[17-18],如图2 所示。
开发协议解析器主要目标是针对协议部分的各个字段的信息,以一个树形的结构来划分各层结构,进行详细展示。同时,通过过滤规则筛选显示到数据包列表的主窗口中[19]。将表1 的协议分成4 层:
(1)解析以太网层。前12个字节,包括目的MAC 地址和源MAC 地址,并判断是否有上层协议封装。
图2 Wireshark 结构模块Fig.2 Wireshark structure block
(2)解析虚拟局域网层。第12 到第14个字节,分析数据优先级和虚拟局域网标识符等。
(3)解析SV 层。数据结构根据装置发出的类型分辨来解析。同时需要在最后判别是否存在上层协议,通过全局性指针变量跳转到下一层协议解析引擎句柄。
(4)解析PRP 层。单独分裂出来,便于后面添加不同的数据报文,同时也有利于到达目的装置后丢弃PRP 标签算法的统计,本文主要开发该层解析器。下面介绍如何开发PRP 解析器。
2.2.1 协议注册初始化
设计的插件与外部实现交互,需要特定的接口来承担这项任务。其中一个就是函数proto_register_prp 接口,作用是注册PRP 解析器的协议信息。该函数中囊括了PRP 协议的全名、PRP 协议的简写和PRP 协议过滤字符串以及该层字段信息。对字段信息初始化也必不可少,如static hf_register_info hf[]描述PRP 协议字段具体信息,包括路径标识符、局域网标识符、序列号等,其定义如下:
static hf_register_info hf[] = {
{&hf _ prp _ sequence _ nr,{" Sequencenumber"," prp.sequence_nr",FT _UINT16,BASE_DEC,NULL,0x00,NULL,HFILL }},//序列号
{&hf_prp_path,{" Path"," prp. path",FT_UINT16,BASE_DEC,NULL,0xf000,NULL,HFILL }},//路径标识
{&hf _prp_laneid,{" Lane id"," prp. laneid",FT _UINT16,BASE_DEC,VALS(prp_laneid_vals),0x1000,NULL,HFILL }},//局域网标识
{&hf_prp_lsdu_size,{"LSDU size","prp.lsdu_size",
FT_UINT16,BASE_DEC,NULL,0x0fff,NULL,HFILL}},//PRP 帧大小
{&hf_type,{" Type"," prp. type",FT_UINT16,BASE_HEX,VALS(etype_vals),0x00,NULL,HFILL }}};//PRP类型
然后设置PRP 层报文详细列表树根节点static gint * ett[]=&ett_prp_frame。最后通过函数proto_register_field_array(proto_prp,hf,array_length(hf))完成数组结构的注册。
2.2.2 注册切换器
注册切换器,就是将PRP 解析器挂载到树形节点中,并形成与外界交互的端口。通过采用函数proto_reg_handoff_prp()生成解析协议的句柄,关联上下层解析器,根据唯一标识识别协议类型。首先通过create_dissector_handle(dissect_prp_frame,proto_prp)查找到解析该帧的句柄,句柄包含协议的名称、协议类型和对应解析器等元素,其中dissect_prp_frame 是解析prp 协议报文的函数。利用dissector_add_uint("ethertype",ETHERTYPE_PRP,prp_frame_handle)将句柄与协议类型关联;最后根据类型名称使用g_hash_table_lookup (dissector_tables,name)函数查找相应的解析器列表,准备开始解析。
2.2.3 实际解析处理
实际解析处理,就是对dissect_prp_frame 函数内容具体描述,具体解析如下。
首先设置Wireshark 界面中数据包列表中列protocol 和列Info 的内容。采用函数col_set_str(pinfo - >cinfo,COL_PROTOCOL,"PRP")在数据列表中的纵向栏中设置需要显示的列表信息,之后创建协议树的详细信息。将PRP 标签中的路径标识符、网络标识符和局域网通过proto_tree_add_item()函数添加到子协议树,将给定报文大小与实际报文比较。如果两者相等,则继续将该节点添加到子协议树中。反之,在子协议树中添加判断的结果,并显示正确的数值。接着重复使用proto_tree_add_item()函数设置序列号、类型等,其代码如下:
ti = proto_tree_add_item(tree,proto_prp,tvb,0,PRP_TOTAL_LENGTH,ENC_NA);
prp_tree = proto_item_add_subtree(ti,ett_prp_frame);
proto_tree_add_item(prp_tree,hf_prp_sequence_nr,tvb,2,2,ENC_BIG_ENDIAN);
proto_tree_add_item(prp_tree,hf_prp_netid,tvb,4,2,ENC_BIG_ENDIAN)。
WinPcap 网络开发包是一个免费的,基于Windows 平台下的工业标准工具。它可以实现网络报文监听、抓捕、过滤、发包以及网络流量统计[20]。利用WinPcap 发送数据帧模拟装置发包,利用已开发好的工具捕捉该类报文,最后可以验证工具的可行性,具体流程如图3 所示。通过pcap_findalldev()函数获取设备列表,根据列表显示的内容选择合适的网卡序列号。利用pcap_open_live()打开网卡,其中内部延迟参数设定要稍长些,因为工具使用的是主线程抓包。按照报文格式设置主要数据后,最后利用pcap_sendpacket()发送出去。查看测试工具中是否有该类报文。其中,数组packet 中数据组字符为16进制编码,编码分解结果如表2 所示。
表2 编码分解结果Tab.2 Coding decomposition results
发送报文后,从软件截取到解析报文的测试结果如图4 所示。
由图4 可知,该结果符合图2 要求的格式。因此,解析报文工具设计正确。
图3 发送报文流程图Fig.3 Flow chart of packet sending
图4 PRP 数据包解码示意图Fig.4 Analysis of PRP data packet
本文根据IEC 61850 最新发布的网络冗余方案预先设计出解析该类报文的插件,详细地分析该类报文产生机理和最新IEEE802-3 报文格式(含有PRP 的LRE),采用分层解决思路,简单概括解析报文的流程。通过在Visual Studio 平台下搭建以WinPcap 库文件为核心的模拟装置,并利用其设备驱动(NPF)和一组动态连接库(DLL)发送报文来验证测试工具设计的可行性,为未来设计相关类装置提供强有力的监测工具。
[1]梁俊斌,张炜,邓雨荣,等. 智能化变电站监测数据现场并行处理技术研究[J]. 电力建设,2013,34(2):35-40.
[2]李敬如,宋璇坤,张祥龙,等. 智能变电站一、二次设备集成技术[J]. 电力建设,2013,34(6):16-21.
[3]曹亮,陈小卫,肖筱煜. 新一代智能变电站二次设备集成方案[J]. 电力建设,2013,34(6):26-30.
[4]高磊,张鹏,陈久林,等. 智能变电站一体化集成测试平台设计[J]. 电力建设,2013,34(6):31-35.
[5]宋璇坤,刘颖,孙佳,等. 新一代智能变电站一体化信息平台设计[J]. 电力建设,2013,34(9):21-25.
[6]谢志迅,邓素碧,臧德扬.数字化变电站通信网络冗余技术[J].电力自动化设备,2011,31(9):100-103.
[7]International Electro Commission. IEC 62439 SC 65C High availability automation networks[S]. Switzerland:International Electro Commission,2008.
[8]International Electro Commission. IEC 61850 Communication network and systems in substations[S]. Switzerland:International Electro Commission,2005.
[9]李俊刚,宋小会,狄军峰,等.基于IEC 62439 -3 的智能变电站通信网络冗余设计[J].电力系统自动化,2011,35(10):70-73.
[10]陈原子,徐习东.基于并行冗余网络的数字化变电站通信网络构架[J]. 电力自动化设备,2011,31(1):105-108.
[11]许铁峰,徐习东.高可用性无缝环网在数字化变电站通信网络的应用[J].电力自动化备,2011,31(10):121-125.
[12]辛培哲,闫培丽,肖智宏,等. 新一代智能变电站通信网络技术应用研究[J]. 电力建设,2013,34(7):17-23.
[13]International Electro Commission. IEC 61850 Communication network and systems in substations[S]. Switzerland:International Electro Commission,2011.
[14]何磊.IEC 61850 应用入门[M]. 北京:中国电力出版社,2012:279-300.
[15]陈俊,阎慧,王宇.基于wireshark 的协议分析插件开发[C]//第十六届全国青年通信学术会议集.杭州:中国通信学会,2011:74-76.
[16]彭城.基于Wireshark 的协议分析研究与扩展实现[D].成都:电子科技大学,2007.
[17]Wireshrk Developer ’ s Guide [EB/OL ]. http://www.wireshark. org/.
[18]吕雪峰,张春芳. Wireshark 协议解析原理与新协议添加方法[J].软件导报,2011,11(12):105-107.
[19]罗青林,徐克付,臧文羽,等.Wireshark 环境下的网络协议解析与验证方法[J].计算机工程与设计,2011,32(3):770-775
[20]范建忠,马千里.GOOSE 通信与应用[J].电力系统及其自动化,2007,31(19):85-90.