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

    文章

    7423

    浏览量

    163490
  • C语言
    +关注

    关注

    180

    文章

    7591

    浏览量

    135770
  • 计算机系统
    +关注

    关注

    0

    文章

    276

    浏览量

    24068
  • TCP通信
    +关注

    关注

    0

    文章

    146

    浏览量

    4200
  • HTTP接口
    +关注

    关注

    0

    文章

    21

    浏览量

    1766

原文标题:手把手教你实现自定义的应用层协议

文章出处:【微信号:嵌入式应用研究院,微信公众号:嵌入式应用研究院】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    何进行串口通信自定义协议,真心求教

    现在需要通过串口通信向向显示屏传 温度、适度还有心跳,以便在显示屏显示出来,协议自定义。求教,怎么自定义协议。求高手指点。谢谢~只是
    发表于 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 2493次阅读

    ArkUI如何自定义弹窗(eTS)

    自定义弹窗其实也是比较简单的,通过CustomDialogController类就可以显示自定义弹窗。
    的头像 发表于 08-31 08:24 2087次阅读

    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 2698次阅读
    <b class='flag-5'>自定义</b>算子开发

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

    labview超快自定义控件制作和普通自定义控件制作
    发表于 08-21 10:32 12次下载

    TSMaster 自定义 LIN 调度表编程指导

    LIN(LocalInterconnectNetwork)协议调度表是用于LIN总线通信中的消息调度的一种机制,我们收到越来越多来自不同用户希望能够通过接口实现自定义LIN调度表的需求。所以在
    的头像 发表于 05-11 08:21 556次阅读
    TSMaster <b class='flag-5'>自定义</b> LIN 调度表编程指导