首页 > 其他分享 >应用层通信协议设计

应用层通信协议设计

时间:2023-09-14 14:45:04浏览次数:41  
标签:报文 通信协议 校验 消息 长度 设计 数据包 应用层

一、应用层通信协议概述

TCP/UDP是基于字节流的传输层通信协议,对于其的编程是基于IO流编程,所谓“流”,就是没有界限的一长串二进制数据。TCP/UDP作为传输层协议,并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行数据包的划分。所以在业务上一个完整的数据包在进行传输时,可能会被拆分成多个包进行发送,也可能将很多小的数据包封装成一个大的数据包发送,也就是TCP/UDP的拆包和粘包问题。如果直接序列化发出数据包,接收方无法知道一个完整的报文从哪里开始,到哪里结束,这个问题需要通过上层的应用协议设计来解决。

二、业界主流协议调研

目前业界主流的协议的解决方案如下:

1.消息定长:报文长度固定,例如每个报文的长度固定为 200 字节,如果不够空位补空格,接受方每次拿 200 字节。

2.使用特殊分隔符分隔:例如每条报文结束都添加回车换行符作为报文分隔符,接收方读到回车换行符则分割出报文。

3.分为消息头和消息体:消息头包含消息的长度,接收方从消息头拿到消息长度,就知道剩下的报文是多少字节了。

4.更复杂的自定义应用层协议。

三、自定义应用层通信协议结构

综合以上内容,本项目工程中定义了一个应用层通信协议,结构如下:

 

 

如上图所示,发送的数据由消息头(header)和主体(body)组成,消息头包括:

  1. 报文类型:不同类型的报文在服务器中执行不同的指令和功能。
  2. 数据长度:数据长度由消息头长度加上数据主体内容的长度组成。

消息主体为定长的数据缓冲区(但传输的消息长度是不定的)。

为了实现上述的结构,定义了两个结构体,分别是消息头结构体和消息结构体,消息头结构体嵌套在消息结构体中,同时定义了一个枚举类型,用于定义通信所需的各种消息类型。

 

 

 

不同类型的消息的编码方式如下表所示:

 


可以看到,报文整体由$分隔的单个字符串组成,消息头的组成基本相同,以logIn为例,报文的第一位是消息类型LogIn,第二位是不包括消息头的消息长度,之后依次是用户名和密码。而在Getfrdlist中,除了消息头,好友人数之外,循环编码了由uid,uname,usex,role组成的字符串,各项之间用#分隔。

 

 

协议由服务端和客户端双方遵守,共用一套相同的编码和解码函数,编码即是按照前一页的协议具体内容拼接成字符串。解码需要读取消息头,先判断消息类型,用于区分不同消息以确定不同的解码方式,然后获取消息长度,用于对报文进行长度校验,以确保数据发送的安全性和完整性。

 

四、总结

在我看来,通信协议的设计主要需要满足三个点:

  1. 统一:协议由服务端和客户端双方遵守,共用一套相同的编码和解码函数。
  2. 区分:用消息头来区分不同的消息类型,用于判断是什么类型的消息,选择对应的解码。
  3. 安全:要对数据包的完整性进行校验,进行长度的校验是最基本的校验,常见的检验方式由checksum校验和、CRC校验等类型。

 

标签:报文,通信协议,校验,消息,长度,设计,数据包,应用层
From: https://www.cnblogs.com/bengbeng-bomb/p/17702423.html

相关文章

  • 设计模式回顾之一:单例模式(Java的4种实现)
    设计模式回顾系列文章:主要针对工作中常用常见的设计模式进行整理、总结,同时分享以供大家拍砖。------------------------------------------------作为一个程序员,我并不知道"茴"字有4种写法。但是,我知道单例有4种写法。单例模式目的:保证一个类仅有一个实例,并提供一个访问它的全局访......
  • 设计模式回顾之二:外观/门面模式(Facade)
    设计模式回顾系列文章:主要针对工作中常用常见的设计模式进行整理、总结,同时分享以供大家拍砖。------------------------------------------------外观/门面模式(Facade)希望简化原有系统的使用方式,需要定义自己的接口。Facade模式简化了对所需子系统的使用过程,但是由于Facade并不......
  • 设计模式回顾之十二:迭代器模式(Iterator)
    设计模式回顾系列文章:主要针对工作中常用常见的设计模式进行整理、总结,同时分享以供大家拍砖。------------------------------------------------迭代器模式(Iterator)提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。适用于:访问一个聚合对象的内容而......
  • 设计模式回顾之十:工厂方法模式(FactoryMethod)
    设计模式回顾系列文章:主要针对工作中常用常见的设计模式进行整理、总结,同时分享以供大家拍砖。------------------------------------------------工厂方法模式(FactoryMethod)定义一个用于创建对象的接口,让子类决定实例化哪一个类。FactoryMethod使一个类的实例化延迟到其子类。......
  • 设计模式回顾之九:建造者模式(Builder)
    设计模式回顾系列文章:主要针对工作中常用常见的设计模式进行整理、总结,同时分享以供大家拍砖。------------------------------------------------建造者模式(Builder)将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 适用于:当创建复杂对象的算法应该......
  • Cisco Nexus 9000v 虚拟机换机系统软件 NX-OS Release 10.4(1)F 发布 - 学习 Nexus 和
    CiscoNexus9000vSwitch,NX-OSRelease10.4(1)F请访问原文链接:https://sysin.org/blog/cisco-nexus-9000v/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgNX-OSSystemSoftwareReleaseDateCiscoNX-OSRelease10.4(1)F2023-08-18CiscoNX-OSRel......
  • 4.1 应用层Hook挂钩原理分析
    InlineHook是一种计算机安全编程技术,其原理是在计算机程序执行期间进行拦截、修改、增强现有函数功能。它使用钩子函数(也可以称为回调函数)来截获程序执行的各种事件,并在事件发生前或后进行自定义处理,从而控制或增强程序行为。Hook技术常被用于系统加速、功能增强、等领域。本章将......
  • JAVA-基本程序设计结构(类和对象)
    1.面向对象程序设计(OOP)1.概述1.类类(class)指定了如何构造对象。由一个类构造对象的过程称为创建这个类的一个实例。类是抽象的、概念的,代表一类事务,就是数据类型对象是具体的,实际的,代表一个具体事务,就是类的一个具体实例。类是对象的模板,对象是类的一个个体,对应一个实例......
  • 系统架构设计师 - 模拟题 - 案例题(二)
    试题二(25分)阅读以下关于软件系统建模的叙述,在答题纸上回答问题1至问题3。[说明]某软件公司计划开发一套教学管理系统,用于为高校提供教学管理服务。该教学管理系统基本的需求包括:(1)系统用户必须成功登录到系统后才能使用系统的各项功能服务。(2)管理员(Registrar)使用该系统管......
  • RDLC报表设计与打印相关备忘
    1、RDLC报表设计在最新VSTS集成环境(IDE),如VS2019及以上,不能打开Designer(设计器);VS2015可以(默认已安装)用图形化界面进行设计;2、“报表数据”页签显示:主菜单“视图”->“ReportData”3、设计界面显示标尺,以便直观看到报表的宽度(如下报表宽度27cm+,所以该表设计是横向A4纸张页面布局......