文本协议与二进制协议的选择
2016-02-25 00:00
204 查看
进行网络通信时,我们经常纠结于到底使用什么样的协议传输数据,下面我谈谈应该怎么选择一种合理的协议格式。
为计算机网络中进行数据交换而建立的规则、标准或约定的集合。
网络协议至少包括三要素:
语法:语法是用户数据与控制信息的结构与格式,以及数据出现的顺序。
语义:解释控制信息每个部分的意义。它规定了需要发出何种控制信息,以及完成的动作与做出什么样的响应。
时序:时序是对事件发生顺序的详细说明。
人们形象地把这三个要素描述为:语义表示要做什么,语法表示要怎么做,时序表示做的顺序。
通俗地说,协议就是通信双方能够理解的一种数据格式。
在进行网络开发中,文本协议和二进制协议是我们最常用的两种。往往要根据这两种协议的特点进行选择,那么我们先来看下这两种协议分别具有什么特点。
文本协议设计的目的就是方便人们理解,读懂。所以,协议中通常会加入一些特殊字符用于分隔,比如如下数据:
!set chl 003#
其中,以!标识命令的开始,#标识命令结束,空格用来分隔命令字段,虽然我们不知道这条命令具体干什么,但通过字面我们大致知道可能是设置(set)某一个参数(chl)值为003,这样在我们进行调试的时候,可以快速准确地看到当时发生了什么,更好地解决问题。
但为了便于解析,文本协议不得不添加一些冗余的字符用于分隔命令,降低了其传输的效率;而且只适于传输文本,很难嵌入其他数据,比如一张图片。
其中,Guide用于标识协议起始,Length是消息体Data的长度,为了数据完整性,还会加上相应的校验 (DataCRC,HeaderCRC);Data中又分为命令字(CMD),和命令内容。命令字是双方协议文档中规定好的,比如0x01代表登 录,0x02代表登出等,一般数据字段的长度也是固定的。又因为长度的固定,所以少了冗余数据,传输效率较高。
文本协议,直观、描述性强,容易理解,便于调试,缺点就是冗余数据较多,不适宜传输二进制文件(比如:图片等),解析复杂(需要进行字符串比较);
二进制协议,没有冗余字段,传输高效,方便解析(固定长度,并且可以直接比较字节),缺点就是定义的比较死,哪个位置有哪些东西,是什么意义是定义死的,场景单一。
所以,
1. 如果想要高效传输,比如物联网中收集传感器数据,使用二进制协议
2. 如果想要便于调试,比如使用telnet就能当客户端用,可使用文本协议
3. 如果命令较少,比如即时通讯软件,可以使用文本协议
4. 二进制数据的难理解性,自然加密,对数据安全有一定要求的可以使用二进制协议
等等。
总的来说,这是一个平衡的过程,要看具体项目的需要。
网络协议
标准定义是这样的:为计算机网络中进行数据交换而建立的规则、标准或约定的集合。
网络协议至少包括三要素:
语法:语法是用户数据与控制信息的结构与格式,以及数据出现的顺序。
语义:解释控制信息每个部分的意义。它规定了需要发出何种控制信息,以及完成的动作与做出什么样的响应。
时序:时序是对事件发生顺序的详细说明。
人们形象地把这三个要素描述为:语义表示要做什么,语法表示要怎么做,时序表示做的顺序。
通俗地说,协议就是通信双方能够理解的一种数据格式。
在进行网络开发中,文本协议和二进制协议是我们最常用的两种。往往要根据这两种协议的特点进行选择,那么我们先来看下这两种协议分别具有什么特点。
文本协议
文本协议一般是由一串ACSII字符组成的数据,这些字符包括数字,大小写字母、百分号,还有回车(\r),换行(\n)以及空格等等。文本协议设计的目的就是方便人们理解,读懂。所以,协议中通常会加入一些特殊字符用于分隔,比如如下数据:
!set chl 003#
其中,以!标识命令的开始,#标识命令结束,空格用来分隔命令字段,虽然我们不知道这条命令具体干什么,但通过字面我们大致知道可能是设置(set)某一个参数(chl)值为003,这样在我们进行调试的时候,可以快速准确地看到当时发生了什么,更好地解决问题。
但为了便于解析,文本协议不得不添加一些冗余的字符用于分隔命令,降低了其传输的效率;而且只适于传输文本,很难嵌入其他数据,比如一张图片。
二进制协议
二进制协议就是一串字节流,通常包括消息头(header)和消息体(body),消息头的长度固定,并且消息头包括了消息体的长度。这样就能够从数据流中解析出一个完整的二机制数据。如下是一个典型的二进制协议:其中,Guide用于标识协议起始,Length是消息体Data的长度,为了数据完整性,还会加上相应的校验 (DataCRC,HeaderCRC);Data中又分为命令字(CMD),和命令内容。命令字是双方协议文档中规定好的,比如0x01代表登 录,0x02代表登出等,一般数据字段的长度也是固定的。又因为长度的固定,所以少了冗余数据,传输效率较高。
总结
综上,我们大致总结文本协议和二进制协议的优缺点:文本协议,直观、描述性强,容易理解,便于调试,缺点就是冗余数据较多,不适宜传输二进制文件(比如:图片等),解析复杂(需要进行字符串比较);
二进制协议,没有冗余字段,传输高效,方便解析(固定长度,并且可以直接比较字节),缺点就是定义的比较死,哪个位置有哪些东西,是什么意义是定义死的,场景单一。
所以,
1. 如果想要高效传输,比如物联网中收集传感器数据,使用二进制协议
2. 如果想要便于调试,比如使用telnet就能当客户端用,可使用文本协议
3. 如果命令较少,比如即时通讯软件,可以使用文本协议
4. 二进制数据的难理解性,自然加密,对数据安全有一定要求的可以使用二进制协议
等等。
总的来说,这是一个平衡的过程,要看具体项目的需要。
相关文章推荐
- 谈谈Java的try..catch...
- Google是如何做代码审查的?
- 常用的Javascript设计模式
- 怎么实现iMindMap中甘特图的打印
- SVN备份
- android hybird 混合开发
- 小米视频破解版
- spring mvc资源请求404
- 【技术控】 如何做按钮小动画?HTML+CSS3
- 马云成名前的一些照片
- idea 将本地项目提交到osc上
- windows下安装cygwin及配置
- 强行删除mac中的文件
- VS2012发布网站详细步骤,同样适合vs2013,亲身试过
- Eclipse创建Maven工程,pom.xml报错的解决办法
- maven 从入门到实战
- Oracle ---查询当前日期的前几个月时间
- Linux(CentOS6) zeromq编译安装
- zeromq初探
- Navicat 结构同步常规设置讲解