(四)Go-编写MySQL数据库驱动之MySQL协议解析客户端请求报文

· 931字 · 2分钟 · 阅读量

准备:

(一)客户端命令请求报文 🔗

首先前面的四个字节是包头,其中前三位代表packet数据长度,第四位是包序列号。以下是客户端命令请求报文的四字节后的内容。

Type Name Description
int<1> 执行命令 执行的操作,比如切换数据库,查询表等操作
string 参数 命令相应的参数

Img

(二)执行命令 🔗

执行命令:用于标识当前请求消息的类型,例如切换数据库(0x02)、查询命令(0x03)等,执行命令如下:

类型值 命令 功能 关联函数
0x00 COM_SLEEP (内部线程状态) (无)
0x01 COM_QUIT 关闭连接 mysql_close
0x02 COM_INIT_DB 切换数据库 mysql_select_db
0x03 COM_QUERY SQL查询请求 mysql_real_query
0x04 COM_FIELD_LIST 获取数据表字段信息 mysql_list_fields
0x05 COM_CREATE_DB 创建数据库 mysql_create_db
0x06 COM_DROP_DB 删除数据库 mysql_drop_db
0x07 COM_REFRESH 清除缓存 mysql_refresh
0x08 COM_SHUTDOWN 停止服务器 mysql_shutdown
0x09 COM_STATISTICS 获取服务器统计信息 mysql_stat
0x0A COM_PROCESS_INFO 获取当前连接的列表 mysql_list_processes
0x0B COM_CONNECT (内部线程状态) (无)
0x0C COM_PROCESS_KILL 中断某个连接 mysql_kill
0x0D COM_DEBUG 保存服务器调试信息 mysql_dump_debug_info
0x0E COM_PING 测试连通性 mysql_ping
0x0F COM_TIME (内部线程状态) (无)
0x10 COM_DELAYED_INSERT (内部线程状态) (无)
0x11 COM_CHANGE_USER 重新登陆(不断连接) mysql_change_user
0x12 COM_BINLOG_DUMP 获取二进制日志信息 (无)
0x13 COM_TABLE_DUMP 获取数据表结构信息 (无)
0x14 COM_CONNECT_OUT (内部线程状态) (无)
0x15 COM_REGISTER_SLAVE 从服务器向主服务器进行注册 (无)
0x16 COM_STMT_PREPARE 预处理SQL语句 mysql_stmt_prepare
0x17 COM_STMT_EXECUTE 执行预处理语句 mysql_stmt_execute
0x18 COM_STMT_SEND_LONG_DATA 发送BLOB类型的数据 mysql_stmt_send_long_data
0x19 COM_STMT_CLOSE 销毁预处理语句 mysql_stmt_close
0x1A COM_STMT_RESET 清除预处理语句参数缓存 mysql_stmt_reset
0x1B COM_SET_OPTION 设置语句选项 mysql_set_server_option
0x1C COM_STMT_FETCH 获取预处理语句的执行结果 mysql_stmt_fetch

(三)Wireshark数据流分析 🔗

下面我们向MySQL发送一条SELECT * FROM user;查询语句,使用Wireshark抓包软件查看具体的请求内容。点击Request Query可以看到从Frame物理层到MySQL Protocol应用层各层的详细内容。点击MySQL Protocol可以看到传输的十六进制的内容,以及它的ASCII码。

Img

十六进制数据包内容: 160000000353454c454354202a2046524f4d206075736572603b

Wireshark抓包软件中的Packet LengthPacket Number中的值22、0分别就是payload_length sequence_idRequest Command Query内是具体的包内容payload。包头中的Packet LengthPacket Number总共占用四个字节,去除包头后的消息体内容: 0353454c454354202a2046524f4d206075736572603b

SELECT是条SQL查询请求,通过执行命令知道为0x03,客户端命令请求报文:

具体包内容的长度 + 包序列id + 执行命令 + 参数
160000 + 00 + 03 + 53454c454354202a2046524f4d206075736572603b

报文结构:

Img