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

 

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

 

协议格式如下:

 

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.对于存在大量短报文应该怎么处理呀。比如报文内容是消息信息:如果鼠标位置信息。

 

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