浅谈通信协议设计

2024-09-02 02:04
文章标签 通信协议 浅谈 设计

本文主要是介绍浅谈通信协议设计,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1.设计原则

2.注意事项

2.1.大小端编码问题

2.2.字节对齐

2.3.显式指定整型字段的长度

2.4.涉及到浮点数要考虑精度问题,建议放大成整数或者使用字符串去传输

2.5.协议与自动升级功能


1.设计原则

设计通信协议时,需要考虑以下几个原则:

1) 简单性:协议设计应尽可能简单,简单的协议更易于实现和维护,减少出错的可能性。复杂的协议往往会导致理解和实现的困难,增加维护成本。

2) 可扩展性:

  • 预留扩展空间:在设计协议时,应考虑到未来的扩展需求,通过预留字段或功能接口,使得在不改变协议基本结构的前提下能够增加新的功能或修改现有功能。
  • 分层设计:将通信协议划分为多个层次,每个层次只负责特定的功能,有助于实现功能的独立性和可扩展性。

3) 互操作性:确保不同系统和硬件间的通信,协议应设计为能够在不同的系统和硬件之间进行通信,以实现广泛的互操作性。这有助于不同设备或系统之间的无缝集成。

4) 效率:减少通信开销,协议应尽可能减少通信过程中的带宽使用、处理时间和电力消耗。这可以通过优化协议格式、减少冗余数据等方式实现。

5) 可靠性:提供错误检测和恢复机制,协议应具备错误检测和恢复机制,以确保数据的正确传输。这包括校验码、重传机制等,以应对通信过程中的错误和丢包问题。

6) 安全性:提供适当的安全机制,协议应提供加密、身份验证等安全机制,以防止未经授权的访问和数据篡改。这有助于保护通信过程中的数据安全性和隐私性。

7) 兼容性考虑:  向后兼容性,在设计新版本的协议时,应考虑到与旧版本的兼容性,以确保旧设备或系统能够继续与新设备进行通信。

2.注意事项

2.1.大小端编码问题

        不同的平台存在大小端的问题(即主机字节序和网络字节序),在设计协议格式时,如果协议中存在整型字段,建议使用同一个字节序。通常的做法是在进行网络传输时将所有的整型转换为网络字节序(大端编码,Big Endian),避免不同的机器因为大小端问题解析得到不同的整型值。

        当然,不一定非要转换为网络字节序,如果明确的知道通信的双方使用的是相同的字节序,则也可以不转换。

2.2.字节对齐

以C++为例,通信协议一般用结构体struct来表达,如:

#pragma pack(push, 1)//传输的整个报文
typedef  struct  _stShortWavePacket
{quint32        version; //版本号quint16        frameIndex;quint16        srcObjMark; //源对象标识quint16        srcObjNO; //源对象编号quint16        destObjMark; //目的对象标识quint16        destObjNO; //目的对象编号quint8         isMustResponse; //是否需要应答quint8		   responseStatus; //0:返回成功;非0:失败qint8          content[1024]; //协议内容
}stShortWavePacket;#pragma pack()

        有一组成对的 #pragma XX 指令,其中 #pragma pack(push, n),是告诉编译器接下来的所有结构体(这里就是 userinfo 协议)的每一个字段按 n 个字节对齐,这里 n = 1,按一个字节对齐,即去除任何 padding 字节。这样做的目的是为了内存更加紧凑,节省存储空间。

        我们不再需要这个对齐功能后,应该使用 #pragma pack(pop) 让编译器恢复之前的对齐方式。

注意:#pragma pack(push, n) 与 #pragma pack(pop) 一定要成对使用,如果你漏掉其中任何一个,编译出来的代码可能会出现很多奇怪的运行结果。

2.3.显式指定整型字段的长度

        对于一个 int 型字段,在作为协议传输时,我们应该显式地指定该类型的长度,也就是说,你应该使用 int32_t、int64_t 这样的类型来代替 int、long。之所以这么做,是因为在不同字长的机器上,对于默认的 int 和 long 的长度可能不一样,例如 long 型,在 32 位操作系统上其长度是 4 个字节,而在 64 位机器上其长度是 8 个字节。如果不显式指定这种整形的长度,可能因为不同机器字长不同,导致协议解析出错或者产生错误的结果。

2.4.涉及到浮点数要考虑精度问题,建议放大成整数或者使用字符串去传输

        由于计算机表示浮点数存在精度取舍不准确的问题,例如对于 1.000000,有的计算机可能会得到 0.999999,在某些应用中,如果这个浮点数的业务单位比较大(如表示金额,单位为亿),就会造成很大的影响。因此为了避免不同的机器解析得到不同的结果,建议在网络传输时将浮点数值放大相应的倍数变成整数或者转换为字符串来进行传输。

