簡述
互聯(lián)網(wǎng)上充斥著各種各樣的網(wǎng)絡服務,在對外提供網(wǎng)絡服務時,服務端和客戶端需要遵循同一套數(shù)據(jù)通訊協(xié)議,才能正常的進行通訊;就好像你跟臺灣人溝通用閩南語,跟廣東人溝通就用粵語一樣。
實現(xiàn)自己的應用功能時,已知的知名協(xié)議(http,smtp,ftp等)在安全性、可擴展性等方面不能滿足需求,從而需要設計并實現(xiàn)自己的應用層協(xié)議。
2.協(xié)議分類
2.1按編碼方式
二進制協(xié)議比如網(wǎng)絡通信運輸層中的tcp協(xié)議。
明文的文本協(xié)議比如應用層的http、redis協(xié)議。
混合協(xié)議(二進制+明文)比如蘋果公司早期的APNs推送協(xié)議。
2.2按協(xié)議邊界
固定邊界協(xié)議能夠明確得知一個協(xié)議報文的長度,這樣的協(xié)議易于解析,比如tcp協(xié)議。
模糊邊界協(xié)議無法明確得知一個協(xié)議報文的長度,這樣的協(xié)議解析較為復雜,通常需要通過某些特定的字節(jié)來界定報文是否結束,比如http協(xié)議。
3.協(xié)議優(yōu)劣的基本評判標準
高效的快速的打包解包減少對cpu的占用,高數(shù)據(jù)壓縮率降低對網(wǎng)絡帶寬的占用。
簡單的易于人的理解、程序的解析。
易于擴展的對可預知的變更,有足夠的彈性用于擴展。
容易兼容的
向前兼容,對于舊協(xié)議發(fā)出的報文,能使用新協(xié)議進行解析,只是新協(xié)議支持的新功能不能使用。
向后兼容,對于新協(xié)議發(fā)出的報文,能使用舊協(xié)議進行解析,只是新協(xié)議支持的新功能不能使用。
4.自定義應用層協(xié)議的優(yōu)缺點
4.1優(yōu)點
非知名協(xié)議,數(shù)據(jù)通信更安全,黑客如果要分析協(xié)議的漏洞就必須先破譯你的通訊協(xié)議。
擴展性更好,可以根據(jù)業(yè)務需求和發(fā)展擴展自己的協(xié)議,而已知的知名協(xié)議不好擴展。
4.2缺點
設計難度高,協(xié)議需要易擴展,最好能向后向前兼容。
實現(xiàn)繁瑣,需要自己實現(xiàn)序列化和反序列化。
5.動手前的預備知識
5.1大小端
計算機系統(tǒng)在存儲數(shù)據(jù)時起始地址是高地址還是低地址。
大端從高地址開始存儲。
小端從低地址開始存儲。
圖解
判斷這里以c/c++語言代碼為例,使用了c語言中聯(lián)合體的特性。
5.2網(wǎng)絡字節(jié)序
顧名思義就是數(shù)據(jù)在網(wǎng)絡傳送的字節(jié)流中的起始地址的高低,為了避免在網(wǎng)絡通信中引入其他復雜性,網(wǎng)絡字節(jié)序統(tǒng)一是大端的。
5.3本地字節(jié)序
本地操作系統(tǒng)的大小端,不同操作系統(tǒng)可能采用不同的字節(jié)序。
5.4內(nèi)存對象與布局
任何變量,不管是堆變量還是棧變量都對應著操作系統(tǒng)中的一塊內(nèi)存,由于內(nèi)存對齊的要求程序中的變量并不是緊湊存儲的,例如一個c語言的結構體Test在內(nèi)存中的布局可能如下圖所示。
5.5序列化與反序列化
將計算機語言中的內(nèi)存對象轉(zhuǎn)換為網(wǎng)絡字節(jié)流,例如把c語言中的結構體Test轉(zhuǎn)化成uint8_t data[6]字節(jié)流。
將網(wǎng)絡字節(jié)流轉(zhuǎn)換為計算機語言中的內(nèi)存對象,例如把uint8_t data[6]字節(jié)流轉(zhuǎn)化成c語言中的結構體Test。
6.一個例子
6.1 協(xié)議設計
本協(xié)議采用固定邊界+混合編碼策略。
協(xié)議頭8字節(jié)的定長協(xié)議頭。支持版本號,基于魔數(shù)的快速校驗,不同服務的復用。定長協(xié)議頭使協(xié)議易于解析且高效。
協(xié)議體變長json作為協(xié)議體。json使用明文文本編碼,可讀性強、易于擴展、前后兼容、通用的編解碼算法。json協(xié)議體為協(xié)議提供了良好的擴展性和兼容性。
協(xié)議可視化圖
6.2 協(xié)議實現(xiàn)
talk is easy,just code it,使用c/c++語言來實現(xiàn)。
6.2.1c/c++語言實現(xiàn)
使用結構體MyProtoHead來存儲協(xié)議頭
6.2.2打包(序列化)
6.2.3解包(反序列化)
7.完整源碼與測試
code is easy,just run it.
7.1源碼
7.2運行測試
8.總結
不到350行的代碼向我們展示了一個自定義的應用層協(xié)議該如何實現(xiàn),當然這個協(xié)議是不夠完善的,還可以對其完善,比如對協(xié)議體進行加密加強協(xié)議的安全性等。
審核編輯:劉清
-
存儲器
+關注
關注
38文章
7653瀏覽量
167414 -
C語言
+關注
關注
180文章
7632瀏覽量
141773 -
計算機系統(tǒng)
+關注
關注
0文章
290瀏覽量
24654 -
TCP通信
+關注
關注
0文章
146瀏覽量
4556 -
HTTP接口
+關注
關注
0文章
21瀏覽量
1973
原文標題:手把手教你實現(xiàn)自定義的應用層協(xié)議
文章出處:【微信號:嵌入式應用研究院,微信公眾號:嵌入式應用研究院】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
HarmonyOS應用自定義鍵盤解決方案
何進行串口通信自定義協(xié)議,真心求教
基于自定義協(xié)議的網(wǎng)絡地理信息系統(tǒng)
單片機學習筆記————51單片機實現(xiàn)常用的自定義串口通訊協(xié)議

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

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

自定義視圖組件教程案例
深入理解RPC自定義網(wǎng)絡協(xié)議
ESP32上的自定義UART協(xié)議開源

自定義算子開發(fā)

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

評論