那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何實現自定義的應用層協議呢?

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

簡述

互聯網上充斥著各種各樣的網絡服務,在對外提供網絡服務時,服務端和客戶端需要遵循同一套數據通訊協議,才能正常的進行通訊;就好像你跟臺灣人溝通用閩南語,跟廣東人溝通就用粵語一樣。

實現自己的應用功能時,已知的知名協議(http,smtp,ftp等)在安全性、可擴展性等方面不能滿足需求,從而需要設計并實現自己的應用層協議。

2.協議分類

2.1按編碼方式

二進制協議比如網絡通信運輸層中的tcp協議。

明文的文本協議比如應用層的http、redis協議。

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

2.2按協議邊界

固定邊界協議能夠明確得知一個協議報文的長度,這樣的協議易于解析,比如tcp協議。

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

3.協議優劣的基本評判標準

高效的快速的打包解包減少對cpu的占用,高數據壓縮率降低對網絡帶寬的占用。

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

易于擴展的對可預知的變更,有足夠的彈性用于擴展。

容易兼容的

向前兼容,對于舊協議發出的報文,能使用新協議進行解析,只是新協議支持的新功能不能使用。

向后兼容,對于新協議發出的報文,能使用舊協議進行解析,只是新協議支持的新功能不能使用。

4.自定義應用層協議的優缺點

4.1優點

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

擴展性更好,可以根據業務需求和發展擴展自己的協議,而已知的知名協議不好擴展。

4.2缺點

設計難度高,協議需要易擴展,最好能向后向前兼容。

實現繁瑣,需要自己實現序列化和反序列化。

5.動手前的預備知識

5.1大小端

計算機系統在存儲數據時起始地址是高地址還是低地址。

大端從高地址開始存儲。

小端從低地址開始存儲。

圖解

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

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

wKgaomTcLTqAKOUXAABXM23J-Z4400.jpg

5.2網絡字節序

顧名思義就是數據在網絡傳送的字節流中的起始地址的高低,為了避免在網絡通信中引入其他復雜性,網絡字節序統一是大端的。

5.3本地字節序

本地操作系統的大小端,不同操作系統可能采用不同的字節序。

5.4內存對象與布局

任何變量,不管是堆變量還是棧變量都對應著操作系統中的一塊內存,由于內存對齊的要求程序中的變量并不是緊湊存儲的,例如一個c語言的結構體Test在內存中的布局可能如下圖所示。

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



wKgaomTcLViAaSV_AAAS6qumv3U393.jpg

5.5序列化與反序列化

將計算機語言中的內存對象轉換為網絡字節流,例如把c語言中的結構體Test轉化成uint8_t data[6]字節流。

將網絡字節流轉換為計算機語言中的內存對象,例如把uint8_t data[6]字節流轉化成c語言中的結構體Test。

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

6.一個例子

6.1 協議設計

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

協議頭8字節的定長協議頭。支持版本號,基于魔數的快速校驗,不同服務的復用。定長協議頭使協議易于解析且高效。

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

協議可視化圖

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

6.2 協議實現

talk is easy,just code it,使用c/c++語言來實現。

6.2.1c/c++語言實現

使用結構體MyProtoHead來存儲協議頭

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運行測試

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

8.總結

不到350行的代碼向我們展示了一個自定義的應用層協議該如何實現,當然這個協議是不夠完善的,還可以對其完善,比如對協議體進行加密加強協議的安全性等。





審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 存儲器
    +關注

    關注

    38

    文章

    7528

    瀏覽量

    164349
  • C語言
    +關注

    關注

    180

    文章

    7614

    瀏覽量

    137732
  • 計算機系統
    +關注

    關注

    0

    文章

    289

    瀏覽量

    24214
  • TCP通信
    +關注

    關注

    0

    文章

    146

    瀏覽量

    4292
  • HTTP接口
    +關注

    關注

    0

    文章

    21

    瀏覽量

    1841

原文標題:手把手教你實現自定義的應用層協議

