0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何實(shí)現(xiàn)自定義的應(yīng)用層協(xié)議呢?

嵌入式應(yīng)用研究院 ? 來源:嵌入式應(yīng)用研究院 ? 2023-08-16 09:57 ? 次閱讀

簡述

互聯(lián)網(wǎng)上充斥著各種各樣的網(wǎng)絡(luò)服務(wù),在對外提供網(wǎng)絡(luò)服務(wù)時(shí),服務(wù)端和客戶端需要遵循同一套數(shù)據(jù)通訊協(xié)議,才能正常的進(jìn)行通訊;就好像你跟臺(tái)灣人溝通用閩南語,跟廣東人溝通就用粵語一樣。

實(shí)現(xiàn)自己的應(yīng)用功能時(shí),已知的知名協(xié)議(http,smtp,ftp等)在安全性、可擴(kuò)展性等方面不能滿足需求,從而需要設(shè)計(jì)并實(shí)現(xiàn)自己的應(yīng)用層協(xié)議。

2.協(xié)議分類

2.1按編碼方式

二進(jìn)制協(xié)議比如網(wǎng)絡(luò)通信運(yùn)輸層中的tcp協(xié)議。

明文的文本協(xié)議比如應(yīng)用層的http、redis協(xié)議。

混合協(xié)議(二進(jìn)制+明文)比如蘋果公司早期的APNs推送協(xié)議。

2.2按協(xié)議邊界

固定邊界協(xié)議能夠明確得知一個(gè)協(xié)議報(bào)文的長度,這樣的協(xié)議易于解析,比如tcp協(xié)議。

模糊邊界協(xié)議無法明確得知一個(gè)協(xié)議報(bào)文的長度,這樣的協(xié)議解析較為復(fù)雜,通常需要通過某些特定的字節(jié)來界定報(bào)文是否結(jié)束,比如http協(xié)議。

3.協(xié)議優(yōu)劣的基本評判標(biāo)準(zhǔn)

高效的快速的打包解包減少對cpu的占用,高數(shù)據(jù)壓縮率降低對網(wǎng)絡(luò)帶寬的占用。

簡單的易于人的理解、程序的解析。

易于擴(kuò)展的對可預(yù)知的變更,有足夠的彈性用于擴(kuò)展。

容易兼容的

向前兼容,對于舊協(xié)議發(fā)出的報(bào)文,能使用新協(xié)議進(jìn)行解析,只是新協(xié)議支持的新功能不能使用。

向后兼容,對于新協(xié)議發(fā)出的報(bào)文,能使用舊協(xié)議進(jìn)行解析,只是新協(xié)議支持的新功能不能使用。

4.自定義應(yīng)用層協(xié)議的優(yōu)缺點(diǎn)

4.1優(yōu)點(diǎn)

非知名協(xié)議,數(shù)據(jù)通信更安全,黑客如果要分析協(xié)議的漏洞就必須先破譯你的通訊協(xié)議。

擴(kuò)展性更好,可以根據(jù)業(yè)務(wù)需求和發(fā)展擴(kuò)展自己的協(xié)議,而已知的知名協(xié)議不好擴(kuò)展。

4.2缺點(diǎn)

設(shè)計(jì)難度高,協(xié)議需要易擴(kuò)展,最好能向后向前兼容。

實(shí)現(xiàn)繁瑣,需要自己實(shí)現(xiàn)序列化和反序列化。

5.動(dòng)手前的預(yù)備知識

5.1大小端

計(jì)算機(jī)系統(tǒng)在存儲(chǔ)數(shù)據(jù)時(shí)起始地址是高地址還是低地址。

大端從高地址開始存儲(chǔ)。

小端從低地址開始存儲(chǔ)。

圖解

0279f96c-3b7a-11ee-9e74-dac502259ad0.jpg

判斷這里以c/c++語言代碼為例,使用了c語言中聯(lián)合體的特性。

wKgaomTcLTqAKOUXAABXM23J-Z4400.jpg

5.2網(wǎng)絡(luò)字節(jié)序

顧名思義就是數(shù)據(jù)在網(wǎng)絡(luò)傳送的字節(jié)流中的起始地址的高低,為了避免在網(wǎng)絡(luò)通信中引入其他復(fù)雜性,網(wǎng)絡(luò)字節(jié)序統(tǒng)一是大端的。

5.3本地字節(jié)序

本地操作系統(tǒng)的大小端,不同操作系統(tǒng)可能采用不同的字節(jié)序。

5.4內(nèi)存對象與布局

任何變量,不管是堆變量還是棧變量都對應(yīng)著操作系統(tǒng)中的一塊內(nèi)存,由于內(nèi)存對齊的要求程序中的變量并不是緊湊存儲(chǔ)的,例如一個(gè)c語言的結(jié)構(gòu)體Test在內(nèi)存中的布局可能如下圖所示。

02994c2c-3b7a-11ee-9e74-dac502259ad0.jpg



wKgaomTcLViAaSV_AAAS6qumv3U393.jpg

5.5序列化與反序列化

