类型-长度-值(TLV)协议

在数据通信协议中,可选的信息或字段通常使用type-length-value(a.k.a TLV)元素来进行编码。

  • Type - 类型

用来标示字段类型的值,通常是一个二进制值或简单的字母

  • Length - 长度

字段长度,单位通常为Byte

  • Value - 值

一个变长的比特数组用来存储这个字段的值

优势

  • TLV序列方便遍历查找
  • 新的字段可以无痛的加入现有的协议中。解析的时候,对于未知的字段,可以轻松的跳过。这点与XML类似
  • TLV元素的顺序可以是随意的
  • TLV元素通常使用二进制存储,可以使解析速度加快并且使数据更小
  • TLV可以与XML数据相互转换,易于人类阅读

例子

在这里,我们以protobuf的可选和变长字段为例。

field_number ++ wire_type

每一个protobuf的字段在传输时,都会加上field_numberwire_type这两个值,这两个值组成这个字段的key。

key = (field_number << 3) | wire_type

field_number标明了字段的编号,方便协议向前向后的兼容。而 …

more ...

FlatBuffer代码阅读 - 1

FlatBuffer白皮书

Flatbuffer是一个全新的序列化库。

动机

在远古时代,程序性能基本取决于你的指令和循环运行的有多快。但是,在如今的计算机上,计算组件的速度已经远远超过存储组件的速度。如果你想让你的程序飞起来,最重要的就是优化你的内存使用。例如,用多少内存,怎样布局内存,如何分配内存,何时拷贝内存等。

序列化是在程序中非常常见的一种操作,并且通常是程序性能低下的主要原因。一是由于序列化需要额外的临时空间去解析和表示数据,二是由于不优雅的内存分配模式和局部性。

如果一个序列化框架可以不使用额外的对象,没有额外的内存分配,没有内存拷贝,良好的数据局部性,这正是太好不过。不过当下的很多框架通常不能满足以上的条件,因为它们需要向前/向后兼容,需要兼容不同的平台,例如大端/小端和内存对齐都是需要进行兼容性处理的。

FlatBuffer可以做到以上的一切。

Flatbuffer尤其适合移动设备(内存容量和带宽比桌面设备的要低不少),以及需要高性能的应用:游戏。

FlatBuffers

总述

Flatbuffer是一个二进制的buffer。Flatbuffer可以包含嵌套对象如struct、table、vector等并使用偏移量来进行寻址,这样一来,我们就可以像遍历基于指针的结构一样,对flatbuffer元素进行in-place的遍历。 Flatbuffer使用严格的字节对齐和字节顺序(通常是小端)以保证可以跨平台使用。

另外,像table这样的对象,Flatbuffer提供了向前 …

more ...