張小揚
(蘭州軍區,730030)
LDAP消息編制方法認識和探索
張小揚
(蘭州軍區,730030)
數據中心在電信運營中地位日益重要,3GPP TR 32.808提出的統一數據庫框架(CPSF)是數據中心建設的一個方向。統一數據庫要求支持多種訪問接口,在XML應用轉化為LDAP應用的過程中,使用傳統的調用LDAP API函數的方法局限性很大,可控性不強,難以應付復雜的XML應用。因此,本文提出了基于基本編碼規則的LDAP應用實現機制,即放棄利用API函數實現應用,采用自編解碼LDAP消息,自行控制消息的收發的實現方法,以提高LDAP應用靈活度、可控性和擴展性。
ASN.1;BER;LDAP;自編解碼
LDAP消息結構是實現自編碼消息的基本依據,它規定了消息中的結構層次和數據的排列方式,只有通過對各種消息的結構研究分析,找出消息的構造特點,從而找出自編解碼消息的思路。協議規定的LDAP消息是多種多樣,紛繁復雜的,這也正是利用ASN.1文法靈活性原因。它們有幾個特點,也就是需要解決的幾個問題,如下:
1.1 消息層次結構各不相同
各種消息盡管都是由SEQUENCE構成層次,但層次數差別很大,由于可選項使用與否造成同一種消息中的兩個層次也會存在不同,而且一個層次中可能還會出現多個子層次。因此對編碼來說每一個消息都是一個不同的結構,如何實現程序自編碼的通用性是一個重要的研究點。
1.2 消息包含的數據類型多種多樣
組成LDAP消息的數據類型有多種,而每一種消息中都包含兩個以上的數據類型,每一個層次上的數據類型又都有各自的排列方法。要實現消息編碼,對于每一種數據類型首先都必須給出壓入LDAP消息的實現方法,但每一種數據類型壓入的方法又是不同的,因此,實現各種數據類型的編碼壓入是一個必要的研究點。
1.3 每一個層次中的數據個數不確定
消息結構中存在很多可選項,除了造成層次上的不同,還會造成相同類型消息在某一層次上要壓入的數據個數不同,如何對一種類型的消息給出通用的編制格式是很重要的。
以上對LDAP消息的復雜性和不確定性的分析,要提高編解碼方法的可用、高效、靈活,實現編碼的通用方法是一個根本問題。可以看到,無論LDAP消息如何復雜,但組成它的最小粒度只有兩類,一類是表示消息結構的SEQUENCE結構,它劃分了LDAP消息的層次結構,另一種是消息中各種類型的數據,它包含了LDAP消息的內容。因此我們可以將LDAP消息分解成小粒度的這兩種元素,于是我們將SEQUENCE結構和各種數據類型原子化。
通過以上的分析,我們得出了消息編解碼的基本步驟:首先根據RFC4511協議規定的消息結構確定消息的層次結構,即消息層次由怎樣的SEQUENCE結構構成;其次在SEQUENCE結構中最大化的給出消息中包括的各種數據類型次序,將數據類型標識填入到標識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結構體中,最終生成消息。
由于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數據的每一位。
采用原子化的編解碼方式,使得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結構的程序處理結構