热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

网络通信协议设计

网络通信--协议设计1介绍1.1定义1.2帧、数据报、数据包的区别和联系1.3总结2TLV2.1TLV介绍2.2TLV优缺点2.3定长不定长2.4CRC校验2.4.1介绍2.4.2


网络通信--协议设计

  • 1 介绍
    • 1.1 定义
    • 1.2 帧、数据报、数据包的区别和联系
    • 1.3 总结
  • 2 TLV
    • 2.1 TLV介绍
    • 2.2 TLV优缺点
    • 2.3 定长不定长
    • 2.4 CRC校验
      • 2.4.1 介绍
      • 2.4.2 CRC在线计算
      • 2.4.3 MODBUS协议
    • 2.5 解析步骤
  • 3 上下位机常用自定义协议
    • 3.1 head+value+tail(定长)
    • 3.2 head+length+value+crc(不定长)
    • 3.3 head+length+value+crc+tail(不定长)
  • 4 socket常用自定义协议
    • 4.1 head+value+tail(不定长)
    • 4.2 head+value+tail(定长)
    • 4.3 head+length+value+tail(不定长)
    • 4.4 head(即长度)+value
  • 参考


1 介绍


1.1 定义


  • 通信协议:两个节点间信息交换的规则语法。
    类比的话,国人间语言交流,普通话就是通信协议。
  • 常见的有tcp,udp,http,sip等常见协议。
  • 其中 7层 OSI 模型中应用层,开发者可以根据应用业务逻辑自定义协议
  • 自定义协议时需要考虑确定报文长度的方式
    (1)基于定界符(Delimiter-based):消息的结束由一个唯一的标记(unique marker)指出,即发送者在传输完数据后显式添加的一个特殊字节序列。这个特殊标记不能在传输的数据中出现。比如 EOF
    (2)显式长度(Explicit length):在变长字段或消息前附加一个固定大小的字段,用来指示该字段或消息中包含了多少字节。比如 TLV

1.2 帧、数据报、数据包的区别和联系


  • 数据帧(Frame):就是数据链路层的协议数据单元,它包括三部分:帧头,数据部分,帧尾。其中,帧头和帧尾包含一些必要的控制信息,比如同步信息、地址信息、差错控制信息等;数据部分则包含网络层传下来的数据,比如ip数据包。
  • 数据包(Packet):TCP/IP协议通信传输中的数据单位,处于网络层,在局域网中,“包”是包含在“帧”里的。
  • 数据报(Datagram):多用于网络层以上,面向无连接的数据传输,工作过程类似于报文交换。采用数据报方式传输时,被传输的分组称为数据报。
  • 一般说来,数据链路层发出的数据包称为frame,地址是链路层的地址,如mac地址;网络层发出的数据包称为packet,地址是网络层地址,如ip地址;传输层发出的数据包称为segment/datagram,地址是传输层地址,如TCP的端口号。
  • 二层的PDU叫做Frame;
    IP的叫做Packet;
    TCP的叫做Segment;
    UDP的叫做Datagram。
    在这里插入图片描述

1.3 总结

应用层的数据解析,目前博主涉及工业领域的上下位机串口通信和客户端服务端socket通信,都是数据量不大的场景。在串口传输不稳定时,需要加上CRC进行校验。在socket通信中,目前通信丢包的可能性很小,再者CRC有效检验的数据长度有限,故一般情况下socket通信不用加CRC校验。


2 TLV


2.1 TLV介绍


  • TLV: TLV是指由数据的类型Tag,数据的长度Length,数据的值Value组成的结构体,几乎可以描任意数据类型,TLV的Value也可以是一个TLV结构,正因为这种嵌套的特性,可以让我们用来包装协议的实现。
    在这里插入图片描述

2.2 TLV优缺点


  • 优点:可扩展性、简单易学、 跨语言特性
  • 缺点:因为其增加了2个额外的冗余信息,tag 和len,特别是如果协议大部分是基本数据类型int ,short, byte. 会浪费几倍存储空间。另外Value具体是什么含义,需要通信双方事先得到描述文档,即TLV不具备结构化和自解释特性。
  • 跨语言特性
    java或PHP的语言,没有无符号类型,与C/C++语言不同,会导致负数解析失败。对使用类型做了强制性约束。虽然带来了约束,但是带来通用型和简洁性,和跨语言性,于是有了一个类型(type)规范

2.3 定长不定长


  • 描述Value部分所占字节的个数,编码格式分两类:定长方式(DefiniteForm)和不定长方式(IndefiniteForm),其中定长方式又包括短形式与长形式。
  • 短形式:
    在这里插入图片描述
    字节第7位为0,表示Length使用1个字节即可满足Value类型长度的描述,范围在0~127之间的。
  • 长形式:
    在这里插入图片描述
    即Value类型的长度大于127时,Length需要多个字节来描述,这时第一个字节的第7位置为1,0~6位用来描述Length值占用的字节数,然后直将Length值转为byte后附在其后,如: Value大小占234个字节(11101010),由于大于127,这时Length需要使用两个字节来描述,10000001 11101010

