張小揚(yáng)
(蘭州軍區(qū),730030)
LDAP消息編制方法認(rèn)識(shí)和探索
張小揚(yáng)
(蘭州軍區(qū),730030)
數(shù)據(jù)中心在電信運(yùn)營(yíng)中地位日益重要,3GPP TR 32.808提出的統(tǒng)一數(shù)據(jù)庫(kù)框架(CPSF)是數(shù)據(jù)中心建設(shè)的一個(gè)方向。統(tǒng)一數(shù)據(jù)庫(kù)要求支持多種訪問(wèn)接口,在XML應(yīng)用轉(zhuǎn)化為L(zhǎng)DAP應(yīng)用的過(guò)程中,使用傳統(tǒng)的調(diào)用LDAP API函數(shù)的方法局限性很大,可控性不強(qiáng),難以應(yīng)付復(fù)雜的XML應(yīng)用。因此,本文提出了基于基本編碼規(guī)則的LDAP應(yīng)用實(shí)現(xiàn)機(jī)制,即放棄利用API函數(shù)實(shí)現(xiàn)應(yīng)用,采用自編解碼LDAP消息,自行控制消息的收發(fā)的實(shí)現(xiàn)方法,以提高LDAP應(yīng)用靈活度、可控性和擴(kuò)展性。
ASN.1;BER;LDAP;自編解碼
LDAP消息結(jié)構(gòu)是實(shí)現(xiàn)自編碼消息的基本依據(jù),它規(guī)定了消息中的結(jié)構(gòu)層次和數(shù)據(jù)的排列方式,只有通過(guò)對(duì)各種消息的結(jié)構(gòu)研究分析,找出消息的構(gòu)造特點(diǎn),從而找出自編解碼消息的思路。協(xié)議規(guī)定的LDAP消息是多種多樣,紛繁復(fù)雜的,這也正是利用ASN.1文法靈活性原因。它們有幾個(gè)特點(diǎn),也就是需要解決的幾個(gè)問(wèn)題,如下:
1.1 消息層次結(jié)構(gòu)各不相同
各種消息盡管都是由SEQUENCE構(gòu)成層次,但層次數(shù)差別很大,由于可選項(xiàng)使用與否造成同一種消息中的兩個(gè)層次也會(huì)存在不同,而且一個(gè)層次中可能還會(huì)出現(xiàn)多個(gè)子層次。因此對(duì)編碼來(lái)說(shuō)每一個(gè)消息都是一個(gè)不同的結(jié)構(gòu),如何實(shí)現(xiàn)程序自編碼的通用性是一個(gè)重要的研究點(diǎn)。
1.2 消息包含的數(shù)據(jù)類(lèi)型多種多樣
組成LDAP消息的數(shù)據(jù)類(lèi)型有多種,而每一種消息中都包含兩個(gè)以上的數(shù)據(jù)類(lèi)型,每一個(gè)層次上的數(shù)據(jù)類(lèi)型又都有各自的排列方法。要實(shí)現(xiàn)消息編碼,對(duì)于每一種數(shù)據(jù)類(lèi)型首先都必須給出壓入LDAP消息的實(shí)現(xiàn)方法,但每一種數(shù)據(jù)類(lèi)型壓入的方法又是不同的,因此,實(shí)現(xiàn)各種數(shù)據(jù)類(lèi)型的編碼壓入是一個(gè)必要的研究點(diǎn)。
1.3 每一個(gè)層次中的數(shù)據(jù)個(gè)數(shù)不確定
消息結(jié)構(gòu)中存在很多可選項(xiàng),除了造成層次上的不同,還會(huì)造成相同類(lèi)型消息在某一層次上要壓入的數(shù)據(jù)個(gè)數(shù)不同,如何對(duì)一種類(lèi)型的消息給出通用的編制格式是很重要的。
以上對(duì)LDAP消息的復(fù)雜性和不確定性的分析,要提高編解碼方法的可用、高效、靈活,實(shí)現(xiàn)編碼的通用方法是一個(gè)根本問(wèn)題。可以看到,無(wú)論LDAP消息如何復(fù)雜,但組成它的最小粒度只有兩類(lèi),一類(lèi)是表示消息結(jié)構(gòu)的SEQUENCE結(jié)構(gòu),它劃分了LDAP消息的層次結(jié)構(gòu),另一種是消息中各種類(lèi)型的數(shù)據(jù),它包含了LDAP消息的內(nèi)容。因此我們可以將LDAP消息分解成小粒度的這兩種元素,于是我們將SEQUENCE結(jié)構(gòu)和各種數(shù)據(jù)類(lèi)型原子化。
通過(guò)以上的分析,我們得出了消息編解碼的基本步驟:首先根據(jù)RFC4511協(xié)議規(guī)定的消息結(jié)構(gòu)確定消息的層次結(jié)構(gòu),即消息層次由怎樣的SEQUENCE結(jié)構(gòu)構(gòu)成;其次在SEQUENCE結(jié)構(gòu)中最大化的給出消息中包括的各種數(shù)據(jù)類(lèi)型次序,將數(shù)據(jù)類(lèi)型標(biāo)識(shí)填入到標(biāo)識(shí)SEQUENCE結(jié)構(gòu)開(kāi)始結(jié)束的“{”和“}”中,這樣就構(gòu)造好了消息的標(biāo)識(shí)符;最后,在編碼過(guò)程中將具體要壓入的數(shù)據(jù)根據(jù)消息數(shù)據(jù)類(lèi)型的排列次序進(jìn)行一一對(duì)應(yīng),完成消息的編碼。在解碼過(guò)程中,將要解碼后讀出的數(shù)據(jù)的存儲(chǔ)變量或空間一一對(duì)應(yīng)到標(biāo)識(shí)符的相應(yīng)數(shù)據(jù)類(lèi)型上,完成解碼過(guò)程。
根據(jù)RFC4511 LDAP協(xié)議中的描述,SEQUENCE結(jié)構(gòu)表示出了消息的層次嵌套關(guān)系,針對(duì)SEQUENCE結(jié)構(gòu)及編碼的需要,設(shè)計(jì)了對(duì)應(yīng)的結(jié)構(gòu)體sequence,如下所示:
在Struct sequence結(jié)構(gòu)體中,指針ber指向最終要生成的消息,它是系統(tǒng)針對(duì)BER提供的結(jié)構(gòu)體BerElement(lber.h)定義的一個(gè)實(shí)例;tag指示生成的sequence結(jié)構(gòu)體為SEQUENCE類(lèi)型,具體值為一個(gè)宏定義的整數(shù),ASN.1文法使用不同的整數(shù)宏指示各種類(lèi)型;SEQUENCE結(jié)構(gòu)中包含的數(shù)據(jù)需要按字節(jié)順序填進(jìn)sequence結(jié)構(gòu)體中,因此,必須有seq_first、seq_ptr的頭尾指針指出數(shù)據(jù)填入的位置;最后包含一個(gè)指向下一層次sequence結(jié)構(gòu)的seq_next指針,表示出消息的層次。如圖3.1所示,表示了一個(gè)三層的SEQUENCE結(jié)構(gòu)( {…{…{…}}} ):
Struct sequence也包含在BerElement結(jié)構(gòu)的定義中,這樣使得BerElement結(jié)構(gòu)成為一個(gè)可變長(zhǎng)的結(jié)構(gòu),sequence結(jié)構(gòu)就像是鏈表中的結(jié)點(diǎn),按需要不斷加入結(jié)點(diǎn),直到將消息所需內(nèi)容全部填入BerElement結(jié)構(gòu)體中,最終生成消息。
由于LDAP消息中的任何一個(gè)數(shù)據(jù)都是(T,L,V)的三元組,對(duì)一個(gè)消息每部分內(nèi)容,首先要壓入其數(shù)據(jù)類(lèi)型,然后計(jì)算壓入數(shù)據(jù)的長(zhǎng)度,即所占八位組的個(gè)數(shù),最后壓入其具體值。由于LDAP消息要同TCP通信的字節(jié)流映射,八位組的內(nèi)容都要最終轉(zhuǎn)換為char型壓入。這些部分的壓入使用memcpy函數(shù),從處理緩沖區(qū)中壓入到其中的某一層sequence結(jié)構(gòu)體中。很重要的一點(diǎn)是在一層sequence中的多個(gè)內(nèi)容是以字節(jié)連續(xù)壓入的,不需要做標(biāo)識(shí)進(jìn)行分隔。其中最復(fù)雜的是計(jì)算要壓入內(nèi)容的有效字節(jié)長(zhǎng)度,在LDAP消息中最常用的兩種類(lèi)型為INTEGER型和STRING型,下面描述這兩種數(shù)據(jù)類(lèi)型的處理步驟。
壓入INTEGER型的數(shù)據(jù),步驟如下:判斷壓入整數(shù)的正負(fù)。通過(guò)對(duì)0xffU的移位,與要壓入的整數(shù)進(jìn)行與操作,判斷出有效字節(jié)數(shù),即ASN.1要求的8位組個(gè)數(shù)。對(duì)長(zhǎng)度小于127的可直接壓入,大于127的頭個(gè)八位組表示長(zhǎng)度標(biāo)識(shí)需要占的長(zhǎng)度數(shù),后續(xù)八位組標(biāo)示壓入內(nèi)容的長(zhǎng)度,一般小于127八位組的情況占絕大多數(shù)。壓入STRING型數(shù)據(jù)比壓入INTEGER型數(shù)據(jù)容易的多,對(duì)STRING型數(shù)據(jù)由多個(gè)char型數(shù)據(jù)組成,最終壓入的是char型,因此有效長(zhǎng)度計(jì)算更簡(jiǎn)單,步驟如下:以char型指針指向STRING數(shù)據(jù);使用strlen函數(shù)得到STRING數(shù)據(jù)有效長(zhǎng)度;依次壓入STRING數(shù)據(jù)的每一位。
采用原子化的編解碼方式,使得LDAP消息生成形成了統(tǒng)一的模式,方便靈活,擺脫使用LDAP API將消息生成發(fā)送、接收讀取同時(shí)完成造成靈活度降低的問(wèn)題,大大提高LDAP消息的接收發(fā)送效率。
[1] 王丹.基于LDAP的全網(wǎng)資源管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D].北京郵電大學(xué).2011
[2] 王海嬌.LDAP服務(wù)器關(guān)鍵技術(shù)研究[D].華北電力大學(xué)(河北).2009
張小揚(yáng).1979.09.28男 陜西興平.工程師.研究方向 輕量級(jí)數(shù)據(jù)庫(kù)
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結(jié)構(gòu)的程序處理結(jié)構(gòu)