將計(jì)算機(jī)語言中的內(nèi)存對象轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)流,例如把c語言中的結(jié)構(gòu)體Test轉(zhuǎn)化成uint8_t data[6]字節(jié)流。

將網(wǎng)絡(luò)字節(jié)流轉(zhuǎn)換為計(jì)算機(jī)語言中的內(nèi)存對象,例如把uint8_t data[6]字節(jié)流轉(zhuǎn)化成c語言中的結(jié)構(gòu)體Test。

02b9518e-3b7a-11ee-9e74-dac502259ad0.jpg

6.一個(gè)例子

6.1 協(xié)議設(shè)計(jì)

本協(xié)議采用固定邊界+混合編碼策略。

協(xié)議頭8字節(jié)的定長協(xié)議頭。支持版本號,基于魔數(shù)的快速校驗(yàn),不同服務(wù)的復(fù)用。定長協(xié)議頭使協(xié)議易于解析且高效。

協(xié)議體變長json作為協(xié)議體。json使用明文文本編碼,可讀性強(qiáng)、易于擴(kuò)展、前后兼容、通用的編解碼算法。json協(xié)議體為協(xié)議提供了良好的擴(kuò)展性和兼容性。

協(xié)議可視化圖

02cfaaec-3b7a-11ee-9e74-dac502259ad0.jpg

6.2 協(xié)議實(shí)現(xiàn)

talk is easy,just code it,使用c/c++語言來實(shí)現(xiàn)。

6.2.1c/c++語言實(shí)現(xiàn)

使用結(jié)構(gòu)體MyProtoHead來存儲(chǔ)協(xié)議頭

wKgaomTcLYCAYnPfAAC4TkwyOGk080.jpg
wKgaomTcLYiAcBSDAACzPaN81NI447.jpg

6.2.2打包(序列化)

wKgaomTcLaCACHaDAADgxDmOCXs116.jpg

6.2.3解包(反序列化)

wKgZomTcLdKAC4y_AADRyORSZDw599.jpg
wKgaomTcLdmAZbOiAACgdoISGsk580.jpg
wKgZomTcLd-AVLWsAAC2jgC4jmI010.jpg
wKgZomTcLgGACCxkAAB4pLsDHVE204.jpg

7.完整源碼與測試

code is easy,just run it.

7.1源碼

wKgZomTcLjiAIulpAAC98bY9d4s177.jpg
wKgaomTcLkCAIN_wAADS1PDCm0Q725.jpg
wKgZomTcLkeAVlCSAAEHKILc4O8373.jpg
wKgaomTcLnyAfqlxAADONhZvXGo202.jpg
wKgZomTcLoOAa9enAADQ8LLb-70052.jpg
wKgZomTcLoqAQZkMAADbLn7AL6s274.jpg
wKgZomTcLrSAH-Y8AACrF8-pNdo716.jpg
wKgZomTcLryAaIlLAAB922fwDOw901.jpg

7.2運(yùn)行測試

02e4f280-3b7a-11ee-9e74-dac502259ad0.png

8.總結(jié)

不到350行的代碼向我們展示了一個(gè)自定義的應(yīng)用層協(xié)議該如何實(shí)現(xiàn),當(dāng)然這個(gè)協(xié)議是不夠完善的,還可以對其完善,比如對協(xié)議體進(jìn)行加密加強(qiáng)協(xié)議的安全性等。





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 存儲(chǔ)器
    +關(guān)注

    關(guān)注

    38

    文章

    7438

    瀏覽量

    163529
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7595

    瀏覽量

    135920
  • 計(jì)算機(jī)系統(tǒng)

    關(guān)注

    0

    文章

    280

    瀏覽量

    24074
  • TCP通信
    +關(guān)注

    關(guān)注

    0

    文章

    146

    瀏覽量

    4200
  • HTTP接口
    +關(guān)注

    關(guān)注

    0

    文章

    21

    瀏覽量

    1769

原文標(biāo)題:手把手教你實(shí)現(xiàn)自定義的應(yīng)用層協(xié)議

