Bolt 协议握手规范
所有 Bolt 连接都以握手开始,以协商要使用的消息协议版本。成功协商后,商定的消息协议将接管连接,直至其生命周期结束。握手本身不带版本信息。
Bolt 是一种客户端-服务器协议,主要设计用于对数据库服务器执行查询。通信通过请求-响应交换进行,方式与 HTTP 非常相似。然而,与 HTTP 不同的是,Bolt 连接是有状态的。
除非另有说明,字节值均以十六进制表示。 |
连接和断开连接
Bolt 通信旨在通过 TCP 连接进行。默认端口是 TCP 7687
,但可以使用任何端口。
Bolt 连接没有正式的关闭程序。任何一方都可以在 TCP 级别随时关闭连接。客户端和服务器都应为此做好准备并妥善处理。
握手
成功连接后,客户端必须立即启动握手。此握手是用于确定后续消息协议版本的固定交换。
版本协商
标识后,会进行一次小的客户端-服务器交换,以确定要使用的消息协议版本。在此交换中,客户端提交精确的四个协议版本,每个版本都编码为大端 32 位无符号整数,总计128 位。如果交换中需要的版本少于四个,协议版本零可以用作占位符。如果找到与服务器支持的版本匹配的版本,响应将包含该版本,编码为单个 32 位整数。如果未找到匹配项,则返回零值,随后服务器立即关闭连接。
在此交换中,零值(四个零字节)始终表示“无协议版本”。对于客户端,如果已知的协议版本少于四个,这可以用作填充。对于服务器,这表示未找到版本匹配。
服务器应假定客户端请求中包含的版本是按优先级顺序发送的。因此,如果多个版本匹配,应选择第一个匹配项。
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
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
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
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 位)之下,支持的连续次要版本数量。
该范围不能跨越多个主要版本。 |
00 02 03 04
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),以防服务器支持范围。 |