2.4 CRC校验


2.4.1 介绍

CRC(循环冗余校验)校验确保没有字节跳变发生


2.4.2 CRC在线计算

(1)http://www.ip33.com/crc.html
(2)https://www.lammertbies.nl/comm/info/crc-calculation.html


2.4.3 MODBUS协议


  • Modbus是OS模型第7层上的应用层报文传输协议,它在连接至不同类型总线或网络的设备之间提供客户端/服务器通信,互联网组织保留系统端口502访问Modbus,Modbus是一个请求/应答协议。
  • 上位机须按照MODBUS协议的命令格式发送数据(包括计算的CRC值),从机才能正确辨识数据。若无CRC值,从机将返回含有错误号的应答包,不会得到正确结果。标准的做法,发送前计算CRC值并一起发送,接收后也计算CRC值并与接收的校验码对比是否相等,以辨别数据是否准确。
  • 参数模型:CRC 16/modbus
  • 校验位计算

/*
* 函数名 :CRC16
* 描述 : 计算CRC16
* 输入 : ptr---数据,len---长度
* 输出 : 校验值
*/

UINT16 CRC16(UINT8 *ptr, UINT16 len)
{unsigned char i;unsigned short crc &#61; 0xFFFF;if (len &#61;&#61; 0) {len &#61; 1;}while (len--) {crc ^&#61; *ptr;for (i &#61; 0; i<8; i&#43;&#43;){if (crc & 1) {crc >>&#61; 1;crc ^&#61; 0xA001;} else {crc >>&#61; 1;}}ptr&#43;&#43;;}return(crc);
}

unsigned short UmUtil::Crc16(const unsigned char* buf, int count)
{uint16_t crc &#61; 0xffff;while(count > 0){crc &#61; (crc >> 8) ^ CRC16_Table[(crc & 0xff) ^ *(buf&#43;&#43;)];count--;}return crc;
}

  • 设计定长通信指令&#xff08;带帧起止符&#xff09;
  • MODBUS ASCII和RTU两种模式的区别、优缺点
  • Modbus 通讯协议 &#xff08;RTU传输模式&#xff09;
  • MODBUS通讯协议及编程【一】
  • MODBUS TCP和MODBUS RTU的差别

2.5 解析步骤

tlv报文的格式&#xff1a; [帧头] [Tag] [Length] [Value] [CRC校验和] &#xff08;这里我用的CRC校验和是16位的所以占两个字节&#xff09;


3 上下位机常用自定义协议

上下位机&#xff0c;可用串口进行通信。


3.1 head&#43;value&#43;tail&#xff08;定长&#xff09;


3.2 head&#43;length&#43;value&#43;crc&#xff08;不定长&#xff09;


3.3 head&#43;length&#43;value&#43;crc&#43;tail&#xff08;不定长&#xff09;


4 socket常用自定义协议


4.1 head&#43;value&#43;tail&#xff08;不定长&#xff09;


4.2 head&#43;value&#43;tail&#xff08;定长&#xff09;


4.3 head&#43;length&#43;value&#43;tail&#xff08;不定长&#xff09;


4.4 head&#xff08;即长度&#xff09;&#43;value


参考

1、通信协议之序列化
2、看懂通信协议&#xff1a;自定义通信协议设计之TLV编码应用
3、应用层通信协议开发浅析
4、浅谈自定义通讯协议——TLV
5、swoole学习笔记&#xff08;五&#xff09;网络通信协议设计 – EOF结束符协议和固定包头&#43;包体协议
6、浅谈基于TCP和UDP的协议设计
7、TLV协议——实现封包与解析
8、TLV-简单的数据传输协议
9、【通信协议】帧、数据报、数据包的区别和联系
10、报文、帧、数据包等的区别
11、TLV简介以及c语言实现装包与解析–好
12、通信&#xff1a;成帧与解析
13、浅谈基于TCP和UDP的协议设计
14、关于modbus rtu协议的CRC&#xff08;循环冗余校验&#xff09;在线计算
15、Modbus通信CRC16校验程序
16、设计定长通信指令&#xff08;带帧起止符&#xff09;
17、MODBUS ASCII和RTU两种模式的区别、优缺点
18、Modbus 通讯协议 &#xff08;RTU传输模式&#xff09;
19、MODBUS通讯协议及编程【一】
20、MODBUS TCP和MODBUS RTU的差别
21、Modbus通讯协议&#xff08;一&#xff09;——概述
22、Modbus通讯协议&#xff08;二&#xff09;——RTU
23、Modbus通讯协议&#xff08;三&#xff09;——ASCII
24、数据传输通信协议总结
25、自定义数据传输协议
26、自定义通信协议—基于串口的C实现&#xff08;接收篇&#xff09;


推荐阅读
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 提升Python编程效率的十点建议
    本文介绍了提升Python编程效率的十点建议,包括不使用分号、选择合适的代码编辑器、遵循Python代码规范等。这些建议可以帮助开发者节省时间,提高编程效率。同时,还提供了相关参考链接供读者深入学习。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
author-avatar
拍友2502916683
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有