文章出處:【微信號:嵌入式應(yīng)用研究院,微信公眾號:嵌入式應(yīng)用研究院】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    何進(jìn)行串口通信自定義協(xié)議,真心求教

    現(xiàn)在需要通過串口通信向向顯示屏傳 溫度、適度還有心跳,以便在顯示屏顯示出來,協(xié)議自定義。求教,怎么自定義協(xié)議。求高手指點(diǎn)。謝謝~只是
    發(fā)表于 09-23 07:38

    NETTY自定義協(xié)議的TCP服務(wù)器

    一、想法及需求1.1最初設(shè)想1.2需求分析二、硬件2.1原理圖解釋2.2PCB繪制2.3焊接及成品三、軟件3.1NETTY自定義協(xié)議的TCP服務(wù)器3.1.1使用原因?yàn)槭裁匆褂?b class='flag-5'>自定義的協(xié)議
    發(fā)表于 12-21 08:30

    基于自定義協(xié)議的網(wǎng)絡(luò)地理信息系統(tǒng)

    探索基于自定義協(xié)議開發(fā)網(wǎng)絡(luò)地理信息系統(tǒng)的方法。自定義一套工作于TCP/IP應(yīng)用層協(xié)議,基于該協(xié)議
    發(fā)表于 04-18 10:03 ?34次下載

    1602自定義字符

    1602液晶能夠顯示自定義字符,能夠根據(jù)讀者的具體情況顯示自定義字符。
    發(fā)表于 01-20 15:43 ?1次下載

    如何在LabVIEW中實(shí)現(xiàn)自定義控件

    本文檔的主要內(nèi)容詳細(xì)介紹的是如何在LabVIEW中實(shí)現(xiàn)自定義控件。
    發(fā)表于 01-14 17:17 ?48次下載
    如何在LabVIEW中<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>自定義</b>控件

    單片機(jī)學(xué)習(xí)筆記————51單片機(jī)實(shí)現(xiàn)常用的自定義串口通訊協(xié)議

    單片機(jī)學(xué)習(xí)筆記————51單片機(jī)實(shí)現(xiàn)常用的自定義串口通訊協(xié)議
    發(fā)表于 11-23 17:06 ?37次下載
    單片機(jī)學(xué)習(xí)筆記————51單片機(jī)<b class='flag-5'>實(shí)現(xiàn)</b>常用的<b class='flag-5'>自定義</b>串口通訊<b class='flag-5'>協(xié)議</b>

    C#與STM32自定義通信協(xié)議

    C#與STM32自定義通信協(xié)議功能:1.可通過C#上位機(jī)對多臺(tái)STM32下位機(jī)進(jìn)行控制2.自定義上位機(jī)與下位機(jī)通信協(xié)議
    發(fā)表于 12-24 18:59 ?37次下載
    C#與STM32<b class='flag-5'>自定義</b>通信<b class='flag-5'>協(xié)議</b>

    基于HAL庫的USB自定義HID設(shè)備實(shí)現(xiàn)

    基于HAL庫的USB自定義HID設(shè)備實(shí)現(xiàn)基于HAL庫的USB自定義HID設(shè)備實(shí)現(xiàn)準(zhǔn)備工作CubeMX配置代碼實(shí)現(xiàn)基于HAL庫的USB
    發(fā)表于 12-28 20:04 ?13次下載
    基于HAL庫的USB<b class='flag-5'>自定義</b>HID設(shè)備<b class='flag-5'>實(shí)現(xiàn)</b>

    自定義視圖組件教程案例

    自定義組件 1.自定義組件-particles(粒子效果) 2.自定義組件- pulse(脈沖button效果) 3.自定義組件-progress(progress效果) 4.
    發(fā)表于 04-08 10:48 ?14次下載

    深入理解RPC自定義網(wǎng)絡(luò)協(xié)議

    只要涉及到網(wǎng)絡(luò)通信,必然涉及到網(wǎng)絡(luò)協(xié)議,應(yīng)用層也是一樣。在應(yīng)用層最標(biāo)準(zhǔn)和常用的就是HTTP協(xié)議。但在很多性能要求較高的場景各大企業(yè)內(nèi)部也會(huì)自定義
    的頭像 發(fā)表于 06-12 15:00 ?2501次閱讀

    ArkUI如何自定義彈窗(eTS)

    自定義彈窗其實(shí)也是比較簡單的,通過CustomDialogController類就可以顯示自定義彈窗。
    的頭像 發(fā)表于 08-31 08:24 ?2103次閱讀

    ESP32上的自定義UART協(xié)議開源

    電子發(fā)燒友網(wǎng)站提供《ESP32上的自定義UART協(xié)議開源.zip》資料免費(fèi)下載
    發(fā)表于 02-13 16:38 ?4次下載
    ESP32上的<b class='flag-5'>自定義</b>UART<b class='flag-5'>協(xié)議</b>開源

    自定義算子開發(fā)

    一個(gè)完整的自定義算子應(yīng)用過程包括注冊算子、算子實(shí)現(xiàn)、含自定義算子模型轉(zhuǎn)換和運(yùn)行含自定義op模型四個(gè)階段。在大多數(shù)情況下,您的模型應(yīng)該可以通過使用hb_mapper工具完成轉(zhuǎn)換并順利部署
    的頭像 發(fā)表于 04-07 16:11 ?2715次閱讀
    <b class='flag-5'>自定義</b>算子開發(fā)

    labview超快自定義控件制作和普通自定義控件制作

    labview超快自定義控件制作和普通自定義控件制作
    發(fā)表于 08-21 10:32 ?12次下載

    TSMaster 自定義 LIN 調(diào)度表編程指導(dǎo)

    LIN(LocalInterconnectNetwork)協(xié)議調(diào)度表是用于LIN總線通信中的消息調(diào)度的一種機(jī)制,我們收到越來越多來自不同用戶希望能夠通過接口實(shí)現(xiàn)自定義LIN調(diào)度表的需求。所以在
    的頭像 發(fā)表于 05-11 08:21 ?578次閱讀
    TSMaster <b class='flag-5'>自定義</b> LIN 調(diào)度表編程指導(dǎo)