文章出處:【微信號:嵌入式應用研究院,微信公眾號:嵌入式應用研究院】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    何進行串口通信自定義協議,真心求教

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

    NETTY自定義協議的TCP服務器

    一、想法及需求1.1最初設想1.2需求分析二、硬件2.1原理圖解釋2.2PCB繪制2.3焊接及成品三、軟件3.1NETTY自定義協議的TCP服務器3.1.1使用原因為什么要使用自定義協議
    發表于 12-21 08:30

    基于自定義協議的網絡地理信息系統

    探索基于自定義協議開發網絡地理信息系統的方法。自定義一套工作于TCP/IP應用層協議,基于該協議
    發表于 04-18 10:03 ?34次下載

    1602自定義字符

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

    如何在LabVIEW中實現自定義控件

    本文檔的主要內容詳細介紹的是如何在LabVIEW中實現自定義控件。
    發表于 01-14 17:17 ?48次下載
    如何在LabVIEW中<b class='flag-5'>實現</b><b class='flag-5'>自定義</b>控件

    單片機學習筆記————51單片機實現常用的自定義串口通訊協議

    單片機學習筆記————51單片機實現常用的自定義串口通訊協議
    發表于 11-23 17:06 ?37次下載
    單片機學習筆記————51單片機<b class='flag-5'>實現</b>常用的<b class='flag-5'>自定義</b>串口通訊<b class='flag-5'>協議</b>

    C#與STM32自定義通信協議

    C#與STM32自定義通信協議功能:1.可通過C#上位機對多臺STM32下位機進行控制2.自定義上位機與下位機通信協議
    發表于 12-24 18:59 ?37次下載
    C#與STM32<b class='flag-5'>自定義</b>通信<b class='flag-5'>協議</b>

    基于HAL庫的USB自定義HID設備實現

    基于HAL庫的USB自定義HID設備實現基于HAL庫的USB自定義HID設備實現準備工作CubeMX配置代碼實現基于HAL庫的USB
    發表于 12-28 20:04 ?13次下載
    基于HAL庫的USB<b class='flag-5'>自定義</b>HID設備<b class='flag-5'>實現</b>

    自定義視圖組件教程案例

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

    深入理解RPC自定義網絡協議

    只要涉及到網絡通信,必然涉及到網絡協議應用層也是一樣。在應用層最標準和常用的就是HTTP協議。但在很多性能要求較高的場景各大企業內部也會自定義
    的頭像 發表于 06-12 15:00 ?2624次閱讀

    ArkUI如何自定義彈窗(eTS)

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

    ESP32上的自定義UART協議開源

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

    自定義算子開發

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

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

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

    TSMaster 自定義 LIN 調度表編程指導

    LIN(LocalInterconnectNetwork)協議調度表是用于LIN總線通信中的消息調度的一種機制,我們收到越來越多來自不同用戶希望能夠通過接口實現自定義LIN調度表的需求。所以在
    的頭像 發表于 05-11 08:21 ?757次閱讀
    TSMaster <b class='flag-5'>自定義</b> LIN 調度表編程指導
    真钱轮盘| 博九娱乐网| 体育博彩网| 赌百家乐官网的心得体会| 百家乐官网斗地主炸金花| 真人百家乐输钱惨了| 大发888娱乐城shouye| 正宁县| 真人百家乐官网庄闲| 网上百家乐赌博犯法吗| 水浒传老虎机破解| 三门峡市| 新西兰百家乐官网的玩法技巧和规则 | 球讯网| 娱乐网百家乐官网补丁| 百家乐看图赢| 道真| 百家乐官网试玩| 全讯网vc8888.com| 玩百家乐官网高手支招篇| 百家乐如何破解| 大发888m摩卡游戏| 青鹏百家乐官网游戏币| 博之道百家乐的玩法技巧和规则| 六合彩下注| 百家乐官网规律打| 大发888真钱棋牌| 百家乐足球| 百家乐官网游戏策略| 百家乐电脑上怎么赌| 六合彩下注网| 百家乐视频多开器| 足球现金网| 发中发百家乐官网的玩法技巧和规则 | 单机百家乐官网棋牌| 百家乐15人专用桌布| 台州市| 百家乐注册送10彩金| 白菜娱乐城| 在线百家乐安卓| 百家乐官网视频表演|