Bolt 协议握手规范

所有 Bolt 连接都以握手开始,以协商要使用的消息协议版本。成功协商后,商定的消息协议将接管连接在其剩余生命周期中的所有权。握手本身没有版本控制。

Bolt 是一种客户端-服务器协议,主要用于对数据库服务器执行查询。通信通过请求-响应交换发生,这与 HTTP 非常相似。但是,与 HTTP 不同,Bolt 连接是有状态的。

除非另有说明,否则字节值使用十六进制表示法。

字节序

Bolt 要求所有可能因字节序而异的值都应使用网络字节序(也称为大端字节序)传输。这意味着值的最高有效部分首先写入网络或内存空间,最低有效部分最后写入。

连接和断开连接

Bolt 通信旨在通过 TCP 连接进行。默认端口为TCP 7687,但可以使用任何端口。

Bolt 连接没有正式的关闭过程。任何一方都可以在任何时间在 TCP 层关闭连接。客户端和服务器都应做好发生这种情况的准备,并应妥善处理它。

握手

在成功连接后立即,客户端**必须**启动握手。此握手是用于确定后续消息协议版本的固定交换。

Bolt 识别

握手的第一部分用于识别到服务器,这是一个 Bolt 连接。它应由客户端在成功建立连接后立即发送,并且不需要服务器响应。

标识由以下四个字节组成

C: 60 60 B0 17

版本协商

识别后,将发生一个小的客户端-服务器交换,以确定要使用的消息协议版本。在此过程中,客户端提交正好**四个协议版本**,每个版本都编码为**大端 32 位无符号整数**,总共**128 位**。如果交换中需要的版本少于四个,则协议版本零可以用作占位符。如果找到服务器支持的版本的匹配项,则响应将包含编码为**单个 32 位整数**的该版本。如果未找到匹配项,则返回零值,然后服务器立即关闭连接。

在此交换中,零值(四个零字节)始终表示“无协议版本”。对于客户端,如果不知道少于四个协议版本,则可以使用它作为填充。对于服务器,这表示未找到版本匹配。

服务器应假设客户端请求中包含的版本已按首选项顺序发送。因此,如果对多个版本发生匹配,则应选择第一个匹配项。

客户端知道 Bolt 协议版本 1 且服务器以版本 1 响应的示例。
C: 60 60 B0 17
C: 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00
S: 00 00 00 01
客户端知道 Bolt 协议版本 1 和 2,且服务器以版本 2 响应的示例。
C: 60 60 B0 17
C: 00 00 00 02 00 00 00 01 00 00 00 00 00 00 00 00
S: 00 00 00 02
客户端知道 Bolt 协议版本 1、2 和 3,且服务器以版本 2 响应的示例。
C: 60 60 B0 17
C: 00 00 00 03 00 00 00 02 00 00 00 01 00 00 00 00
S: 00 00 00 02
客户端知道 Bolt 协议版本 3 但服务器以无版本响应的示例,服务器不支持与客户端的通信。
C: 60 60 B0 17
C: 00 00 00 03 00 00 00 00 00 00 00 00 00 00 00 00
S: 00 00 00 00

Bolt 版本 4.3

在 Bolt 版本 4.3 中,版本方案支持次版本范围。前 8 位保留。接下来的 8 位表示指定次版本(接下来的 8 位)和主版本(接下来的 8 位)版本以下支持的连续次版本数量。

范围不能跨越多个主版本。

版本 4.3 加上两个之前的次版本 4.2 和 4.1 的示例
00 02 03 04
客户端知道五个 Bolt 版本:3、4.0、4.1、4.2 和 4.3,且服务器以 4.1 响应的示例
C: 60 60 B0 17
C: 00 03 03 04 00 00 01 04 00 00 00 04 00 00 00 03
S: 00 00 01 04

客户端必须显式指定所有早于 4.3 的版本,因为仅支持这些协议版本的服务器可能不支持范围。该示例利用了 Bolt 4.1 和 4.2 等价的事实,并且仅提供 4.3、4.2、4.0 和 3,但指定了一个范围(4.3-4.0),以防服务器支持范围。

Bolt 版本 4.0

在 Bolt 版本 4.0 中,版本方案支持主版本和次版本编号。前 16 位保留。8 位表示次版本。8 位表示主版本。

版本 4.1 的示例
00 00 01 04
客户端知道三个 Bolt 版本:3、4.0 和 4.1,且服务器以 4.1 响应的示例。
C: 60 60 B0 17
C: 00 00 01 04 00 00 00 04 00 00 00 03 00 00 00 00
S: 00 00 01 04