基于XMPP协议的XML数据流压缩模型研究

boyanx4个月前技术教程15

摘要:XMPP协议作为基于XML数据流的即时通信协议,可用于构建统一、高效的智能家居监控消息推送方案。针对XMPP协议存在的流量冗余较大的不足,提出了一种基于容器模型和BWT变换思想的XMPP数据流压缩模型。该模型通过对XML数据流的容器划分、前缀编码和预处理,在单次扫描数据流的基础上达到压缩率的最大化。实验证明,该模型方案能有效节约XMPP协议通信过程产生的网络流量,并具有可行性。

0引言

在智能家居系统的应用背景中,通过手机等移动终端对设备进行远程控制、监测是基本需求。XMPP协议(Extensible Messaging and Presence Protocol)是基于XML的开放可扩展协议,用于在两个或多个网络实体之间进行结构化和可扩展的实时信息交流。将该协议引入智能家居控制领域,可以为异构设备群组成的家居体系提供统一的通信标准。但是XML格式数据流中大量的结构信息造成了较大的流量冗余,给移动控制终端造成了较大的网络流量消耗。因此,基于提高协议的运行效率、消除其流量冗余的考虑,应该对协议双方通信过程中产生的数据流进行有效的压缩[1]。

现有的XML压缩工具,如XMill、XGrind、Xpress等都是针对静态XML文档,对动态数据流的支持不理想[2]。王腾蛟等提出了一种XSC压缩算法,该方法借助DTD和字典压缩思想构建高效的索引完成对数据流的实时压缩[3]。张晓琳等提出了一种基于动态Huffman编码的XML数据流压缩技术,该算法利用XML Schema和动态树结构进行编码,达到压缩目的[4]。本文根据XMPP协议数据流传输的特点,结合容器划分理念和BWT的思想,构建了一种基于容器模型和BWT预处理的非对称XML数据流压缩方法。该方法单次扫描数据流,不用借助DTD和XML Schema等格式定义文档,并有较好的压缩效率。

1XML数据流压缩算法的设计和实现

1.1XML数据流压缩算法的原理

本算法针对实时传输的XML数据流,结合XML数据格式的特点,考虑将数据流中的相关节点利用SAX解析器解析形成触发事件流,并触发对应的处理程序,处理程序结合静态存储的字典,利用前缀索引编码将数据分别存放到对应结构的结构容器和对应内容的内容容器中,达到结构与内容分离的目的。然后,将分离的每个容器中的内容进行BWT变换的预处理,变换的目的是将容器内相关语义的编码尽量靠拢,减小信息熵,这样可以有效地提高对内容进行字典压缩的压缩率。

算法的整体框架图如图1所示。

1.2基于改进的字典编码的容器划分模型

1.2.1数据流容器划分思想

容器划分模型参考了标准XMill压缩器的思想,XML数据流经过SAX解析器后,数据流被解析成触发事件流,根据传输的XML流中的结构和数据部分触发事件的不同,将数据流中的结构部分和数据部分[5]按静态字典与前缀索引结合的方式进行编码,分别进行收集和压缩。考虑到XMPP协议是基于规范性和统一性格式的,即协议传递的数据包中的XML元素标签和属性标签是固定的,一段通信过程的协议格式为:

uid=1&devid=2&ordercode=3&ordervalue=34

stream标签标志一段数据流的开始。

元素称为XML节,每个节点下对应、等属性标签,设置了一个消息片段的发送方、接收方以及消息实体等信息[6]。协议传输的XML数据流的元素/属性节点类型是固定的,因此可以在通信双方内存中构建静态字典,字典的键为自定义的索引标号,值为协议对应的XML元素/属性节点内容。在数据部分,数据以原始形态被分配到字符容器中。利用相应的压缩算法对每个容器进行处理。容器划分模型的流程图如图2所示。

1.2.2结构索引字典编码

