zoukankan      html  css  js  c++  java
  • 文本协议与二进制协议的选择

    转自:https://www.cnblogs.com/houkui/p/4268233.html

    进行网络通信时,我们经常纠结于到底使用什么样的协议传输数据,下面我谈谈应该怎么选择一种合理的协议格式。

    网络协议


    标准定义是这样的:

      为计算机网络中进行数据交换而建立的规则、标准或约定的集合。

      网络协议至少包括三要素:

      语法:语法是用户数据与控制信息的结构与格式,以及数据出现的顺序。

      语义:解释控制信息每个部分的意义。它规定了需要发出何种控制信息,以及完成的动作与做出什么样的响应。

      时序:时序是对事件发生顺序的详细说明。

      人们形象地把这三个要素描述为:语义表示要做什么,语法表示要怎么做,时序表示做的顺序。

    通俗地说,协议就是通信双方能够理解的一种数据格式。

    在进行网络开发中,文本协议和二进制协议是我们最常用的两种。往往要根据这两种协议的特点进行选择,那么我们先来看下这两种协议分别具有什么特点。

    文本协议


    文本协议一般是由一串ACSII字符组成的数据,这些字符包括数字,大小写字母、百分号,还有回车( ),换行( )以及空格等等。

    文本协议设计的目的就是方便人们理解,读懂。所以,协议中通常会加入一些特殊字符用于分隔,比如如下数据:

    !set chl 003#

    其中,以!标识命令的开始,#标识命令结束,空格用来分隔命令字段,虽然我们不知道这条命令具体干什么,但通过字面我们大致知道可能是设置(set)某一个参数(chl)值为003,这样在我们进行调试的时候,可以快速准确地看到当时发生了什么,更好地解决问题。

    但为了便于解析,文本协议不得不添加一些冗余的字符用于分隔命令,降低了其传输的效率;而且只适于传输文本,很难嵌入其他数据,比如一张图片。

    二进制协议


    二进制协议就是一串字节流,通常包括消息头(header)和消息体(body),消息头的长度固定,并且消息头包括了消息体的长度。这样就能够从数据流中解析出一个完整的二进制数据。如下是一个典型的二进制协议:

    其中,Guide用于标识协议起始,Length是消息体Data的长度,为了数据完整性,还会加上相应的校验(DataCRC,HeaderCRC);Data中又分为命令字(CMD),和命令内容。命令字是双方协议文档中规定好的,比如0x01代表登录,0x02代表登出等,一般数据字段的长度也是固定的。又因为长度的固定,所以少了冗余数据,传输效率较高。

     

    总结


    综上,我们大致总结文本协议和二进制协议的优缺点:

    文本协议,直观、描述性强,容易理解,便于调试,缺点就是冗余数据较多,不适宜传输二进制文件(比如:图片等),解析复杂(需要进行字符串比较);

    二进制协议,没有冗余字段,传输高效,方便解析(固定长度,并且可以直接比较字节),缺点就是定义的比较死,哪个位置有哪些东西,是什么意义是定义死的,场景单一。

    所以,

    1. 如果想要高效传输,比如物联网中收集传感器数据,使用二进制协议

    2. 如果想要便于调试,比如使用telnet就能当客户端用,可使用文本协议

    3. 如果命令较少,比如即时通讯软件,可以使用文本协议

    4. 二进制数据的难理解性,自然加密,对数据安全有一定要求的可以使用二进制协议

    等等。

    总的来说,这是一个平衡的过程,要看具体项目的需要。

  • 相关阅读:
    poj 2187 Beauty Contest(旋转卡壳)
    poj 2540 Hotter Colder(极角计算半平面交)
    poj 1279 Art Gallery(利用极角计算半平面交)
    poj 3384 Feng Shui(半平面交的联机算法)
    poj 1151 Atlantis(矩形面积并)
    zoj 1659 Mobile Phone Coverage(矩形面积并)
    uva 10213 How Many Pieces of Land (欧拉公式计算多面体)
    uva 190 Circle Through Three Points(三点求外心)
    zoj 1280 Intersecting Lines(两直线交点)
    poj 1041 John's trip(欧拉回路)
  • 原文地址:https://www.cnblogs.com/xingzc/p/9037488.html
Copyright © 2011-2022 走看看