在简单网络通信中,通信协议的设计应坚持以下原则:向下兼容、安全、纠错能力、精简、可扩充。
以下是我初步设计的一个通信协议,请大家过目,指正。以方便我完善之。谢谢!!!!
协议格式如下:
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.对于存在大量短报文应该怎么处理呀。比如报文内容是消息信息:如果鼠标位置信息。
以上的分析肯定存在不足,还请大家多多帮助,尽可能的完善他。