一般常用的字典编码压缩方法,为了算法的实时性,往往选择动态构建字典的形式,这在处理大型的内容未知的静态XML文档时是一种较好的处理方式[7]。但常规字典编码方案在动态构建字典时会消耗较多时间。对于XMPP协议支持的通信双方实时传输的数据流,基于协议结构节点固定这一特性,考虑采用事先设定好的静态字典形式,并在编码字典索引中加入前缀索引以便接受方快速定位每一个XML节中的信息体。通过上一节抓取的实际XMPP数据流阐述改进的字典编码步骤。该数据流展示了XMPP客户端test1向test2发送一段消息指令,内容为:“uid=1&devid=2&ordercode=3&ordervalue=26”。数据流经过SAX解析器后,由SAX的事件触发机制,将数据流按触发事件的不同分别引入元素、属性和内容三个容器中。

根据上一节所述,设定一个静态的结构字典,如表1所示,结构字典中包含有标准XMPP协议中定义的全部XML节。

根据表1所示的静态结构字典,可以方便地将数据流中的“结构信息”进行字典顺序编码并得到如下结果:0a 1a 1d ff 0b 1a 1b 1c 0b 1a 1b 1c 0c 1a 1b 1c 1d 0d ff 0e ff ff;通过对以上结果的分析可以发现,因为协议数据流中元素的嵌套结构较多,而“属性”结构通过简单的字典编码并不能确定其具体属于哪一个元素。因此,本文考虑在对数据流的结构信息进行基础的字典编码时,动态加入与其所属的元素对应的前缀索引信息,如表2。

包含前缀索引的字典编码按容器划分方法依次填入相关容器,以message节点为例,最终容器划分结果以及各容器中的数据如表3所示。

1.3BWT变换思想

BWT变换也称作块排序,是一种针对一个数据块的排序压缩方法,其目的是将数据块中出现频率较高、重复出现的数据段尽量整合到一起。其核心思想是对目标数据块中的内容进行矩阵变换。BWT变换本身并不会减小数据块的大小,只是改变了排序顺序[8]。根据信息论中关于信源信息熵的定义,将一个随机变量的熵表示为:

H(x)=H(P1,P2,…,Pn)=∑ni=1P(xi)logP(xi)(1)

其中P(xi)为信源取第i个符号的概率。

根据数据压缩的原理,假设一个包含n个字符的字符串,每个字符的出现概率为p1,p2…pn,那么经过任何压缩算法后的二进制占位至少为:

式(2)的结果可理解为字符串的压缩极限:∑log2(1/pn)。可见,对于长度相同的数据,p决定了压缩极限的大小,p越大表明文件越有规律,其压缩极限越小[9]。根据实验可以发现,经过BWT变换的数据块,相同的字符会趋向于聚集在一起,信息熵比原始数据源小,因此有更小的压缩极限值。

BWT变换基于字符串矩阵的变换。假设输入的数据为字符串:“ABCACBBD”,使用BWT变换对该字符串进行预处理,步骤如下:

(1)构造N×N矩阵O,O中每一行是原字符串依次左移构成。

(2)对O矩阵中的行按字典顺序递减重新排列,得到矩阵O′。

(3)输出O′矩阵的最后一列以及原字符串在O′矩阵中的行数,即(L,index)=([DCCABBAB],1),可方便进行反变换以还原原字符串。

BWT变换将出现频率较高的字母排列在一起。以常规LZW编码为例,一段160 B的数据的原字符串与BWT变换后的字符经过LZW编码后的压缩率分别为80%和7125%,有明显提升。XMPP协议传输的数据流具有较多的重复字符,适合将BWT变换引入其中作为常规数据压缩前的预处理。在接收实体接收到经过BWT变换的内容后,根据前序查找的方法,以原字符串末尾为起始,可以还原字符串。

2算法的测试和应用

对上述容器划分模型在Intel Core i5/31 GHz的PC上进行试验验证,运行环境为Windows7旗舰版操作系统。实验使用的服务器端为openfire393,使用的客户端为基于Smack开发包开发的模拟用户端。数据源为抓包软件采集的智能空调设备与手机App之间的监测、控制数据流。

通过表4对比可见,采用了本文所述的压缩方案后,网络中传输的一个完整通信过程所需的数据流大小与原始数据流相比有了明显减小。

模拟用户对智能设备进行控制并接收设备上报的监测信息,设备每10 s上报一次实时数据,用户每分钟对设备发送一条控制指令。通过“科来”网络流量监测软件对一个时段内流经协议端口5222的数据流量在不经过压缩处理、经过基本LZW编码压缩处理和经过本文压缩模型处理后的统计如图3所示。

