李山松
(河北远东哈里斯通信有限公司河北石家庄050200)
通信设备之间的组网都是通过标准的信令协议达成的。处理联网故障,可以通过分析2 台设备之间收发的信令消息找到故障点。但是这些信令数据的可读性比较差,要想了解信令包含的具体内容,商业化的信令分析仪是一个很好的工具,但是价格比较高,携带也不是很方便,不能在工程人员中进行大面积推广。这里就探讨一下如何使用开源软件W ireshark 为工程联网故障的排查提供服务,进而加快联网问题的排查速度。
W ireshark 软件,以前称为Ethereal 软件。1997年底,由Gerald Combs 完成了最初版本的编写,并将其置于GNU GPL通用许可证的保障范围之下,使用者可以免费获得软件和其源代码,并拥有针对其源代码修改和完善的权利。之后,众多程序员参与了软件的编写和完善。2006年6月,因为商标的问题,Ethereal 更名为W ireshark。目前,W ireshark 已经是全世界使用最广泛的信令分析软件之一。
W ireshark 软件相当优秀,但是他本身并不能直接读取通信设备输出的信令消息。如果能够解决这个问题,其他问题皆可迎刃而解。通过分析,发现W ireshark 支持读取PCAP 格式的封包捕获文件,接下来的问题就是如何能把通信设备输出的信令消息转换为PCAP 封包格式。下面以交换机PR I 中继使用的Q.931 协议为例子,详细介绍这一转换是如何完成的。
为了生成PCAP 文件,首先需要了解PCAP 文件的结构。PCAP 文件格式是一种在协议分析中用到的数据包存储格式。但是,目前还没有现成的工具软件能把交换机输出的信令信息打包为PCAP 格式的文件。因此,这一转换过程需要自己编程解决。PCAP 文件由一个文件头和若干个数据包构成。每个数据包前面还有一个头部结构,记录数据包的捕获时间、长度等内容,下面是用C 语言描述的数据包头部结构:
其中:
GMTtime 和m icroTime 是数据包的捕获时间。
caplen 和len 是所捕获数据的长度。
下面是PCAP 文件头的C 语言结构定义:
其中:
magic 为标识位:取值为0xD 4C3B2A1
version_major 为主版本号:默认值为0x02
version_m inor 为副版本号:默认值为0x04
thiszone 是区域时间:可以设置为0
sigfigs 是精确时间戳:可以设置为0
snaplen 是数据包最大长度:可以设置为0
linktype 是链路层类型:将此值设置为0xB1,表示后面的数据包都是按照DLT_LINUX_LAPD 的帧格式进行存储。之所以选择这种帧格式,主要是因为DLT_LINUX_LAPD 在标准LAPD 帧格式的基础上,扩展出了一些额外的信息字节,通过这些字节,可以标识出数据包的收发方向。到这里,又涉及到了一个新的数据结构DLT_LINUX_LAPD 帧,下面介绍一下这个帧结构。
DLT_LINUX_LAPD 是linux 操作系统为了处理LAPD帧而定义的一个数据结构,这里借用一下这个结构来封装交换机输出的信令消息。可以使用下面的C 语言来描述这个帧的头部结构[3]:
sll_pkttype 为数据包类型,如果数据包是对端设备发送给本机的,取值为0。如果数据包是发往其他设备的,取值为4。
sll_protocol 为协议类型,取值0x0030
其他项目在程序中不使用,都置为0。
数据的封装分2 步完成。
①首先在交换机跟踪到的信令消息前面加上一个4 字节的LAPD_HDR,构成标准的LAPD 数据帧[4]。然后,在LAPD帧前面加上一个DLT_LINUX_HDR,构成DLT_LINUX_LAPD 数据帧。最后,在DLT_LINUX_LAPD 数据帧的前面加上PKT_HDR,构成PCAP 文件的一个基本数据单元。其数据单元结构,可以表示如下:
Packet= [PKT_HDR][DLT_LINUX_HDR][LAPD_HDR][原始信令消息]
②将封装好的数据单元存入PCAP 文件。这个过程比较简单:先创建一个文件,然后在文件中写入文件头PCAP_FILE_HDR,之后顺序写入第1 步生成的数据包,最后关闭文件。生成的PCAP 文件,其结构可以表示如下:FILE=[PCAP_FILE_HDR][Packet_1]…[Packet_n]
根据上面的描述,制作了一个格式转换工具,用于将交换机跟踪到的PR I 信令消息封装成W ireshark 软件可以读取的PCAP 格式,然后用W ireshark 进行解码[5]。下面是解码前后的数据对比:解码之前的原始数据:
原始数据包含"信令标识"、"承载能力"、"电路标识"、"主被叫"等信息,这些信息都是以十六进制代码的形式进行显示的。原始数据的可读性比较差,在工程实践中使用起来比较困难,往往需要求助开发人员对信令数据进行人工解读。为了提高工作效率,可以使用转换工具将跟踪到的信令源码打包到一个PCAP 文件,然后使用W ireshare 对这个文件进行解码。
下面是解码后的主叫部分:
从上面的例子可以直观看到,解码出的数据的可读性大大提高。那么解码的结果是否正确呢?参照技术规范《YDN 034.2-1997 ISDN 用户-网络接口规范第2 部分:数据链路层技术规范》对以上解析出的数据进行验证,以上关于消息类型,主被叫号码[6]等描述均正确。从以上的例子可以看到,通过构建PCAP 数据包的方式,可以很直观地对信令数据进行解码。有了这个工具的帮助,可以极大地提升工作效率。
W ireshark 软件可以解析的协议非常多,并且可以通过Lua 工具方便的添加对于新协议的支持。上面仅仅演示的是通过构建数据包,让W ireshark 帮助解析PR I 中继的Q.931 协议。同样,也可以通过构建数据包的形式,让W ireshark 分析其他的通信协议。在W ireshark 的帮助下,工作肯定更有效率。特别是在一些工程调试时,由于还要顾及到成本问题,昂贵的信令分析仪很难普及。在这些领域,掌握自己构建PCAP 文件的技术,进而利用W ireshark 对信令数据进行解析,更能发挥这一自由软件的价值。
[1]CHR IS S.W ireshark 数据包分析实战[M].北京:人民邮电出版社,2013:39-40.
[2]吕雪峰,彭文波,宋泽宇.网络分析技术揭秘[M].北京:机械工业出版社,2012:361-363.
[3]于 跃,朱程荣.基于Linux 嵌入式嗅探器的设计与实现[J].计算机应用与软件,2007,24(6):162-164.
[4]YDN 034.2-1997ISDN.数据链路层技术规范[S].
[5]白 洁.用W ireshark 抓包分析帧格式[J].电脑知识与技术,2011,07(28):6831-6832.
[6]YDN 034.3ISDN.第三层基本呼叫控制技术规范[S].