协议的编码格式


开发网络应用,时常要自己去设计通讯的协议,原来自己被多种多样的协议的格式迷惑,理不清各种各样的协议的联系,查查资料,思考之后,还是理清了,如果,你也有类似的疑惑,你不妨看看


协议的区分的本质(或者说协议的区分的入口点)是在协议的编码的格式

  • 文本流编码
  • 二进制流编码
  • 混合编码

仔细想想,这和文件类型区分的入口点,是一致的


文本流编码

常见的基于文本流编码的网络协议的编码有: XML JSON
这两种具体的语法的规范,不在累述,使用的场景还是非常多的,不只是在网络协议的,在应用的开发中,将文本文件,存储成这两种格式,还是极为普遍

文本流编码的一个不可忽视的的问题是:特殊字符的转义


二进制编码

其实这是网络协议的发展史上,先出现的编码的格式(考虑远古时代的 内存,网络带宽)

基于这种编码的格式,最常见的是 TLV编码(包括基于它的变体)
TLV:你可以理解成
TYPE + LENGTH + VALUE
TAG + LENGTH + VALUE
ID + LENGTH + VALUE

当ID唯一,length 字段就可以省略

成熟通用的二进制格式:

  • Protobuf
  • thrift 

基于这种编码的网络协议的特点

  1. 解析效率高:主要是因为不需要转义字符
  2. 编码长度低:主要是因为元数据占用的空间很少
  3. 不易于实现:但是有很多开源的工具,根据IDL自动生成代码,提高开发效率
  4. 兼容性高:协议双方可以独立升级
  5. 可读性差:二进制协议,肉眼很难识别

混合型编码

Avro

没用过,不懂,先占坑,后续


参考链接: