详解Mysql通讯协议


当前第2页 返回上一页

2.3.1.2 Authentication Packet

4字节:用于与客户端协商通讯方式
4字节:客户端发送请求报文时所支持的最大消息长度值
1字节:标识通讯过程中使用的字符编码
23字节:保留字节
NullTerminatedString:用户名
LengthEncodedString:加密后的密码
NullTerminatedString:数据库名称(可选)

使用tcpdump进行监听,输出十六进制日志如下:

03:20:34.587416 IP 153.3.251.202.44658 > root.mysql: Flags [P.], seq 1:63, ack 57, win 256, length 62
 0x0000: 4500 0066 29ee 4000 7006 766b 9903 fbca E..f).@.p.vk....
 0x0010: 43da 9190 ae72 0cea 21e7 27e3 bb4e 25f2 C....r..!.'..N%.
 0x0020: 5018 0100 d8d2 0000 3a00 0001 85a6 0f00 P.......:.......
 0x0030: 0000 0001 2100 0000 0000 0000 0000 0000 ....!...........
 0x0040: 0000 0000 0000 0000 0000 0000 726f 6f74 ............root
 0x0050: 0014 ff58 4bd2 7946 91a0 a233 f2c1 28af ...XK.yF...3..(.
 0x0060: d578 0762 c2e8       .x.b..

包的总长度是62,减去int<3>+int<1>4字节=58字节,对应的十六进制就是3a;int<3>十六进制为3a00 00表示包内容长度;int<1>十六进制为01表示sequence_id;726f 6f74 00是用户名解码后是root;后面是加密后的密码类型是

LengthEncodedString,14对应的十进制是20,后面20个字节就是加密后的密码;可选的数据库名称不存在。

2.4客户端请求报文

int<1>:执行的命令,比如切换数据库
string<var>:命令相应的参数

命令列表:

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

比如:use test;使用tcpdump进行监听,输出十六进制日志如下:

22:04:29.379165 IP 153.3.251.202.33826 > root.mysql: Flags [P.], seq 122:131, ack 222, win 64019, length 9
 0x0000: 4500 0031 3f19 4000 7006 6175 9903 fbca E..1?.@.p.au....
 0x0010: 43da 9190 8422 0cea 42e2 524b 7e18 25c1 C...."..B.RK~.%.
 0x0020: 5018 fa13 a07b 0000 0500 0000 0274 6573 P....{.......tes
 0x0030: 74

包的总长度是9,减去int<3>+int<1>4字节=5字节,对应的十六进制就是05;int<3>十六进制为0500 00表示包内容长度;int<1>十六进制为00表示sequence_id;02对应COM_INIT_DB,后面是test的二进制编码;

2.5服务器响应报文

对于客户端发送给服务器的大多数命令,服务器返回其中一个响应的数据包:OK_Packet,ERR_Packet和EOF_Packet,Result Set;

2.5.1OK_Packet

表示成功完成一个命令,具体格式如下:

int<1>:0x00或0xFEOK包头
int<lenenc>:受影响行数
int<lenenc>:最后插入的索引ID
int<2>:服务器状态
int<2>:告警计数 注:MySQL 4.1 及之后的版本才有
string<lenenc>:服务器消息(可选)

use test;服务器返回的包,使用tcpdump进行监听,输出十六进制日志如下:

22:04:29.379308 IP root.mysql > 153.3.251.202.33826: Flags [P.], seq 222:233, ack 131, win 14600, length 11
 0x0000: 4508 0033 4a0a 4000 4006 867a 43da 9190 E..3J.@.@..zC...
 0x0010: 9903 fbca 0cea 8422 7e18 25c1 42e2 5254 ......."~.%.B.RT
 0x0020: 5018 3908 3b61 0000 0700 0001 0000 0002 P.9.;a..........
 0x0030: 0000 00

包的总长度是11,减去int<3>+int<1>4字节=7字节,对应的十六进制就是07;int<3>十六进制为0700 00表示包内容长度;int<1>十六进制为01表示sequence_id;00表示包头;00表示受影响行数;00表示最后插入的索引ID;0200表示服务器状态;

2.5.2ERR_Packet

表示发生了错误,具体格式如下:

int<1>:0xFF ERR包头
int<2>:错误码
string[1]:Sql状态标识 注:MySQL 4.1 及之后的版本才有
string[5]:Sql状态  注:MySQL 4.1 及之后的版本才有
string<EOF>:错误消息

2.5.3EOF_Packet

以标记查询执行结果的结束:

int<1>:EOF值(0xFE)
int<2>:告警计数 注:MySQL 4.1 及之后的版本才有
int<2>:状态标志位 注:MySQL 4.1 及之后的版本才有

2.5.4Result Set

当客户端发送查询请求后,在没有错误的情况下,服务器会返回结果集(Result Set)给客户端,一共有5个部分:

Result Set Header  返回数据的列数量
Field     返回数据的列信息(多个)
EOF      列结束
Row Data    行数据(多个)
EOF      数据结束

2.5.4.1Result Set Header

Length-Encoded Integer Field结构的数量
Length-Encoded Integer 额外信息

2.5.4.2Field

LengthEncodedString  目录名称
LengthEncodedString  数据库名称
LengthEncodedString  数据表名称
LengthEncodedString  数据表原始名称
LengthEncodedString  列(字段)名称
LengthEncodedString  列(字段)原始名称
int<1>     填充值
int<2>     字符编码
int<4>     列(字段)长度
int<1>     列(字段)类型
int<2>     列(字段)标志
int<1>     整型值精度
int<2>     填充值(0x00)
LengthEncodedString  默认值

2.5.4.3EOF

参考2.5.3EOF_Packet

2.5.4.4Row Data

LengthEncodedString  字段值
......     多个字段值

实例分析,表信息如下:

CREATE TABLE `btest` (
 `id` bigint(20) NOT NULL AUTO_INCREMENT,
 `age` int(11) DEFAULT NULL,
 `name` varchar(255) DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1000 DEFAULT CHARSET=utf8

select * from btest;服务器返回的数据如下:

mysql> select * from btest;
+----+------+---------+
| id | age | name |
+----+------+---------+
| 1 | 10 | zhaohui |
| 2 | 11 | zhaohui |
+----+------+---------+

服务器返回的包,使用tcpdump进行监听,输出十六进制日志如下:

01:54:21.522660 IP root.mysql > 153.3.251.202.58587: Flags [P.], seq 1:196, ack 24, win 115, length 195
 0x0000: 4508 00eb 8839 4000 4006 4793 43da 9190 E....9@.@.G.C...
 0x0010: 9903 fbca 0cea e4db 9dd8 0216 eda6 f730 ...............0
 0x0020: 5018 0073 ca34 0000 0100 0001 0328 0000 P..s.4.......(..
 0x0030: 0203 6465 6604 7465 7374 0562 7465 7374 ..def.test.btest
 0x0040: 0562 7465 7374 0269 6402 6964 0c3f 0014 .btest.id.id.?..
 0x0050: 0000 0008 0342 0000 002a 0000 0303 6465 .....B...*....de
 0x0060: 6604 7465 7374 0562 7465 7374 0562 7465 f.test.btest.bte
 0x0070: 7374 0361 6765 0361 6765 0c3f 000b 0000 st.age.age.?....
 0x0080: 0003 0000 0000 002c 0000 0403 6465 6604 .......,....def.
 0x0090: 7465 7374 0562 7465 7374 0562 7465 7374 test.btest.btest
 0x00a0: 046e 616d 6504 6e61 6d65 0c21 00fd 0200 .name.name.!....
 0x00b0: 00fd 0000 0000 0005 0000 05fe 0000 2200 ..............".
 0x00c0: 0d00 0006 0131 0231 3007 7a68 616f 6875 .....1.10.zhaohu
 0x00d0: 690d 0000 0701 3202 3131 077a 6861 6f68 i.....2.11.zhaoh
 0x00e0: 7569 0500 0008 fe00 0022 00    ui.......".

0328 0000 02对应的是Result Set Header,03表示3个字段;03 6465 66对应的是目录名称的默认值def,03表示后面的字节数为3;04 7465 7374

对应的是数据库名称test;0562 7465 7374对应的是数据表名称btest;0562 7465 7374对应的是数据表原始名称btest;0269 64对应字段名称id;02 6964对应列(字段)原始名称id;0c3f 00对应的是填充值和字符编码;14 0000 00对应的十进制是20表示列(字段)长度;08 0342 00分别表示列(字段)类型,标识,整型值精度;00002个字节为填充值;00为默认值表示空的;

后续的age和name字段同上,不在重复;

0131类型LengthEncodedString对应的字符1就是id的值;0231 30类型LengthEncodedString对应的字符10就是age的值;07 7a68 616f 6875 69类型LengthEncodedString对应的字符zhaohui就是name的值;

以上就是我们给大家整理的关于MYSQL通讯协议相关的全部内容,大家在学习的时候如果还有任何不明白的地方可以留言给我们,感谢你对的支持。

更多相关Mysql内容来自木庄网络博客


标签:Mysql

返回前面的内容

相关阅读 >>

mysql模糊查询语句是什么?

mysql临时表深入理解

mysql5.7导出数据提示--secure-file-priv选项问题的解决方法

怎么完全退出mysql?怎么退出mysql编辑界面?

mysql中min()和least()的区别

mysql 中文乱码解决办法

mysql 客户端不输入用户名和密码直接连接数据库的2个方法

聊聊mysql 中常用的日期相关函数

mysql如何构造慢查询

linux下 mysql oracle 简单使用手册

更多相关阅读请进入《mysql》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...