APP下载

LDAP消息编制方法认识和探索

2015-12-03张小扬

电子测试 2015年17期
关键词:编解码数据类型指针

张小扬

(兰州军区,730030)

LDAP消息编制方法认识和探索

张小扬

(兰州军区,730030)

数据中心在电信运营中地位日益重要,3GPP TR 32.808提出的统一数据库框架(CPSF)是数据中心建设的一个方向。统一数据库要求支持多种访问接口,在XML应用转化为LDAP应用的过程中,使用传统的调用LDAP API函数的方法局限性很大,可控性不强,难以应付复杂的XML应用。因此,本文提出了基于基本编码规则的LDAP应用实现机制,即放弃利用API函数实现应用,采用自编解码LDAP消息,自行控制消息的收发的实现方法,以提高LDAP应用灵活度、可控性和扩展性。

ASN.1;BER;LDAP;自编解码

1 问题的提出及分析

LDAP消息结构是实现自编码消息的基本依据,它规定了消息中的结构层次和数据的排列方式,只有通过对各种消息的结构研究分析,找出消息的构造特点,从而找出自编解码消息的思路。协议规定的LDAP消息是多种多样,纷繁复杂的,这也正是利用ASN.1文法灵活性原因。它们有几个特点,也就是需要解决的几个问题,如下:

1.1 消息层次结构各不相同

各种消息尽管都是由SEQUENCE构成层次,但层次数差别很大,由于可选项使用与否造成同一种消息中的两个层次也会存在不同,而且一个层次中可能还会出现多个子层次。因此对编码来说每一个消息都是一个不同的结构,如何实现程序自编码的通用性是一个重要的研究点。

1.2 消息包含的数据类型多种多样

组成LDAP消息的数据类型有多种,而每一种消息中都包含两个以上的数据类型,每一个层次上的数据类型又都有各自的排列方法。要实现消息编码,对于每一种数据类型首先都必须给出压入LDAP消息的实现方法,但每一种数据类型压入的方法又是不同的,因此,实现各种数据类型的编码压入是一个必要的研究点。

1.3 每一个层次中的数据个数不确定

消息结构中存在很多可选项,除了造成层次上的不同,还会造成相同类型消息在某一层次上要压入的数据个数不同,如何对一种类型的消息给出通用的编制格式是很重要的。

以上对LDAP消息的复杂性和不确定性的分析,要提高编解码方法的可用、高效、灵活,实现编码的通用方法是一个根本问题。可以看到,无论LDAP消息如何复杂,但组成它的最小粒度只有两类,一类是表示消息结构的SEQUENCE结构,它划分了LDAP消息的层次结构,另一种是消息中各种类型的数据,它包含了LDAP消息的内容。因此我们可以将LDAP消息分解成小粒度的这两种元素,于是我们将SEQUENCE结构和各种数据类型原子化。

通过以上的分析,我们得出了消息编解码的基本步骤:首先根据RFC4511协议规定的消息结构确定消息的层次结构,即消息层次由怎样的SEQUENCE结构构成;其次在SEQUENCE结构中最大化的给出消息中包括的各种数据类型次序,将数据类型标识填入到标识SEQUENCE结构开始结束的“{”和“}”中,这样就构造好了消息的标识符;最后,在编码过程中将具体要压入的数据根据消息数据类型的排列次序进行一一对应,完成消息的编码。在解码过程中,将要解码后读出的数据的存储变量或空间一一对应到标识符的相应数据类型上,完成解码过程。

2 SEQUENCE结构的处理

根据RFC4511 LDAP协议中的描述,SEQUENCE结构表示出了消息的层次嵌套关系,针对SEQUENCE结构及编码的需要,设计了对应的结构体sequence,如下所示:

在Struct sequence结构体中,指针ber指向最终要生成的消息,它是系统针对BER提供的结构体BerElement(lber.h)定义的一个实例;tag指示生成的sequence结构体为SEQUENCE类型,具体值为一个宏定义的整数,ASN.1文法使用不同的整数宏指示各种类型;SEQUENCE结构中包含的数据需要按字节顺序填进sequence结构体中,因此,必须有seq_first、seq_ptr的头尾指针指出数据填入的位置;最后包含一个指向下一层次sequence结构的seq_next指针,表示出消息的层次。如图3.1所示,表示了一个三层的SEQUENCE结构( {…{…{…}}} ):

Struct sequence也包含在BerElement结构的定义中,这样使得BerElement结构成为一个可变长的结构,sequence结构就像是链表中的结点,按需要不断加入结点,直到将消息所需内容全部填入BerElement结构体中,最终生成消息。

3 数据压入BerElement中的方法

由于LDAP消息中的任何一个数据都是(T,L,V)的三元组,对一个消息每部分内容,首先要压入其数据类型,然后计算压入数据的长度,即所占八位组的个数,最后压入其具体值。由于LDAP消息要同TCP通信的字节流映射,八位组的内容都要最终转换为char型压入。这些部分的压入使用memcpy函数,从处理缓冲区中压入到其中的某一层sequence结构体中。很重要的一点是在一层sequence中的多个内容是以字节连续压入的,不需要做标识进行分隔。其中最复杂的是计算要压入内容的有效字节长度,在LDAP消息中最常用的两种类型为INTEGER型和STRING型,下面描述这两种数据类型的处理步骤。

压入INTEGER型的数据,步骤如下:判断压入整数的正负。通过对0xffU的移位,与要压入的整数进行与操作,判断出有效字节数,即ASN.1要求的8位组个数。对长度小于127的可直接压入,大于127的头个八位组表示长度标识需要占的长度数,后续八位组标示压入内容的长度,一般小于127八位组的情况占绝大多数。压入STRING型数据比压入INTEGER型数据容易的多,对STRING型数据由多个char型数据组成,最终压入的是char型,因此有效长度计算更简单,步骤如下:以char型指针指向STRING数据;使用strlen函数得到STRING数据有效长度;依次压入STRING数据的每一位。

4 小结

采用原子化的编解码方式,使得LDAP消息生成形成了统一的模式,方便灵活,摆脱使用LDAP API将消息生成发送、接收读取同时完成造成灵活度降低的问题,大大提高LDAP消息的接收发送效率。

[1] 王丹.基于LDAP的全网资源管理系统的设计与实现[D].北京邮电大学.2011

[2] 王海娇.LDAP服务器关键技术研究[D].华北电力大学(河北).2009

张小扬.1979.09.28男 陕西兴平.工程师.研究方向 轻量级数据库

Understanding and exploration of LDAP message system

Zhang Xiaoyang
(Lanzhou military area command,730030)

Data center is becoming more important in telecom operation.The unified database framework (CPSF) proposed by TR 3GPP 32.808 is a direction of data center construction.The consolidated database requirements to support multiple access interfaces,in the application of XML transformation for LDAP application process,using the traditional calling LDAP API function limitation is very big,controllability is not strong.It is difficult to cope with the complexity of XML application.Therefore,this paper proposes the implementation mechanism based on LDAP application of basic encoding rules:give up using API function to achieve the application,using self-made decoding of LDAP messages,self control method to realize the sending and receiving of messages,to raise the LDAP application flexibility,controllability and scalability.

ASN.1;BER;LDAP;self decoding

图1 SEQUENCE结构的程序处理结构

猜你喜欢

编解码数据类型指针
垂悬指针检测与防御方法*
如何理解数据结构中的抽象数据类型
1553B总线控制器编解码设计
为多重编解码世界做好准备
大型民机试飞遥测视频编解码方法研究
为什么表的指针都按照顺时针方向转动
基于SeisBase模型的地震勘探成果数据管理系统设计
线上众筹产品的特征分析与研究
相似度计算及其在数据挖掘中的应用
浅析C语言指针