自定義應(yīng)用層通信協(xié)議_第1頁(yè)
自定義應(yīng)用層通信協(xié)議_第2頁(yè)
自定義應(yīng)用層通信協(xié)議_第3頁(yè)
自定義應(yīng)用層通信協(xié)議_第4頁(yè)
自定義應(yīng)用層通信協(xié)議_第5頁(yè)
已閱讀5頁(yè),還剩1頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、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é)議保持一

2、種層次結(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)格地說(shuō),協(xié)議是對(duì)等實(shí)體共同遵守的規(guī)則和約定的集合。通信協(xié)議精確地定義了雙方通信控制信息和解釋信息:發(fā)送方能將特定信息(文本、圖片、音頻、視頻)按協(xié)議封裝成指定格式的數(shù)據(jù)包,最終以串行化比特流在網(wǎng)絡(luò)上傳輸;接收方接收到數(shù)據(jù)包后,根據(jù)協(xié)議將比特流解析為本地化數(shù)據(jù),從而獲取對(duì)方發(fā)送過來(lái)的原始信息。通信協(xié)議包括三個(gè)要素:(1)語(yǔ)法:規(guī)定了

3、信息的結(jié)構(gòu)和格式;(2)語(yǔ)義:表明信息要表達(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所示。1 / 6圖2協(xié)議設(shè)計(jì)過程中的分組發(fā)送接收模型(3)協(xié)議的一致性測(cè)試協(xié)議的一致性測(cè)試是指測(cè)試協(xié)議能否按照預(yù)想的控制策略實(shí)現(xiàn)正確的通信,主要體現(xiàn)在數(shù)據(jù)包通過信道從信源傳送到信宿后,信宿能夠根據(jù)協(xié)議正確的解析出原

4、始信息。協(xié)議的一致性測(cè)試如圖3所示。圖3 協(xié)議一致性測(cè)試環(huán)境根據(jù)測(cè)試環(huán)境的可以分為局部測(cè)試和分布式測(cè)試,如圖4所示。圖4局部測(cè)試法、分布式測(cè)試法3數(shù)據(jù)包和數(shù)據(jù)報(bào)為方便描述自定義協(xié)議,還是借用數(shù)據(jù)包和數(shù)據(jù)報(bào)來(lái)描述封裝數(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è)

5、計(jì)從應(yīng)用層http協(xié)議,到超文本置標(biāo)語(yǔ)言html(hypertext mark-up language),再到可擴(kuò)展置標(biāo)語(yǔ)言xml(extensible markup language),它們提供了數(shù)據(jù)的格式化存儲(chǔ)、傳輸和格式化顯示的規(guī)范,是網(wǎng)絡(luò)通信的基石。然而http協(xié)議以及html/xml置標(biāo)語(yǔ)言的本質(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ī)則。抽象語(yǔ)法標(biāo)記asn(abstract syntax notation) ber的長(zhǎng)度確定的編碼方式

6、,由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)行編

7、碼,形成比特流數(shù)據(jù)包;解碼是編碼的逆過程,是從比特流緩沖區(qū)中解析還原出原始數(shù)據(jù)。采用c+編程語(yǔ)言設(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_dwtagm_nlenm_pvalue tlv的接口說(shuō)明:(1)值類型標(biāo)簽m_vttag是內(nèi)部輔助枚舉變量,它根據(jù)構(gòu)造tlv時(shí)傳遞的服務(wù)類型標(biāo)簽m_dwtag來(lái)確定。(2)tlv:m_nlen在為tlv設(shè)置具體值時(shí)確定。(3)tl

8、v包的封裝: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)簽),然后填

9、充到數(shù)據(jù)報(bào)中。接收端根據(jù)信令做出相應(yīng)的事件處理。例如在c/s通信系統(tǒng)中,客戶端往往要先登錄,通過服務(wù)器端的校驗(yàn)才能進(jìn)行后續(xù)通信。因此客戶端運(yùn)行后,需要構(gòu)造并向服 務(wù)器端發(fā)送含有l(wèi)ogin信令的包含用戶名字符串strusername和密碼字符串strpassword的數(shù)據(jù)報(bào);服務(wù)器端解析login信令后做校 驗(yàn)處理,然后發(fā)送含有l(wèi)ogin_response信令和校驗(yàn)結(jié)果的回執(zhí)數(shù)據(jù)報(bào)給客戶端。采用c+編程語(yǔ)言設(shè)計(jì)package類,其類視圖如圖6所示。圖6 cpackage類視圖package類將tlv封裝成包的格式如表2所示。表2 package包格式package包頭部序列號(hào)包實(shí)體m_ncmdl

10、enm_dwcmdidm_dwcmdstatem_nseqnocount*tlv package的接口說(shuō)明:(1)package:m_ncmdlen是整個(gè)package包的長(zhǎng)度,將其作為首個(gè)字段的好處在于當(dāng)傳送大數(shù)據(jù)包時(shí),接收方可以根據(jù)數(shù)據(jù)長(zhǎng)度來(lái)控制讀狀態(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í)

11、體;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),再?gòu)氖S嗑彌_區(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:

12、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í),

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論