自定義應(yīng)用層通信協(xié)議.doc
《自定義應(yīng)用層通信協(xié)議.doc》由會(huì)員分享,可在線閱讀,更多相關(guān)《自定義應(yīng)用層通信協(xié)議.doc(5頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1.通信協(xié)議的概念及其要素 在OSI開放互聯(lián)參考模型中,對(duì)等實(shí)體之間數(shù)據(jù)單元在發(fā)送方逐層封裝,在接收方的逐層解析。發(fā)送方N層實(shí)體從N+1層實(shí)體得到的數(shù)據(jù)包稱為服務(wù)數(shù)據(jù) 單元(Service Data Unit,SDU)。N層實(shí)體只將其視為需要本實(shí)體提供服務(wù)的數(shù)據(jù),將服務(wù)數(shù)據(jù)單元進(jìn)行封裝,使其成為一個(gè)對(duì)方能夠理解的數(shù)據(jù)單元(Protocol Data Unit,PDU),封裝過程實(shí)際上是為SDU增加對(duì)等實(shí)體間約定的控制信息(Protocol Control Information,PCI)的過程。 為了保證網(wǎng)絡(luò)的各個(gè)功能的相對(duì)獨(dú)立性,以及便于實(shí)現(xiàn)和維護(hù),通常將協(xié)議劃分為多個(gè)子協(xié)議,并且讓這些協(xié)議保持一種層次結(jié)構(gòu),子協(xié)議的集合通常稱為協(xié)議簇。 網(wǎng)絡(luò)協(xié)議的分層有利于將復(fù)雜的問題分解成多個(gè)簡(jiǎn)單的問題,從而分而治之。各層的協(xié)議由各層的實(shí)體實(shí)現(xiàn),通信雙方對(duì)等層中完成相同協(xié)議功能的實(shí)體稱為 對(duì)等實(shí)體。對(duì)等實(shí)體按協(xié)議進(jìn)行通信,所以協(xié)議反映的是對(duì)等層的對(duì)等實(shí)體之間的一種橫向關(guān)系,嚴(yán)格地說,協(xié)議是對(duì)等實(shí)體共同遵守的規(guī)則和約定的集合。 通信協(xié)議精確地定義了雙方通信控制信息和解釋信息:發(fā)送方能將特定信息(文本、圖片、音頻、視頻)按協(xié)議封裝成指定格式的數(shù)據(jù)包,最終以串行化比特流在網(wǎng)絡(luò)上傳輸;接收方接收到數(shù)據(jù)包后,根據(jù)協(xié)議將比特流解析為本地化數(shù)據(jù),從而獲取對(duì)方發(fā)送過來的原始信息。 通信協(xié)議包括三個(gè)要素: (1)語法:規(guī)定了信息的結(jié)構(gòu)和格式; (2)語義:表明信息要表達(dá)的內(nèi)容; (3)同步:規(guī)則涉及雙方的交互關(guān)系和事件順序。 整個(gè)計(jì)算機(jī)網(wǎng)絡(luò)的實(shí)現(xiàn)體現(xiàn)為協(xié)議的實(shí)現(xiàn),TCP/IP協(xié)議是Internet互聯(lián)網(wǎng)的核心協(xié)議。 2.通信協(xié)議開發(fā)步驟 (1) 協(xié)議的開發(fā)主要包括協(xié)議設(shè)計(jì)、協(xié)議形式描述、協(xié)議實(shí)現(xiàn)和協(xié)議一致性測(cè)試。協(xié)議的開發(fā)過程與步驟如圖1所示。 圖1 協(xié)議開發(fā)過程與步驟 (2) 協(xié)議設(shè)計(jì)過程中的分組發(fā)送接收模型如圖2所示。 圖2協(xié)議設(shè)計(jì)過程中的分組發(fā)送接收模型 (3)協(xié)議的一致性測(cè)試 協(xié)議的一致性測(cè)試是指測(cè)試協(xié)議能否按照預(yù)想的控制策略實(shí)現(xiàn)正確的通信,主要體現(xiàn)在數(shù)據(jù)包通過信道從信源傳送到信宿后,信宿能夠根據(jù)協(xié)議正確的解析出原始信息。 協(xié)議的一致性測(cè)試如圖3所示。 圖3 協(xié)議一致性測(cè)試環(huán)境 根據(jù)測(cè)試環(huán)境的可以分為局部測(cè)試和分布式測(cè)試,如圖4所示。 圖4局部測(cè)試法、分布式測(cè)試法 3.?dāng)?shù)據(jù)包和數(shù)據(jù)報(bào) 為方便描述自定義協(xié)議,還是借用數(shù)據(jù)包和數(shù)據(jù)報(bào)來描述封裝數(shù)據(jù)單元和傳輸數(shù)據(jù)單元,但這里的數(shù)據(jù)包和數(shù)據(jù)報(bào)完全不同于TCP/IP架構(gòu)中的Packet和Datagram概念。 下文所述的數(shù)據(jù)包指封裝的基本單位,以TLV(Type-Length-Value)格式封裝基本消息單位;數(shù)據(jù)報(bào)Package是傳輸?shù)幕締挝?,頭部包含序列號(hào)和命令信息。接收端根據(jù)命令信息分辨事件類型,做出不同的解析。報(bào)文實(shí)體是多個(gè)TLV數(shù)據(jù)包組成的鏈表。 4.數(shù)據(jù)包TLV的設(shè)計(jì) 從應(yīng)用層HTTP協(xié)議,到超文本置標(biāo)語言HTML(HyperText Mark-up Language),再到可擴(kuò)展置標(biāo)語言XML(Extensible Markup Language),它們提供了數(shù)據(jù)的格式化存儲(chǔ)、傳輸和格式化顯示的規(guī)范,是網(wǎng)絡(luò)通信的基石。然而HTTP協(xié)議以及HTML/XML置標(biāo)語言的本質(zhì)就是 定義一堆標(biāo)簽(Tag)對(duì)數(shù)據(jù)進(jìn)行串行化序列化,然后接收方再根據(jù)標(biāo)簽解析、還原數(shù)據(jù)。 自定義通信協(xié)議的關(guān)鍵是對(duì)數(shù)據(jù)包的合理構(gòu)造(construct)和正確解析(parse),即制定編解碼規(guī)則。 抽象語法標(biāo)記ASN(Abstract Syntax Notation) BER的長(zhǎng)度確定的編碼方式,由3部分組成Identifier octets、Length octets和Contents octets,實(shí)際上這就是一中TLV(Type-Length-Value)模型:類型字段(Type或Tag)是關(guān)于標(biāo)簽和編碼格式的信息;長(zhǎng)度字段 (Length)定義數(shù)值的長(zhǎng)度; 內(nèi)容字段(Value)表示實(shí)際的數(shù)值。 因此,一個(gè)編碼值又稱TLV三元組。編碼可以是基本型或結(jié)構(gòu)型,如果它表示一個(gè)簡(jiǎn)單類型的、完整的顯式值,那么編碼就是基本型(primitive);如果它表示的值具有嵌套結(jié)構(gòu),那么編碼就是結(jié)構(gòu)型 (constructed)。 TLV編碼就是指對(duì)Type(Tag)、Length和Value進(jìn)行編碼,形成比特流數(shù)據(jù)包;解碼是編碼的逆過程,是從比特流緩沖區(qū)中解析還原出原始數(shù)據(jù)。 采用C++編程語言設(shè)計(jì)TLV協(xié)議類,其類視圖如圖5所示。 圖5 CTLV類視圖 目前只提供設(shè)置整形值(int型)的setValue_Int和設(shè)置字符串值(C_String型)的SetValue_Cstring兩個(gè)接口。 TLV將數(shù)據(jù)封裝成包的格式如表1所示。 表1 TLV包格式 TLV包 頭部 包實(shí)體 m_dwTag m_nLen m_pValue TLV的接口說明: (1)值類型標(biāo)簽m_vtTag是內(nèi)部輔助枚舉變量,它根據(jù)構(gòu)造TLV時(shí)傳遞的服務(wù)類型標(biāo)簽m_dwTag來確定。 (2)TLV::m_nLen在為TLV設(shè)置具體值時(shí)確定。 (3)TLV包的封裝: 1)使用Tag參數(shù)創(chuàng)建一個(gè)TLV對(duì)象后,調(diào)用TLV::setValue_*方法為TLV填充具體值; 2)調(diào)用TLV::toBuffer方法打包到緩沖區(qū)streamBuffer。 (4)TLV包的解析:創(chuàng)建一個(gè)TLV對(duì)象后,調(diào)用TLV::fromBuffer方法從緩沖區(qū)streamBuffer解析出TLV。 (5)封裝和解析涉及到本機(jī)字節(jié)順序和網(wǎng)絡(luò)字節(jié)順序的轉(zhuǎn)換問題。 (6)調(diào)用TLV::setValue_*方法填充TLV時(shí),統(tǒng)一字節(jié)邊界數(shù)為4。 5.數(shù)據(jù)報(bào)Package的設(shè)計(jì) 不同于底層的數(shù)據(jù)包/數(shù)據(jù)報(bào)只是對(duì)數(shù)據(jù)層次的封裝解析,實(shí)際應(yīng)用程序是以事件驅(qū)動(dòng)的,因此必須注冊(cè)不同的信令(事件類型標(biāo)簽),然后填充到數(shù)據(jù)報(bào)中。接收端根據(jù)信令做出相應(yīng)的事件處理。 例如在C/S通信系統(tǒng)中,客戶端往往要先登錄,通過服務(wù)器端的校驗(yàn)才能進(jìn)行后續(xù)通信。因此客戶端運(yùn)行后,需要構(gòu)造并向服 務(wù)器端發(fā)送含有LOGIN信令的包含用戶名字符串strUserName和密碼字符串strPassWord的數(shù)據(jù)報(bào);服務(wù)器端解析LOGIN信令后做校 驗(yàn)處理,然后發(fā)送含有LOGIN_RESPONSE信令和校驗(yàn)結(jié)果的回執(zhí)數(shù)據(jù)報(bào)給客戶端。 采用C++編程語言設(shè)計(jì)Package類,其類視圖如圖6所示。 圖6 CPackage類視圖 Package類將TLV封裝成包的格式如表2所示。 表2 Package包格式 Package包 頭部 序列號(hào) 包實(shí)體 m_nCmdLen m_dwCmdID m_dwCmdState m_nSeqNo Count*Tlv Package的接口說明: (1)Package::m_nCmdLen是整個(gè)Package包的長(zhǎng)度,將其作為首個(gè)字段的好處在于當(dāng)傳送大數(shù)據(jù)包時(shí),接收方可以根據(jù)數(shù)據(jù)長(zhǎng)度來控制讀狀態(tài),從而將一個(gè)大數(shù)據(jù)包分批接收。 (2)Package::m_nCmdLen在構(gòu)造函數(shù)中初始化為16,在調(diào)用Package::addTLV方法填充包實(shí)體時(shí)增長(zhǎng)。 (3)Package包的封裝: 1)創(chuàng)建Package對(duì)象后,調(diào)用Package::setHeader方法填充頭部信令; 2)創(chuàng)建TLV對(duì)象并填充數(shù)據(jù),再調(diào)用Package::addTLV方法填充包實(shí)體; 3)調(diào)用Package::toBuffer方法將Package打包到緩沖區(qū)streamBuffer。 (4)Package包的解析: 1)先創(chuàng)建一個(gè)Package對(duì)象,調(diào)用Package::fromBuffer方法從緩沖區(qū)streamBuffer先解析出Package的頭部和序列號(hào),再從剩余緩沖區(qū)中解析出TLV并將其串行化到鏈表。 2)調(diào)用Package::getTLV方法根據(jù)Tag從鏈表中查找具體TLV包,再調(diào)用TLV::getValue方法取得具體值。 (5)Package::toBuffer方法和Package::fromBuffer方法主要遍歷Package::m_TLV_List列表,然后調(diào)用TLV::toBuffer方法和TLV::fromBuffer方法解析出TLV數(shù)據(jù)單元。 TLV數(shù)據(jù)包的功能測(cè)試(主要是本地測(cè)試) 鑒于實(shí)際通信數(shù)據(jù)最后都要轉(zhuǎn)換成比特流,故只測(cè)試發(fā)送字符串類型的變量,僅測(cè)試協(xié)議能否正確打包、解析。其他類型的普通數(shù)據(jù)都可以轉(zhuǎn)換成字符串傳輸,最后,接收方根據(jù)m_dwTag確定值類型m_vtTag,解析出具體值。 對(duì)TLV::setValue_C_String方法填充TLV的測(cè)試,需要考慮字節(jié)對(duì)齊問題。對(duì)于長(zhǎng)度為4字節(jié)倍數(shù)的C狀態(tài)字符串,打包時(shí)省去末尾的‘/0’結(jié)束標(biāo)志符。需要測(cè)試長(zhǎng)度非4倍數(shù)的字符串和長(zhǎng)度為4倍數(shù)的字符串。 經(jīng)本地測(cè)試,調(diào)用TLV::setValue_Int方法和TLV::setValue_C_String方法構(gòu)造整形和字符串時(shí),能夠正確封裝、正確解析。 Package數(shù)據(jù)報(bào)的功能測(cè)試,主要是將TLV組合成包,然后添加信令,完成特定的通信。對(duì)登陸LOGIN和發(fā)送消息SUBMIT_SM的測(cè)試表明Package協(xié)議能正確封裝、正確解析。 在實(shí)際項(xiàng)目中使用Package通信協(xié)議,對(duì)于稍大一點(diǎn)的數(shù)據(jù)塊需要控制好讀的步驟,以便能接收整包完整的信息。- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
9.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 自定義 應(yīng)用 通信協(xié)議
鏈接地址:http://www.820124.com/p-9614864.html