基于Lua的PDXP协议数据分析插件开发
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于Lua的PDXP协议数据分析插件开发
唐淼;王晨辰
【摘要】在测控网中,PDXP协议作为一种私有协议用于传输测控关键信息.尤其是在航天测控任务中,测量船与陆地控制中心传输的实时测控数据均为PDXP协议数据,因此对PDXP协议数据监视尤为重要.针对测量船测控信息传输链路曾出现过丢包、乱序的现象,通过Wireshark抓包软件内置的Lua开发引擎,研究开发对PDXP 数据包进行解析分析的插件.经任务检验,插件能够有效地对PDXP数据包中各字段进行解释,并且对丢包和乱序进行提示,从而帮助网管人员监视网络链路状态.
【期刊名称】《计算机应用与软件》
【年(卷),期】2015(032)001
【总页数】4页(P121-123,135)
【关键词】Lua;PDXP协议;插件
【作者】唐淼;王晨辰
【作者单位】中国卫星海上测控部江苏江阴214431;中国卫星海上测控部江苏江阴214431
【正文语种】中文
【中图分类】TP3
PDXP协议是一种专门用于传输测控网关键信息的私有协议,测量船与陆地控制中心传输的实时测控数据均为此协议。
测量船测控信息传输链路曾出现过丢包、乱序现象,因此及时发现并掌握PDXP数据的丢包、乱序情况,对快速、准确定位传
输链路问题至关重要。
目前,测量船主要采用支持Lua开发的Wireshark商用抓包软件对PDXP数据进行抓包监视,但此软件没有对应用层PDXP协议的解析,并且也不具有丢包、乱序的发现和提示功能。
本文在Wireshark软件平台上利用Lua脚本语言完成了PDXP数据的完整解析,并运用PDXP数据报包头中相关字段的关联规律,对是否丢包、乱序进行判断,开发出了嵌入式的PDXP协议分析插件。
PDXP数据报的格式如图1所示,PDXP的应用包头包括版本、信源信宿地址、包序号等8个字段内容。
报头内各字段的具体含义为:
(1) 版本(VER)
VER用于标识协议版本。
(2) 信源地址(SI)与信宿地址(DI)
SI、DI用于标识信息的生成方和接收方。
(3) 数据标志(BI)
BI唯一标识应用数据包内数据域的内容。
(4) 包序号(No.)
No.包序号为某一端到端通信双方发送同一数据标识(BI)的数据包累计计数。
(5) 数据处理标志(FG)
FG用于标识应用数据包的基本处理要求。
(6) 预留字段
系统保留使用,固定填[00000000]。
(7) 发送日期(DATE)
DATE为信源发送该数据包时的日期。
(8) 发送时标(TIME)
TIME为信源发送该数据包时相对于当日零时的积秒,量化单位为0.1ms
(9) 数据域(DATA)
DATA承载需要传输的各类有效数据。
2.1 Lua语言
Lua 是一个小巧的脚本语言,代码简洁优美,几乎在所有操作系统和平台上都可以编译、运行。
在目前所有脚本引擎中,Lua的速度是最快的,这也决定了Lua是作为嵌入式脚本的最佳选择。
LUA有如下特性:
(1) 轻量级 Lua语言的官方版本只包括一个精简的核心和最基本的库。
这使得Lua 体积小、启动速度快,从而适合嵌入在别的程序里。
(2) 可扩展 Lua并不象其它许多"大而全"的语言那样,包括很多功能,比如网络通讯、图形界面等。
但是Lua可以很容易地被扩展:由宿主语言(通常是C或C++)提供这些功能,Lua可以使用它们,就像是本来就内置的功能一样。
(3) LUA还具有其它一些特性。
例如同时支持面向过程编程和面向对象编程;自动内存管理;提供一系列数据结构,包括数组、链表、集合、字典、散列表等;语言内置正则表达式匹配;提供多线程支持等等。
2.2 PDXP数据包解析原理
在Lua脚本文件中编写自定义的协议解析器dissector,定义PDXP数据包各字段的变量VER、SI、DI、BI、No、DATE和TIME,构造PDXP协议域。
读取缓存Buff中的数据后,通过相关函数解析后填入PDXP协议域。
利用TreeItems函数将PDXP协议域加入Wireshark的包详情面板中,实现PDXP数据包包头字段的解析功能。
图2为软件编程的流程图。
2.3 PDXP数据包丢包、乱序判断原理
PDXP协议数据包以SI、DI和BI为标识符,其标识包序号是公差为1的递增等差数列,发送时标同样递增。
本分析插件对wireshark抓取的PDXP数据包以抓包
时间为顺序进行排列。
正常时,所抓第i个数据包的标识包序号为i+N(N为固定值),所抓第i-1个数据包的标识序号为i-1+N(N为固定值),设所抓第i个数据包的发送时标为ti,与所抓第i-1个数据包的标识包序号差值为Δi,则ti>ti-1,Δi=1。
因此可根据以下4个条件对数据传输情况进行实时判定:
1) 若Δi>1,则判定第i个与第i-1个数据包之间有丢包;
2) 若Δi<0,且ti<ti-1,则判定第i-1个数据包发生乱序;
3) 若Δi<0,且ti>ti-1,则判定数据被重新发送;
4) 若Δi=0,且ti>ti-1,则判定有重复包。
图3为丢包、乱序判断的流程图。
利用TextWindow函数生成自定义插件窗口,将上述的判断结果按照规定格式进行文本显示。
该插件作用于信息流监视终端的Wireshark软件上,对经过试验任务IP网双平面路由器广域网口的数据进行分析。
使用Wireshark内置Lua脚本引擎,编写Lua 脚本语言开发PDXP数据包分析插件。
该插件具备以下4个功能:
1) 进行实时抓包数量统计;
2) 对丢包、乱序情况实时提示并保存;
3) 解析并显示已保存数据包的全部信息;
4) 查找数据包丢包、乱序情况。
具体源程序如下,首先定义好议解析器dissector域中的各个字段。
local PROTO_PDXP = Proto(″PDXP″, ″zzb pdxp protocol″)
local f_ver=ProtoField.uint(″PDXP.ver″,″Version″,base.DEC)
local f_si = ProtoField.uint(″PDXP.si″,″SourceID″,base.HEX)
local f_di = ProtoField.uint (″PDXP.di″, ″Destination ID″, bas e.HEX)
local f_bi = ProtoField.uint (″PDXP.bi″, ″BI″, base.HEX)
local f_no = ProtoField.uint (″PDXP.no″, ″Packet Number″, base.DEC) local f_fg = ProtoField.uint (″PDXP.fg″, ″Fg″, base.HEX)
local f_reserved = ProtoField.uint (″PDXP.reserved″, ″Reserved″, ba se.HEX) local f_date = ProtoField.uint(″PDXP.date″,″Date″,base.DEC)
local f_time=ProtoField.uint(″PDXP.time″,″Time″,base.DEC)
PROTO_PDXP.fields = {f_ver, f_si, f_di, f_bi, f_no, f_fg, f_reserved, f_date,
f_time}
然后实时获取抓包数据,解析之后填入dissector域。
local data_dis = Dissector.get(″data″)
local ver = buf:uint()
local si = buf:uint()
local di = buf:uint()
local bi = buf:uint()
local dateBytes = buf:bytes()
local timeBytes = buf:bytes()
将解析后的dissector域字段加到软件的包详情面板中。
t:add_le(f_ver, v_ver)
t:add_le(f_si, v_si):append_te xt(″, ″..si)
t:add_le(f_di, v_di):append_text(″, ″..di)
t:add_le(f_bi, v_bi):append_text(″, ″..bi)
t:add_le(f_no, v_no)
t:add_le(f_fg, v_fg)
t:add_le(f_reserved, v_reserved)
t:add_le(f_date,v_date):append_text(″,″..formatted_date)
t:add_le(f_time,v_time):a ppend_text(″,″..formatted_time)
t:add_le(f_length, v_length)
这样包详情面板中就会顺序显示PDXP协议数据的各个字段,并且会解释字段中数据的含义,从而实现PDXP的完整解析。
对于丢包、乱序的判断,依托于对PDXP的完整解析。
首先定义全局变量包序号packet_no,通过上面程序的解析后,用来判断与前一包包序号的关系。
local packet_no = nil
function tap.packet(pinfo,tvb)
local function menuable_tap()
pdxp_st_seq = packet_no
local delta = pdxp_info.seq - last_seq
if delta > 1 then
text = ″Packet No:″ ..
string.format(″%s%d%s%d%s″,″[″,last_no,″,″,pdxp_info.num,″]″) .. ″SRC:″ .. string.format(″%-13s″,pdxp_stream.src) .. ″ DST:″ .. string.format(″%-
13s″,pdxp_stream.dst) .. ″Lost_numbers: ″ .. ″\n\n″ .. text
--如果Δ> 1,判定有丢包,并将丢包信息显示在监听窗口
elseif delta < 0 then
text = ″Packet
No:″ ..string.format(″%s%d%s%d%s\t″,″[″,last_no,″,″,pdxp_info.num,″]″) .. ″S RC:″ .. string.format(″%-13s″,pdxp_stream.src) .. ″DST:″ .. string.format(″%-13s″,pdxp_stream.dst) .. ″\tThere are Disorder Packets!!\n\n″ .. text
--如果Δ< 0,判定有乱序,并将乱序信息显示在监听窗口
在实际的应用中,插件在监视网络数据包状态方面起到了不错的效果。
图4至图7
为实际情况中的抓包情况。
图4为正在抓包时的包数统计截图,按照PDXP数据
包的BID、源地址和目的地址进行分类统计。
图5为正在抓包时出现丢包、乱序的提示截图,对丢包、乱序的包序号、源地址、目的地址以及丢包数进行显示。
图6为对已保存数据包进行相关信息显示截图,主要显示数据包的包序号,以及
和前一包包序号的差值,方便岗位人员查看。
图7为对数据包进行丢包、乱序情况查找。
本插件通过实际实验的检验,已实现对PDXP数据包传输情况的分析、判断,岗
位人员能够直观地监视并掌握数据的传输情况。
由于Lua脚本语言作用于Wireshark软件中,只对数据包进行分析判断,无任何修改,因此不会影响抓包
数据的真实性以及传输连链路的可靠性。
【相关文献】
[1] 邓楠乔,秦开宇,金燕华.基于Lua的面向组件程序设计研究[J].中国高新技术企业,2010(6):45-47.
[2] 莱鲁萨利姆斯奇.LUA程序设计[M].2版.北京:机械工业出版社,2008.
[3] 祖兆研.基丁插件技术的软件架构设计及应用[D].南京:河海大学,2007.
[4] 段禽,孙伟力,陈宁.嵌入式Lua脚本远程调试设计[J].数字技术与应用,2011(3):102-103,106.
[5] 邹光先. Lua中面向对象的编程机制[J].程序员:游戏创造,2007(2):89-91.
[6] 李英明,闫志辉,周水斌. 基于Lua 脚本语言的嵌入式UART 通信方案设计[J].单片机与嵌入式系
统应用,2012,12(4):29-32.
[7] 胡波,张秋峰,牟善峰. LUA脚本语言在通信网管中的应用[J].中国新通信,2012(16):50-52.
[8] 段鑫, 陈宇, 孙伟力. 基于嵌入式LUA协同程序分析与设计[J].自动化与信息工程,2010,31(4):63-65.。