2.5.协议与自动升级功能

        对于一个商业的产品,发布出去的客户端一般通过客户端的自动升级功能去获得更新(IOS App 除外,苹果公司要求所有的 App 必须在其 App Store 上更新新版本,禁止热更新)。在客户端与服务器通信的所有协议格式中,自动升级协议是最重要的一个,无论版本如何迭代,一定要保证自动升级协议的新旧兼容,这样做有如下原因:

  • 如果新的服务器不能兼容旧客户端中的自动升级协议,那么旧的客户端用户将无法升级成新的版本了,这样的产品相当于把自己给“阉割”了。对于不少产品,不通过自动升级而让众多用户去官网下载新的版本是一件很难做到的事情,这种决策可能会导致大量用户流失;

  • 退一步讲,对于一些测试不完善,或者处于快速迭代中的产品,只要保证自动升级功能正常,旧版本任何 bug 和瑕疵都可以通过升级新版本解决。这对于一些想投放市场试水,但又可能设计不充分的产品尤其重要。

顺便提一下,一般自动升级功能是根据当前版本的版本号与服务器端新版本的版本号进行比较,如果二者之间存在一个大版本号的差别(如1.0.0 与 2.0.0),即有重大功能更新,则应该强制客户端更新下载最新版本;如果只是一个小版本号的更新(如 1.0.0 与 1.1.0),则可以让用户选择是否更新。当然,如果是新版本修正了前一个版本中严重影响使用的 bug,也应当强制用户更新。

这篇关于浅谈通信协议设计的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1128690

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

浅谈主机加固,六种有效的主机加固方法

在数字化时代,数据的价值不言而喻,但随之而来的安全威胁也日益严峻。从勒索病毒到内部泄露,企业的数据安全面临着前所未有的挑战。为了应对这些挑战,一种全新的主机加固解决方案应运而生。 MCK主机加固解决方案,采用先进的安全容器中间件技术,构建起一套内核级的纵深立体防护体系。这一体系突破了传统安全防护的局限,即使在管理员权限被恶意利用的情况下,也能确保服务器的安全稳定运行。 普适主机加固措施:

怎么让1台电脑共享给7人同时流畅设计

在当今的创意设计与数字内容生产领域,图形工作站以其强大的计算能力、专业的图形处理能力和稳定的系统性能,成为了众多设计师、动画师、视频编辑师等创意工作者的必备工具。 设计团队面临资源有限,比如只有一台高性能电脑时,如何高效地让七人同时流畅地进行设计工作,便成为了一个亟待解决的问题。 一、硬件升级与配置 1.高性能处理器(CPU):选择多核、高线程的处理器,例如Intel的至强系列或AMD的Ry

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

SprinBoot+Vue网络商城海鲜市场的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质创作者,全网30w+

单片机毕业设计基于单片机的智能门禁系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍程序代码部分参考 设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订

Spring的设计⽬标——《Spring技术内幕》

读《Spring技术内幕》第二版,计文柯著。 如果我们要简要地描述Spring的设计⽬标,可以这么说,Spring为开发者提供的是⼀个⼀站式的轻量级应⽤开发框架(平台)。 作为平台,Spring抽象了我们在 许多应⽤开发中遇到的共性问题;同时,作为⼀个轻量级的应⽤开发框架,Spring和传统的J2EE开发相⽐,有其⾃⾝的特点。 通过这些⾃⾝的特点,Spring充分体现了它的设计理念:在

开题报告中的研究方法设计:AI能帮你做什么?

AIPaperGPT,论文写作神器~ https://www.aipapergpt.com/ 大家都准备开题报告了吗?研究方法部分是不是已经让你头疼到抓狂? 别急,这可是大多数人都会遇到的难题!尤其是研究方法设计这一块,选定性还是定量,怎么搞才能符合老师的要求? 每次到这儿,头脑一片空白。 好消息是,现在AI工具火得一塌糊涂,比如ChatGPT,居然能帮你在研究方法这块儿上出点主意。是不

创业者该如何设计公司的股权架构

本文来自七八点联合IT橘子和车库咖啡的一系列关于设计公司股权结构的讲座。 主讲人何德文: 在公司发展的不同阶段,创业者都会面临公司股权架构设计问题: 1.合伙人合伙创业第一天,就会面临股权架构设计问题(合伙人股权设计); 2.公司早期要引入天使资金,会面临股权架构设计问题(天使融资); 3.公司有三五十号人,要激励中层管理与重要技术人员和公司长期走下去,会面临股权架构设计问题(员工股权激

浅谈PHP5中垃圾回收算法(Garbage Collection)的演化

前言 PHP是一门托管型语言,在PHP编程中程序员不需要手工处理内存资源的分配与释放(使用C编写PHP或Zend扩展除外),这就意味着PHP本身实现了垃圾回收机制(Garbage Collection)。现在如果去PHP官方网站(php.net)可以看到,目前PHP5的两个分支版本PHP5.2和PHP5.3是分别更新的,这是因为许多项目仍然使用5.2版本的PHP,而5.3版本对5.2并不是完