04、RabbitMQ-客户端源码之Frame

作者:朱小厮 | 出自:https://hiddenpps.blog.csdn.net/column/info/14800

Frame是指AMQP协议层面的通信帧(一个正式定义的连接数据包)。
我们来看下Frame类中的成员变量有哪些:

/** Frame type code */
public final int type;
/** Frame channel number, 0-65535 */
public final int channel;
/** Frame payload bytes (for inbound frames) */
private final byte[] payload;
/** Frame payload (for outbound frames) */
private final ByteArrayOutputStream accumulator;

Frame里的三个成员变量:type, channel, payload是真正和报文有关的。accumulator是为了方便内部编程的一个变量。Frame类就是对这个玩意儿捯饬捯饬,没有什么难度,好奇的同学可以自己翻看下,本文主要来阐述下AMQP中的Frame的一些信息。

一个通信帧的协议层面的结构如下:

序号 名称 占用字节
1 frame type 1B
2 channel number 2B
3 payload length 4B
4 payload [0-N]B
5 FRAME_END(结束帧) 1B(0xCE)

这样可以知道:一个通信帧的最小大小为:1B+2B+4B+0B+1B=8B.

AMQP 定义了如下的帧类型:

1、 Type=1,“METHOD”:方法帧;
2、 Type=2,“HEADER”:内容头帧;
3、 Type=3,“BODY”:内容体帧.;
4、 Type=8,“HEARTBEAT”:心跳帧.;

通道编号为0的代表全局连接中的所有帧,1-65535代表特定通道的帧.

方法帧
type=1, payload包含以下内容:
classId:2B
methodId:2B
argument:NB

内容头帧
type=2,payload包含以下内容
classId:2B
weight:2B
BodySize:8B
property flags:2B
properties: NB

内容帧
type=3, payload不进行具体解析,

心跳帧
tpye=8,没有payload。心跳帧的channel number必须为0。