博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自定义通信协议
阅读量:5053 次
发布时间:2019-06-12

本文共 1295 字,大约阅读时间需要 4 分钟。

在简单网络通信中,通信协议的设计应坚持以下原则:向下兼容、安全、纠错能力、精简、可扩充。

 

以下是我初步设计的一个通信协议,请大家过目,指正。以方便我完善之。谢谢!!!!

 

协议格式如下:

 

4bit 4bit 8bit    
主版本 副版本 子版本 模块 命令
标志位(32bit)
序号(16bit) 预定序号(16bit)
扩展位(32bit)
报头长度 数据长度 CRC校验位(16bit)
数据字段......
               

 

 字段说明:

1.主版本/副版本/子版本:标识此数据包所使用通信协议版本信息,用于通信双方统一语言或选择不同的解析代码。

2.模块:可以设置成应用所涉及到的功能模块或信息类型,如:远程桌面、数字白板、服务器控制信息等,再比如:文字、视频、音频、文件等。

3.命令:其实就是通信约定。一般由#define COMM_SEARCH_LINK 0xFF,这样的实现,用于标识通信协议的主体内容

4.标志位:用于以位的形式标识协议内容的解析方式。可由用户自行设计。

5.序号:用于标识,本数据包在整体通信过程中所传递的数据包的序号;

6.预定序号:由通信的另一端给出,说明另一端将要接收的的序号,序号必须与预定序号相同,同时要与另一端保存的预定序号相同,这样做是为了尽可能的保证不被中间人截获,攻击通信双方。

7.扩展位:用于扩展控制信息,在前面1到6项不能完全描述或不方便描述的情况下使用。

8.报头长度/数据长度:就不用说了吧。报头长度是固定的,20Byte。数据长度在每次填充数据时计算。

9.CRC校验位:主要是报文的校验,防止传输错误。

10.数据字段:就不介绍了,是主要的传输内容。

 

说明:

1.协议最大长度为:一个页面分配单元的长度、磁盘扇区大小或报文最大不分割长度。在这里我比较了一下,4K是最合适的设置,不知道对不对。

优点:减少磁盘读写次数;防止出现内存碎片。

2.协议报头长度为20字节,则数据字段最大长度为:协议最大长度-协议报头长度(20)-数据校验位(2)。

3.加密与解密方式:由发起方向服务器注册公匙,在发起通信时,并保持到通信结束。

4.压缩与解压缩:采用无损压缩方式。对整体进行压缩。

 

这里有几个地方我正在犹豫,

1.对于加解密操作,是所有数据均加密还是区别对待,像视频,图像,音频等。

2.压缩操作是否要整体,还是只压缩数据字段就够了。

3.以上两个操作对性能的影响是不是很大,可不可以忽略。

4.在通信过程中,协议报文的总体长度很难达到协议最大长度,这个主要是涉及到包的重组与分包传输问题,UDP协议的理论长度是65535,但在不同的网络环境中对IP数据包的最大长度要求又是不一样的。所以在传输过程中,数据包会被系统及所经过的网络设备分包或重组,我所说的就是这个问题。

5.对于存在大量短报文应该怎么处理呀。比如报文内容是消息信息:如果鼠标位置信息。

 

以上的分析肯定存在不足,还请大家多多帮助,尽可能的完善他。

转载于:https://www.cnblogs.com/yangyuan33/p/7428133.html

你可能感兴趣的文章
OA项目设计的能力③
查看>>
Cocos2d-x3.0 文件处理
查看>>
全面整理的C++面试题
查看>>
Activity和Fragment生命周期对比
查看>>
查找 EXC_BAD_ACCESS 问题根源的方法
查看>>
日常报错
查看>>
list-style-type -- 定义列表样式
查看>>
Ubuntu 编译出现 ISO C++ 2011 不支持的解决办法
查看>>
Linux 常用命令——cat, tac, nl, more, less, head, tail, od
查看>>
VueJS ElementUI el-table 的 formatter 和 scope template 不能同时存在
查看>>
Halcon一日一练:图像拼接技术
查看>>
iOS设计模式 - 中介者
查看>>
centos jdk 下载
查看>>
HDU 1028 Ignatius and the Princess III(母函数)
查看>>
(转)面向对象最核心的机制——动态绑定(多态)
查看>>
token简单的使用流程。
查看>>
django创建项目流程
查看>>
Vue 框架-01- 入门篇 图文教程
查看>>
多变量微积分笔记24——空间线积分
查看>>
poi操作oracle数据库导出excel文件
查看>>