mysql 结束符报错_MySQL协议分析

目录

目录

1 交互过程

1.1 握手认证阶段

1.2 命令执行阶段

2 基本类型

2.1 整型值

2.2 字符串(以NULL结尾)(Null-Terminated String)

2.3 二进制数据(长度编码)(Length Coded Binary)

2.4 字符串(长度编码)(Length Coded String)

3 报文结构

3.1 消息头

3.1.1 报文长度

3.1.2 序号

3.2 消息体

4 报文类型

4.1 登陆认证交互报文

4.1.1 握手初始化报文(服务器 -> 客户端)

4.1.2 登陆认证报文(客户端 -> 服务器)

4.2 客户端命令请求报文(客户端 -> 服务器)

4.2.1 COM_QUIT 消息报文

4.2.2 COM_INIT_DB 消息报文

4.2.3 COM_QUERY 消息报文

4.2.4 COM_FIELD_LIST 消息报文

4.2.5 COM_CREATE_DB 消息报文

4.2.6 COM_DROP_DB 消息报文

4.2.7 COM_REFRESH 消息报文

4.2.8 COM_SHUTDOWN 消息报文

4.2.9 COM_STATISTICS 消息报文

4.2.10 COM_PROCESS_INFO 消息报文

4.2.11 COM_PROCESS_KILL 消息报文

4.2.12 COM_DEBUG 消息报文

4.2.13 COM_PING 消息报文

4.2.14 COM_CHANGE_USER 消息报文

4.2.15 COM_BINLOG_DUMP 消息报文

4.2.16 COM_TABLE_DUMP 消息报文

4.2.17 COM_REGISTER_SLAVE 消息报文

4.2.18 COM_PREPARE 消息报文

4.2.19 COM_EXECUTE 消息报文

4.2.20 COM_LONG_DATA 消息报文

4.2.21 COM_CLOSE_STMT 消息报文

4.2.22 COM_RESET_STMT 消息报文

4.2.23 COM_SET_OPTION 消息报文

4.2.24 COM_FETCH_STMT 消息报文

4.3 服务器响应报文(服务器 -> 客户端)

4.3.1 OK 响应报文

4.3.2 Error 响应报文

4.3.3 Result Set 消息

4.3.4 Result Set Header 结构

4.3.5 Field 结构

4.3.6 EOF 结构

4.3.7 Row Data 结构

4.3.8 Row Data 结构(二进制数据)

4.3.9 PREPARE_OK 响应报文(Prepared Statement)

4.3.10 Parameter 响应报文(Prepared Statement)

5 参考资料

1 交互过程

MySQL客户端与服务器的交互主要分为两个阶段:握手认证阶段和命令执行阶段。

1.1 握手认证阶段

握手认证阶段为客户端与服务器建立连接后进行,交互过程如下:

服务器 -> 客户端:握手初始化消息

客户端 -> 服务器:登陆认证消息

服务器 -> 客户端:认证结果消息

1.2 命令执行阶段

客户端认证成功后,会进入命令执行阶段,交互过程如下:

客户端 -> 服务器:执行命令消息

服务器 -> 客户端:命令执行结果

MySQL客户端与服务器的完整交互过程如下:

2 基本类型

2.1 整型值

MySQL报文中整型值分别有1、2、3、4、8字节长度,使用小字节序传输。

2.2 字符串(以NULL结尾)(Null-Terminated String)

字符串长度不固定,当遇到'NULL'(0x00)字符时结束。

2.3 二进制数据(长度编码)(Length Coded Binary)

数据长度不固定,长度值由数据前的1-9个字节决定,其中长度值所占的字节数不定,字节数由第1个字节决定,如下表:

第一个字节值后续字节数长度值说明

0-250

0

第一个字节值即为数据的真实长度

251

0

空数据,数据的真实长度为零

252

2

后续额外2个字节标识了数据的真实长度

253

3

后续额外3个字节标识了数据的真实长度

254

8

后续额外8个字节标识了数据的真实长度

2.4 字符串(长度编码)(Length Coded String)

字符串长度不固定,无'NULL'(0x00)结束符,编码方式与上面的 Length Coded Binary 相同。

3 报文结构

报文分为消息头和消息体两部分,其中消息头占用固定的4个字节,消息体长度由消息头中的长度字段决定,报文结构如下:

3.1 消息头

3.1.1 报文长度

用于标记当前请求消息的实际数据长度值,以字节为单位,占用3个字节,最大值为 0xFFFFFF,即接近 16 MB 大小(比16MB少1个字节)。

3.1.2 序号

在一次完整的请求/响应交互过程中,用于保证消息顺序的正确,每次客户端发起请求时,序号值都会从0开始计算。

3.2 消息体

消息体用于存放请求的内容及响应的数据,长度由消息头中的长度值决定。

4 报文类型

4.1 登陆认证交互报文

4.1.1 握手初始化报文(服务器 -> 客户端)

服务协议版本号:该值由 PROTOCOL_VERSION 宏定义决定(参考MySQL源代码/include/mysql_version.h头文件定义)

服务版本信息:该值为字符串,由 MYSQL_SERVER_VERSION 宏定义决定(参考MySQL源代码/include/mysql_version.h头文件定义)

服务器线程ID:服务器为当前连接所创建的线程ID。

挑战随机数:MySQL数据库用户认证采用的是挑战/应答的方式,服务器生成该挑战数并发送给客户端,由客户端进行处理并返回相应结果,然后服务器检查是否与预期的结果相同,从而完成用户认证的过程。

服务器权能标志:用于与客户端协商通讯方式,各标志位含义如下(参考MySQL源代码/include/mysql_com.h中的宏定义):

标志位名称标志位说明

CLIENT_LONG_PASSWORD

0x0001

new more secure passwords

CLIENT_FOUND_ROWS

0x0002

Found instead of affected rows

CLIENT_LONG_FLAG

0x0004

Get all column flags

CLIENT_CONNECT_WITH_DB

0x0008

One can specify db on connect

CLIENT_NO_SCHEMA

0x0010

Do not allow database.table.column

CLIENT_COMPRESS

0x0020

Can use compression protocol

CLIENT_ODBC

0x0040

Odbc client

CLIENT_LOCAL_FILES

0x0080

Can use LOAD DATA LOCAL

CLIENT_IGNORE_SPACE

0x0100

Ignore spaces before '('

CLIENT_PROTOCOL_41

0x0200

N

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值