Thrift的TBinaryProtocol二进制协议分析

Posted JavaGarden

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Thrift的TBinaryProtocol二进制协议分析相关的知识,希望对你有一定的参考价值。

先上张图,说明一下thrift的二进制协议是什么东东。

报文格式编码:

bool类型:

  一个字节的类型,两个字节的字段编号,一个字节的值(true:1,false:0).

Byte类型:

  一个字节的类型,两个字节的字段编号,一个字节的值.

I16类型:

  一个字节的类型,两个字节的字段编号,两个字节的值.

I32类型:

  一个字节的类型,两个字节的字段编号,四个字节的值.

I64类型和double类型:

  一个字节的类型,两个字节的字段编号,八个字节的值.

String类型:

  一个字节的类型,两个字节的字段编号,四个字节的负载数据长度,负载数据的值.

Struct类型:

  一个字节的类型,两个字节的字段编号,结构体负载数据,一个字节的结束标记.

MAP类型:

  一个字节的类型,两个字节的字段编号,一个字节的键类型,一个字节的值类型,四个字节的负载数据长度,负载数据的值.

Set类型:

  一个字节的类型,两个字节的字段编号,一个字节的值类型,四个字节的负载数据长度,负载数据的值.

List类型:

  一个字节的类型,两个字节的字段编号,一个字节的值类型,四个字节的负载数据长度,负载数据的值.

消息(函数)类型:

  表示方式一:四个字节的版本(含调用类型),四个字节的消息名称长度,消息名称,四个字节的流水号,消息负载数据的值,一个字节的结束标记。

  表示方式二:四个字节的消息名称长度,消息名称,一个字节调用类型,四个字节的流水号,消息负载数据的值,一个字节的结束标记。

  对严格的thrift消息,必须包含32为版本信息。

  若有32为版本信息,函数调用(请求:1,响应:2,异常:3,无返回值的请求:4)被包含到32为版本中,不独立出现。

  计算方法:

  32位版本 = 0x8001000 & 函数调用

  计算后,请求报文的32为版本值为 0x80010001;响应报文的32为版本值为 0x80010002;异常报文的32为版本值为 0x80010003;

  若没有32为版本信息时,函数调用(请求:1,响应:2,异常:3,无返回值的请求:4)独立出现在消息报文中。

thrift的IDL文件如下:

(c)2006-2024 SYSTEM All Rights Reserved IT常识