可见经过本文设计的压缩模型改进的服务器端,通信协议产生的网络流量与原始服务器和启用了默认LZW压缩方案的服务器端相比有了一定的减少,且随着时间的增加,流量节约更加明显。

3结论

本文针对XMPP协议数据流量冗余的问题,提出了一种使用于XML数据流的基于改进的字典编码的容器划分模型算法,该算法可以在不破坏协议实时性的基础上,对XMPP协议通信双方的XML流进行结构索引字典编码,分结构和内容分别进行压缩,同时针对信息体中重复字符较多的特点对信息体采用BWT编码预处理。实验证明,基于改进的字典编码的容器划分模型可以有效减少XML数据流的冗余,达到节约网络流量的目的。适用于需要长连接的智能家居检测、控制系统中。

参考文献

[1] 刘涌,张彦功,梁崑涛. 移动设备上 XMPP 功耗与带宽的研究[J]. 小型微型计算机系统,2013,34(2):272-276.

[2] 钟世明,邵锐,张胜,等. 基于位置服务系统中XML数据流压缩方法[J]. 武汉理工大学学报,2006,30(1):29-32.

[3] 王腾蛟,高军,杨冬青,等. 面向 XPath 执行的 XML 数据流压缩方法[J]. 软件学报,2005,16(5):870-877.

[4] 张晓琳,翟国峰,谭跃生,等. 基于动态哈夫曼编码的XML数据流压缩技术[J]. 内蒙古科技大学学报,2007,26(4):332-336.

[5] 李瑞. XMLPre:一种基于预处理的XML压缩算法[D]. 西安:西安电子科技大学,2014.

[6] 周文琼,王乐球,周桐,等. 基于XMPP 的企业即时通信系统研究与应用[J]. 吉林大学学报,2010,28(1):108-111.

[7] 许霞,马光思,鱼涛. LZW 无损压缩算法的研究与改进[J]. 计算机技术与发展,2009,19(4):126-127.

[8] 王磊,孟昭鹏,刘亚琼. 一种基于LFU置换的BWT压缩算法的改进[J]. 微计算机应用,2008,29(3):80-83.

[9] 邓宏贵,王晋秀,曹莉凌,等. 基于 BWT 改进的 LZW 算法在传感器网络中的应用[J].传感技术学报,2008,21(6):1048-1051.

相关文章

PHP(gzdeflate/gzinflate)+JS(pako)前后端数据压缩

在之前的一篇文章中我们介绍了PHP压缩函数的使用,但是只是说了服务相关的应用,今天我们结合前端实现数据压缩传输。服务器对于客户端上传的数据一般都会有限制,例如:限制请求的body大小的限制,限制key...

JS 图片简易压缩【实践】

JS 图片简易压缩【实践】

作者:政采云前端团队转发链接:https://juejin.im/post/5ea574cc518825736e57fcca前言说起图片压缩,大家想到的或者平时用到的很多工具都可以实现,例如,客户端类...

常见的序列化框架及Protobuf原理

享学课堂作者:逐梦々少年简书ID:逐梦々少年转载请声明出处!上次我们详细的学习了Java中的序列化机制,但是我们日常开发过程中,因为java的序列化机制的压缩效率问题,以及序列化大小带来的传输的效率问...

如何用2 KB代码实现3D赛车游戏?2kPlus Jam大赛了解一下

选自frankforce作者:Frank机器之心编译参与:王子嘉、Geek AI控制复杂度一直是软件开发的核心问题之一,一代代的计算机从业者纷纷贡献着自己的智慧,试图降低程序的计算复杂度。然而,将一款...

一文带你搞懂JS实现压缩图片

作者:wuwhs 转发链接:https://segmentfault.com/a/1190000023486410前言公司的移动端业务需要在用户上传图片是由前端压缩图片大小,再上传到服务器,这样可以减...

缩小字符串( Compact String)和 压缩字符串(Compressed String)

正如我们在上面文章提到的内容,在英文语境中上面 2 个方法还是有区别的,在中文环境下主要表达就是字符串压缩。JDK 6 使用的压缩字符串方法,主要原因是我们修改了 String 的存储结构,char[...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。