#queue #protocols #numbers #byte #layer #presentation #parallel

bqsp

用于以快速和高效的方式传输数据的表示层协议

2个不稳定版本

0.5.1 2024年3月8日
0.4.3 2024年3月1日

10#presentation

Download history 22/week @ 2024-04-03

每月60次下载

CC-BY-4.0

17KB
303

BQSP

Box Queue Streaming Protocol

关于

BQSP是一种表示层协议,用于通过任何字节流以快速和高效的方式传输数据。

主要方面是使用队列。每个有效负载可以分配一个特定的队列号,然后可以被应用程序并行处理。

例如,如果客户端同时发送2个请求,每个请求具有不同的队列号,服务器可以并行执行它们。即使第二个到达的请求先被处理,服务器也可以发送具有相同队列号的响应,因此客户端可以知道哪个响应应与哪个请求关联。

BQSP是在"Hangin!"应用程序中创建的,旨在减少网络使用并提高用户体验。

数据包

在BQSP的术语中,“数据包”是包含头和有效负载/数据的完整结构。

<PACKET> = [HEADER] + [DATA]

此结构包含处理有效负载/数据所需的所有元数据。

头由以下部分组成

  • 数据大小 (4字节) - 有效负载/数据的大小
  • 数据类型 (2字节) - 有效负载/数据的类型
  • 队列 (1字节) - 队列号

头以LittleEndian表示,因此一个示例头可能看起来像这样

Data Size:  16     (0x10)    [10, 0, 0, 0]
Data Type:  43775  (0xAAFF)  [FF, AA]
Queue:      1      (0x1)     [1]
-------------------------------------------
[10, 0, 0, 0, FF, AA, 1]

有效负载/数据

在头之后接受任何数据。

为了使另一端知道发送了什么类型的数据,在数据包的头中使用数据类型属性是一个好主意。

例如,如果以下JSON是有效负载/数据

{"status":"ok"}

并且用于表示数据类型的枚举如下

#[repr(u16)]
enum MyDataType {
    Unknown = 0,
    Text = 1,
    JSON = 2,
}

整个数据包将如下所示

Data Size:  15  (0xF)  [F, 0, 0, 0]
Data Type:  2   (0x2)  [2, 0]
Queue:      1   (0x1)  [1]
-------------------------------------------
[F, 0, 0, 0, 2, 0, 1, 7B, 22, 73, 74, 61, 74, 75, 73, 22, 3A, 22, 6F, 6B, 22, 7D]

当前状态

BQSP已准备就绪,但该包本身缺少许多功能、优化和适当的文档。

队列和数据类型由实现协议的系统以及应用程序的需求决定。BQSP是发送和接收数据的方式,而不是处理或验证数据的方式。

一个数据包中有效负载/数据的最大长度为4_294_967_295 字节,约等于4.29 GB,但一次性发送如此大量的数据并不建议。最好是将其分成更小的数据包。

许可证

盒队列流协议 采用 CC BY 4.0 许可。

依赖项

~0–1.2MB
~20K SLoC