准备:
(一)客户端命令请求报文 🔗
首先前面的四个字节是包头,其中前三位代表packet数据长度,第四位是包序列号。以下是客户端命令请求报文的四字节后的内容。
Type | Name | Description |
---|---|---|
int<1> | 执行命令 | 执行的操作,比如切换数据库,查询表等操作 |
string | 参数 | 命令相应的参数 |
(二)执行命令 🔗
执行命令:用于标识当前请求消息的类型,例如切换数据库(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码。
十六进制数据包内容:
160000000353454c454354202a2046524f4d206075736572603b
Wireshark
抓包软件中的Packet Length
和Packet Number
中的值22、0分别就是payload_length
sequence_id
。Request Command Query
内是具体的包内容payload
。包头中的Packet Length
和Packet Number
总共占用四个字节,去除包头后的消息体内容:
0353454c454354202a2046524f4d206075736572603b
SELECT
是条SQL查询请求,通过执行命令知道为0x03
,客户端命令请求报文:
具体包内容的长度 + 包序列id + 执行命令 + 参数
160000 + 00 + 03 + 53454c454354202a2046524f4d206075736572603b
报文结构: