分块协议¶
握手之后,连接开始复用一个或多个块流。每个块流承载来自一个消息流的一类消息。每个被创建的块都关联到一个唯一的块流ID。所有的块都通过网络传输。在传输过程中,必须一个块发送完之后再发送下一个块。在接收端,每个块都根据块ID被收集成消息。
分块使高层协议的大消息分割成小的消息,保证大的低优先级消息不阻塞小的高优先级消息。
分块把原本应该消息中包含的信息压缩在块头中减少了小块消息发送的开销。
块大小是可配置的。这个可以在协议控制消息中描述的块消息中完成。最大块是65535字节,最小块是128字节。块越大CPU使用率越低,但是也导致大的写入,在低带宽下产生其他内容的延迟。块大小对每个方向都保持独立。
块格式¶
块由头和数据组成。块头由三部分组成:
+-------------+----------------+-------------------+--------------+
| Basic header|Chunk Msg Header|Extended Time Stamp| Chunk Data |
+-------------+----------------+-------------------+--------------+
块基本头:1到3字节
本字段包含块流ID和块类型。块类型决定编码的消息头的格式。长度取决于块流ID。块流ID是可变长字段。
块消息头:0,3,7或11字节
本字段编码要发送的消息的信息。本字段的长度,取决于块头中指定的块类型。
扩展时间戳:0个或4字节
本字段必须在发送普通时间戳(普通时间戳是指块消息头中的时间戳)设置为0xffffff时发送,正常时间戳为其他值时都不应发送本值。当普通时间戳的值小于0xffffff时,本字段不用出现,而应当使用正常时间戳字段。
块基本头¶
块基本头由块类型FMT和块流ID组成。块类型FMT决定编码消息头的格式。块基本头字段可能是1,2或3个字节,取决于块流ID的大小。
一个实现应该用最少的数据来表示ID。
本协议支持65597种流,ID从2 - 65599。其中ID中0,1,2为保留字段,主要用于区分不同字节版本:
- 0:使用2字节版本
- 1:使用3字节版本
- 2:使用1字节版本
所以协议组成部分如下:
FMT:2位
本字段标识块消息头的4种格式。每种流类型的块消息头在下一节中表示。
cs id:6位
本字段表示范围在2 - 63的块流ID。值0和1表示2或3字节版本。
cs id(>= 64):8 - 16位
本字段包含块流ID减去64的值。例如365,使用cs id表示为1,并用cs id(>= 64)的16位表示301。
2字节版本¶
0 1
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|fmt| 0 | cs id - 64 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
可以表示ID的范围:64 ~ 319(64 + 255)。
3字节版本¶
0 1 2
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|fmt| 1 | cs id - 64 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
可以表示ID的范围:64 ~ 65599(64 + 65535)。