MySQL通信协议阅读笔记

传输协议会用到的数据类型:

  1. 整型
int<fix>: fix-length整型,fix表示固定长度1,2,3,4,6,8个字节固定长度的数据表示的整型数据,可以理解为6种类型的整型,只是他们的长度不一样
int<lenenc>: length-encoded整型,这种类型的长度取决于整型值的大小:
    If the value is < 251, it is stored as a 1-byte integer.
    If the value is ≥ 251 and < (2^16), it is stored as fc + 2-byte integer.
    If the value is ≥ (2^16) and < (2^24), it is stored as fd + 3-byte integer.
    If the value is ≥ (2^24) and < (2^64) it is stored as fe + 8-byte integer.
    需要注意0xfe这个字符可能也是EOF_Packet,所以区分它是8字节整型还是EOF的方法是判断数据包的长度。

共7种整型数据类型

  1. 字符串
string<fix>: 固定长度字符串,fix表示一个任意整数,数据包的描述中会写明此数字,表示这是一个固定长度为fix的字符串
string<NUL>: 非固定长度的以\0结尾的字符串
string<var>:非固定长度的字符串,它的长度在数据包的另外一个字段属性中
string<lenenc>:非固定长度的字符串,它的长度是以一个int<lenenc>数据存储在字符串前面
string<EOF>:如果一个字符串是数据包的最后一段数据,它的长度就是以数据包总长度减去前面所有字段长度总和剩下的长度

共5种字符串类型

MySQL数据包描述

数据包的长度是有限制的,如果数据包总长度过大,它会按照最大长度2^24-1字节(也就是16Mbytes)拆分为多个数据包
然后每个数据包都有一个包头,前3个字节表示payload部分长度,它是一个int<3>,第4个字节是一个sequence id,它在数据包被拆分发送时表示被拆分的顺序(从0开始递增)

int<3>: payload长度
int<1>: sequence id
string<var>: payload

MySQL数据包的类型

OK包

它是一个从server端发到client端的表示命令执行成功的数据包

ERR包

EOF包

MySQL连接的生命周期

连接阶段

initial handshake 和handshake response

https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_connection_phase_packets_protocol_handshake_response.html
文档中一些描述疑问点:

1. string<length>表示一个字符串,它的实际长度信息是存储在其他地方,例如auth_response数据,它的长度是在它前面1字节中存储int<1>
2. string<NUL>表示一个以\0结尾的字符串,不需要长度信息
3. string<lenenc>表示一个字符串,它的实际长度是存储在它的前面n字节,也是一个变长存储的整型int<lenenc>

handshake时的capability是客户端和服务端双方协商有哪些能力的字段。

命令阶段(command phase)

连接成功后客户端可以和服务端进行正常交互请求,这个阶段称为命令阶段,客户端可以发送以下类型的MySQLPacket包:

COM_QUERY

这个类型的数据包是最常用的,由客户端发起的sql语句组成,如果有CLIENT_QUERY_ATTRIBUTES标记,还会报告query parameter相关的一些信息
返回结果为COM_QUERY response类型包,包括输出字段信息,数据行记录等

COM_QUIT

断开连接的请求包类型

COM_INIT_DB

切换库的请求包类型

COM_FIELD_LIST

查看表的字段列表的请求包类型

COM_STATSTICS

查看统计信息的请求包类型

COM_DEBUG

COM_PING

对mysql-server进行探活的包类型

COM_CHANGE_USER

在不断开连接的情况下切换用户的包类型

COM_RESET_CONNECTION

重置当前连接的上下文信息

COM_SET_OPTION

设置capabilities中的所有

MySQL C API

mysql_option4(mysql, MYSQL_OPT_CONNECT_ATTR_ADD, "mykey", "myvalue");
在应用程序的客户端代码中使用此API函数可以将attr传递给MySQL对当前连接进行标记。

posted @ 2022-08-06 13:41  bug批发零售  阅读(60)  评论(0)    收藏  举报