上表就是全部Handshake packet的┞封个包构造,属性的含义以及规范都有响应的解释,下面是我本机解析的某次连接数据库的Handshake packet包,仅供参考:
- {protocolVersion=10, serverVersion='5.7.13', threadId=4055, scramble=[49, 97, 80, 3, 35, 118, 45, 15, 5, 118, 9, 11, 124, 93, 93, 5, 31, 47, 111, 109, 0, 0, 0, 0, 0], serverCapabilities=65535, serverLanguage=33, serverStatus=2}
Auth packet
Auth packet是由Client向Server发送的认证包,用于验证数据库账户登录,响应内容的格局:
相对包内容的地位 长度(字节) 名称 描述 0 4 协定协商 用于与办事端协商筒?方法 4 4 消息最长长度 客户端可以发送或接收的最长长度,0表示不做任何限制 8 1 字符编码 客服端字符编码方法 9 23 保存字节 将来可能会用到,预留字节,用0代替
- 32 |不定| 认证字符串 | 重要有三部分内容<br> <li>用户名:NullTerminatedString格局编码</li><li>加密后的暗码:LengthEncodedString格局编码</li><li>数据库名称(可选):NullTerminatedString格局编码</li>
顾名思义Error 包就是当出现缺点的时刻返回的信息,比如账户验证不经由过程,萌芽敕令不合法,非空字段未指定值等相干操作,Server端都邑向Client端发送Error 包。
这部分内容是由客户端本身生成,所以说如不雅我们如不雅要写一个法度榜样连接数据库,那么这个包就得按照这个格局,不然办事端将会无法辨认。
敕令履行阶段
Integer(整型)
在我们精确连接数据库后,我们就要履行响应的敕令了,比如切换数据库,履行CRUD操作等,这个阶段重要分为两步,Client发送敕令(上文已经给出,下面不再评论辩论),Server端接收敕令履行响应的操作,我们重要关怀Server端向我们发送数据包,可分为4类和一个最基本的报文构造Data Field:
- Data Field:包数据的一个基本构造;
- OK包(包含PREPARE_OK):Server端发送精确处理信息的包,包头标识为0x00;
- Error包: Server端发送缺点信息的包,包头标识为0xFF;
- EOF包:用于Server向Client发送停止包,包头标识为0xFE;
- Result Set包:用于Server向Client发送的萌芽结不雅包;
Data Field
Data Field是Server回应包里的一个核心,主如果数据的一种编码构造,跟我之前讲的LengthEncodedInteger和LengthEncodedString很类似,也重要分为三个部分
最小数据长度(包含) 最大年夜数据长度(不包含) 数据长度 格局 1 251 1个字节 1字节 + 具体数据 251 2^16 2个字节 0xFC + 2个字节数据长度 + 具体数据 2^16 2^24 4个字节 0xFD + 4个字节数据长度 + 具体数据 2^24 2^64 8个字节 0xFE + 8个字节数据长度 + 具体数据 NULL NULL 0个字节 0xFB要留意的一点是如不雅出现0xFB(251)开首解释这个数据对应的是MySQL中的NULL。
OK 包
通俗的OK包(PREPARE_OK包后面会讲到)会在以下几种情况下产生,由Server发送给响应的接收方:
- COM_PING: 连接或者测试数据库
- COM_QUERY: 不须要萌芽结不雅集的操作,比如INSERT, UPDATE, or ALTER TABLE
- COM_REFRESH: 数据刷新
- COM_REGISTER_SLAVE: 注册大年夜办事器
OK 包的重要构造:
相对包内容的地位 长度(字节) 名称 描述 0 1 包头标识 0x00 代表这是一个OK 包 1 rows_len 影响行数 响应操作影响的行数,比如一个Update操作的记录是5条,那么这个值就为5 1 + rows_len id_len 自增id 插入一笔记录时,如不蚜?鲈增id的话,返回的id值 1 + rows_len + id_len 2 办事器状况 用于表示办事器状况,比如是否是事务模式或者主动提交模式 3 + rows_len + id_len 2 警告数 前次敕令引起的警告数 5 + rows_len + id_len msg_len 额外信息 此次操作的一些额外信息下面是我本机解析的某次精确连接数据库后的OK packet包,仅供参考:
- OK{affectedRows=0, insertId=0, serverStatus=2, message=
推荐阅读
CTO练习营 | 12月3-5日,深圳,是时刻成为优良的技巧治理者了alter user user() identified by 'admin'; 这几天因为做项目须要,要应用MySQL数据库,应用的是MySQL Community Server 5.7.>>>详细阅读
本文标题:关于MySQL的网络协议分析
地址:http://www.17bianji.com/lsqh/39379.html
1/2 1