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
New 4.1 protocol
CLIENT_INTERACTIVE
0x0400
This is an interactive client
CLIENT_SSL
0x0800
Switch to SSL after handshake
CLIENT_IGNORE_SIGPIPE
0x1000
IGNORE sigpipes
CLIENT_TRANSACTIONS
0x2000
Client knows about transactions
CLIENT_RESERVED
0x4000
Old flag for 4.1 protocol
CLIENT_SECURE_CONNECTION
0x8000
New 4.1 authentication
CLIENT_MULTI_STATEMENTS
0x0001 0000
Enable/disable multi-stmt support
CLIENT_MULTI_RESULTS
0x0002 0000
Enable/disable multi-results
字符编码:标识服务器所使用的字符集。
服务器状态:状态值定义如下(参考MySQL源代码/include/mysql_com.h中的宏定义):
状态名称状态值
SERVER_STATUS_IN_TRANS
0x0001
SERVER_STATUS_AUTOCOMMIT
0x0002
SERVER_STATUS_CURSOR_EXISTS
0x0040
SERVER_STATUS_LAST_ROW_SENT
0x0080
SERVER_STATUS_DB_DROPPED
0x0100
SERVER_STATUS_NO_BACKSLASH_ESCAPES
0x0200
SERVER_STATUS_META