Google Protocol Buffer
什么是 Google Protocol Buffer? 假如您在网上搜索,应该会得到类似这样的文字介绍:
Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48,162 种报文格式定义和超过 12,183 个 .proto 文件。他们用于 RPC 系统和持续数据存储系统。
Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前提供了 C++、Java、Python 三种语言的 API。
或许您和我一样,在第一次看完这些介绍后还是不明白 Protobuf 究竟是什么,那么我想一个简单的例子应该比较有助于理解它。
移动应用客户端与服务器之间的通信协议,目前比较主流的有Facebook的Thrift,腾讯的JCE,以及Google的ProtocolBuffer(以下简称protobuf),本文主要介绍protobuf基本概念,协议解析,以及在Android中的应用实践。
定义
一种 结构化数据 的数据存储格式(类似于 XML、Json
),用于网络世界的数据交换
Google 出品 (开源)
Protocol Buffer 目前有两个版本:proto2 和 proto3
因为proto3 还是beta 版,所以本次讲解是 proto2
Protobuf是一种灵活高效的,用于序列化结构化数据的机制,类似于XML,但比XML更小,更快,更简单。Protobuf序列化为二进制数据,不依赖于平台和语言,同时具备很好的兼容性。
通过将 结构化的数据 进行 串行化(序列化),从而实现 数据存储 / RPC(Remote Procedure Call Protocol远程过程调用协议) 数据交换的功能:
序列化: 将 数据结构或对象 转换成 二进制串 的过程
反序列化:将在序列化过程中所生成的二进制串 转换成 数据结构或者对象 的过程
应用场景
传输数据量大 & 网络环境不稳定 的数据存储、RPC 数据交换 的需求场景
如 即时IM (QQ、微信)的需求场景
在 传输数据量较大的需求场景下,Protocol Buffer比XML、Json 更小、更快、使用 & 维护更简单!
序列化与反序列化
网络通信协议
OSI/RM协议模型
说到GPB(Google protocol Buffer)通过序列化与反序列化来进行数据传输,那么我们来聊聊序列化的问题。
序列化 & 反序列化 属于通讯协议的一部分
通讯协议采用分层模型:TCP/IP模型(四层) & OSI 模型 (七层)
ISO/OSI的参考模型共有7层,由低层至高层分别为:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
各层功能分别为:
(1)物理层
提供建立、维护和拆除物理链路所需的机械、电气、功能和规程的特性;提供有关在传输介质上传输非结构的位流
及物理链路故障检测指示。在这一层,数据还没有被组织,仅作为原始的位流或电气电压处理,单位是比特。
(2)数据链路层
负责在两个相邻结点间的线路上,无差错地传送以帧为单位的数据,并进行流量控制。每一帧包括一定数量的数据
和一些必要的控制信息。与物理层相似,数据链路层要负责建立、维持和释放数据链路的连接。在传送数据时,如
果接收点检测到所传数据中有差错,就要通知发方重发这一帧。
(3)网络层
为传输层实体提供端到端的交换网络数据传送功能,使得传输层摆脱路由选择、交换方式、拥挤控制等网络传输
细节;可以为传输层实体建立、维持和拆除一条或多条通信路径;对网络传输中发生的不可恢复的差错予以报告。
网络层将数据链路层提供的帧组成数据包,包中封装有网络层包头,其中含有逻辑地址信息——源站点和目的站点
地址的网络地址。
(4)传输层
为会话层实体提供透明、可靠的数据传输服务,保证端到端的数据完整性;选择网络层的最适宜的服务;提供建
立、维护和拆除传输连接功能。传输层根据通信子网的特性,最佳的利用网络资源,为两个端系统的会话层之间提
供建立、维护和取消传输连接的功能,并以可靠和经济的方式传输数据。在这一层,信息的传送单位是报文。
(5)会话层
为彼此合作的表示层实体提供建立、维护和结束会话连接的功能;完成通信进程的逻辑名字与物理名字间的对应;
提供会话管理服务。
(6)表示层
为应用层进程提供能解释所交换信息含义的一组服务,即将欲交换的数据从适合于某一用户的抽象语法,转换为
适合于OSI系统内部使用的传送语法,提供格式化的表示和转换数据服务。数据的压缩,解压缩,加密和解密等
工作都由表示层负责。
(7)应用层
提供OSI用户服务,即确定进程之间通信的性质,以满足用户需要以及提供网络与用户应用软件之间的接口服务。
简言之,各层的作用:
物理层:在物理媒体上传输原始的数据比特流。
数据链路层:将数据分成一个个数据帧,以数据帧为单位传输。有应有答,遇错重发。
网络层:将数据分成一定长度的分组,将分组穿过通信子网,从信源选择路径后传到信宿。
传输层:提供不具体网络的高效、经济、透明的端到端数据传输服务。
会话层:进程间的对话也称为会话,会话层管理不同主机上各进程间的对话。
表示层: 为应用层进程提供格式化的表示和转换数据服务。
应用层:提供应用程序访问OSI环境的手段。
OSI网络体系结构各层协议:
(1)应用层:TELNET、FTP、TFTP、SMTP、SNMP、HTTP、BOOTP、DHCP、DNS
(2)表示层:
文本:ASCII,EBCDIC
图形:TIFF,JPEG,GIF,PICT
声音:MIDI,MPEG,QUICKTIME
(3)会话层:NFS、SQL、RPC 、X-WINDOWS、ASP(APPTALK会话协议)、SCP
(4)传输层:TCP、UDP、SPX
(5)网络层:IP、IPX、ICMP、RIP、OSPF(Open Shortest Path First开放式最短路径优先)
(6)数据链路层:SDLC、HDLC、PPP、STP(Spanning Tree Protocol)、帧中继
(7)物理层:EIA/TIA RS-232、EIA/TIA RS-449、V.35、RJ-45
常用端口(每个协议都有一个缺省端口)
TCP/IP协议模型
TCP/IP概念层次中与OSI模型相互对应
两者关系
OSI引入了服务、接口、协议、分层的概念,TCP/IP借鉴了OSI的这些概念建立TCP/IP模型。
OSI先有模型,后有协议,先有标准,后进行实践;而TCP/IP则相反,先有协议和应用再提出了模型,且是参照的OSI模型。
OSI是一种理论下的模型,而TCP/IP已被广泛使用,成为网络互联事实上的标准。
- TCP:transmission control protocol 传输控制协议
- UDP:user data protocol 用户数据报协议
OSI七层协议模型算是一个理想的规范模型而不应用在实践中,而TCP/IP模型则是现在国际所通用的网络传输协议模型
序列化 / 反序列化 属于 TCP/IP模型 应用层 和 OSI`模型 展示层的主要功能:
- (序列化)把 应用层的对象 转换成 二进制串
- (反序列化)把 二进制串 转换成 应用层的对象
所以, Protocol Buffer属于 TCP/IP模型的应用层 & OSI模型的展示层
对于数据结构和对象
数据结构、对象与二进制串
不同的计算机语言中,数据结构,对象以及二进制串的表示方式并不相同。
对于面向对象的语言(如Java):对象 = Object = 类的实例化;在Java中最接近数据结构 即 POJO(Plain Old Java Object),或Javabean(只有 setter/getter 方法的类)
对于半面向对象的语言(如C++),对象 = class,数据结构 = struct
对于C++,因为具有内存操作符,所以 二进制串 容易理解:C++的字符串可以直接被传输层使用,因为其本质上就是以 ‘\0’ 结尾的存储在内存中的二进制串
对于 Java,二进制串 = 字节数组 =byte[]
byte 属于 Java 的八种基本数据类型
二进制串 容易和 String混淆:String 一种特殊对象(Object)。对于跨语言间的通讯,序列化后的数据当然不能是某种语言的特殊数据类型。
T - L - V 的数据存储方式
- 定义
即 Tag - Length - Value,标识 - 长度 - 字段值 存储方式
作用
以 标识 - 长度 - 字段值 表示单个数据,最终将所有数据拼接成一个 字节流,从而 实现 数据存储 的功能
其中 Length可选存储,如 储存Varint编码数据就不需要存储Length
- 示意图