澳门新萄京官方网站-www.8455.com-澳门新萄京赌场网址

详解Mysql通讯协议,mysql交互协议解析

2019-10-30 作者:数据库网络   |   浏览(67)

mysql交互公约是开拓mysql周围组件常用的构和,如JDBC,libmysql等等。

详解Mysql通信左券,mysql通信协议

1.Mysql的总是方式

要打听Mysql的通信左券,首先必要通晓是以哪个种类连接格局去老是Mysql服务器的;Mysql的主要连接情势包蕴:Unix套接字,内存分享,命名管道,TCP/IP套接字等。

1.1Unix套接字

在Linux和Unix碰到下,能够使用Unix套接字实行Mysql服务器的连接;Unix套接字其实不是三个互连网公约,只可以在顾客端和Mysql服务器在同黄金时代台微型Computer上才得以行使,使用办法也很简短:

[email protected] ~]# mysql -uroot -proot
mysql> show variables like 'socket';
 --------------- --------------------------- 
| Variable_name | Value      |
 --------------- --------------------------- 
| socket  | /var/lib/mysql/mysql.sock |
 --------------- --------------------------- 
1 row in set (0.00 sec)

如上命令查询Unix套接字文件的位置;

1.2命名管道和内存分享

在window系统中型客车户端和Mysql服务器在同等台Computer上,能够使用命名管道和分享内存的情势,

命名管道开启:–shared-memory=on/off;

分享内部存款和储蓄器开启:–enable-named-pipe=on/off;

1.3TCP/IP套接字

在任何系统下都得以利用的章程,也是应用最多的延续格局,本文要介绍的简报公约也是基于此一而再形式的,上面通过tcpdump对TCP/IP套接字有一个开端的打听:

服务器端:

[[email protected] ~]# tcpdump port 3306
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on venet0, link-type LINUX_SLL (Linux cooked), capture size 65535 bytes

劳务器端监听3306端口(也正是Mysql的端口);

详解Mysql通讯协议,mysql交互协议解析。客户端:

C:Usershui.zhao>mysql -h64.xxx.xxx.xxx -uroot -proot
mysql> exit
Bye

客商端连接服务器,然后断开连接,那个时候观看服务器的监听结果日志:

[[email protected] ~]# tcpdump port 3306
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on venet0, link-type LINUX_SLL (Linux cooked), capture size 65535 bytes
02:06:25.442472 IP 153.3.251.202.33876 > root.mysql: Flags [S], seq 27289263, win 8192, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0
02:06:25.442763 IP root.mysql > 153.3.251.202.33876: Flags [S.], seq 2014324548, ack 27289264, win 14600, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
02:06:25.617449 IP 153.3.251.202.33876 > root.mysql: Flags [.], ack 1, win 256, length 0
02:06:29.812946 IP root.mysql > 153.3.251.202.33876: Flags [P.], seq 1:57, ack 1, win 115, length 56
02:06:29.992362 IP 153.3.251.202.33876 > root.mysql: Flags [P.], seq 1:63, ack 57, win 256, length 62
02:06:29.992411 IP root.mysql > 153.3.251.202.33876: Flags [.], ack 63, win 115, length 0
02:06:29.992474 IP root.mysql > 153.3.251.202.33876: Flags [P.], seq 57:68, ack 63, win 115, length 11
02:06:30.166992 IP 153.3.251.202.33876 > root.mysql: Flags [P.], seq 63:100, ack 68, win 256, length 37
02:06:30.167109 IP root.mysql > 153.3.251.202.33876: Flags [P.], seq 68:158, ack 100, win 115, length 90
02:06:30.536298 IP 153.3.251.202.33876 > root.mysql: Flags [.], ack 158, win 256, length 0
02:06:34.568611 IP 153.3.251.202.33876 > root.mysql: Flags [P.], seq 100:105, ack 158, win 256, length 5
02:06:34.568620 IP 153.3.251.202.33876 > root.mysql: Flags [F.], seq 105, ack 158, win 256, length 0
02:06:34.568751 IP root.mysql > 153.3.251.202.33876: Flags [F.], seq 158, ack 106, win 115, length 0
02:06:34.743815 IP 153.3.251.202.33876 > root.mysql: Flags [.], ack 159, win 256, length 0

[S]:SYN发起连接标记,[P]:PUSH传送数据标记,[F]:FIN关闭连接标志,[.]:表示料定包;

能够概况看出流程:创立tcp连接,顾客端和Mysql服务器创立连接通信,关闭tcp连接;

[S][S.][.]这个数据包表示tcp连接的三回握手;

[F.][F.][.]那多少个数据包表示tcp连接的七回挥手;

中间的多个[P.][.]其实就是客商端和Mysql服务器创设连接发送的商讨数据包。

2.左券剖判

Mysql协议被用在Mysql Clients和Mysql Server通信的时候,具体有以下多少个情景:顾客端和服务器举行连接,Mysql代理以致着力备份;

MySQL客商端与服务器的交互首要分为三个阶段:Connection Phase(连接阶段大概叫认证阶段)和Command Phase(命令阶段);

结缘tcpdump的输出,客户端和劳务器端通信的万事流程大概如下:

1.建立tcp连接三次握手;
2.与Mysql服务器建立连接,即Connection Phase(连接阶段或者叫认证阶段);
 s->c:发送握手初始化包(a Initial Handshake Packet)
 c->s:发送验证包(authentication response)
 s->c:服务器发送认证结果包
3.认证通过之后,服务器端接受客户端的命令包,发送相应的响应包,即Command Phase(命令阶段);
4.断开连接请求exit命令;
5.四次挥手tcp断开连接;

2.第11中学坚类型

在一切合同中的基本项目:整数型和字符串型;

2.1.1整数型

分成两种类型Fixed-Length Integer Types和Length-Encoded Integer Type;

Fixed-Length Integer Types:

一个一定长度的无符号整数将其值存储在生龙活虎多级字节中,具体固定字节数可以是:1,2,3,4,6,8;

Length-Encoded Integer Type:

储存须要的字节数决计于数值的尺寸,具体可参考如下:

1个字节:0<=X<251;

2个字节:251<=X<2^16;

3个字节:2^16<=X<2^24;

9个字节:2^24<=X<2^64;

2.1.2字符串型

分成5种档期的顺序包含,FixedLengthString,NullTerminatedString,VariableLengthString,LengthEncodedString和RestOfPacketString;

FixedLengthString:固定长度的字符串具备已知的硬编码长度,二个例证是E中华VOdyssey_Packet的SQL状态,它总是5个字节长;
NullTerminatedString:以遭遇Null(字节为00)结束的字符串;

VariableLengthString:可变字符串,字符串的长短由另多个字段决定或在运维时总括,比方int value,int为长度,value为钦命长度的字节数;

LengthEncodedString:以描述字符串长度的长度编码的莫西干发型作为前缀的字符串,是VariableLengthString钦定的int value情势;

RestOfPacketString:假诺四个字符串是数据包的结尾四个组件,它的长短能够从总体数据包长度减去当前岗位来计量;

2.2骨干数据包

假使MySQL顾客端或服务器想要发送数据,则:

每种数据包大小不可能凌驾2^24字节(16MB);

在各种数据块后边加上多个数据岳阳;

包格式如下:

int<3>:具体包内容的长度;除去int<3> int<1>=4字节长度;
int<1>:sequence_id随每个数据包递增,并可能环绕。 它从0开始,在命令阶段开始一个新的命令时重置为0;
string<var>:具体数据内容,也是int<3>指定的长度;

例如:

01 00 00对应int表示具体数目内容的长度为1个字节;

00对应int表示sequence_id;

01对应string前面内定的数码内容为1个字节。

2.3报文类型

能够分成多个大类:登入认证报文,顾客端诉求报文以至劳动器端再次回到报,基于mysql5.1.73(mysql4.1未来的版本)

2.3.1报到认证报文

重大在互相的印证阶段,由上文中能够知晓一同分为四个品级:Handshake Packet,authentication response以致结果包,这里最首要剖析前五个包;

2.3.1.1 Handshake Packet

1字节:协议版本号
NullTerminatedString:数据库版本信息
4字节:连接MySQL Server启动的线程ID
8字节:挑战随机数,用于数据库认证
1字节:填充值(0x00)
2字节:用于与客户端协商通讯方式
1字节:数据库的编码
2字节:服务器状态
13字节:预留字节
12字节:挑战随机数,用于数据库认证
1字节:填充值(0x00)

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

[[email protected] ~]# tcpdump port 3306 -X
......
03:20:34.299521 IP root.mysql > 153.3.251.202.44658: Flags [P.], seq 1:57, ack 1, win 115, length 56
 0x0000: 4508 0060 09f1 4000 4006 c666 43da 9190 E..`[email protected]@..fC...
 0x0010: 9903 fbca 0cea ae72 bb4e 25ba 21e7 27e3 .......r.N%.!.'.
 0x0020: 5018 0073 b1e0 0000 3400 0000 0a35 2e31 P..s....4....5.1
 0x0030: 2e37 3300 4024 0000 5157 4222 252f 5f6f [email protected]$..QWB"%/_o
 0x0040: 00ff f708 0200 0000 0000 0000 0000 0000 ................
 0x0050: 0000 0032 4a5d 7553 7e45 784f 627e 7400 ...2J]uS~ExOb~t.

包的总参谋长度是56,减去int<3> int<1>4字节=52字节,对应的十九进制就是34;int<3>十七进制为3400 00象征包内容长度,int<1>十二进制为00意味着sequence_id;后续的从头到尾的经过正是包体内容共52字节,0a对应的十进制是10,全数合同号版本是10;后续的数据库版本音讯遇到00终了,35 2e31 2e37 33对应的5.1.73,正是当前应用的数据库版本;4024 0000对应十进制是6436;08代表数据库的编码;0200意味着服务器状态;后续的13对00为留住字节;最终的12个字节是挑衅随机数和填充钱。

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)[email protected]
 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,前边18个字节就是加密后的密码;可选的数据库名称不设有。

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?[email protected]
 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 [email protected]@..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 [email protected]@.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通信左券相关的全体内容,大家在学习的时候如果还会有其他不知底的地点能够留言给我们,多谢您对帮客之家的扶植。

1.Mysql的总是形式要打听Mysql的报纸发表协议,首先要求掌握是以哪类连接情势去老是Mysql服务器的;Mysql的重要...

在那大家要意识到mysql交互合同其实是半双工的并行契约,至于缘何,这里就先挖个小坑,以往再填。

在探讨mysql交互公约的格式早前,大家要清理叁个小标题,正是mysql交互合同会用到的着力数据类型。

1.整数门类

这里的整数类型能够用来代表mysql数据类型中的整数类型、日期时间项目、DOUBLE、FLOAT类型、比特类型以至枚举类型等等。

全数的mysql整数类型都以小端的,那是互联网数据的老办法。即对于16进制数0x12345678,在累积时会形成0x78563412

那么这里的卡尺头数据类型有:int<len>(当中len = 1,2,3,4,6,8)以至可变的大背头类型int<lenenc>

(1)int<len>是一定长度为len字节的寸头数据,如int<3>表示数字3的话,会以小端 0x030000代表。

(2)int<lenenc>是可变长度类型的板寸,这种字符的尺寸能够是1, 3, 4, 9。

  大家设要代表的数值是n

      1)当 n < 251时,int<lenenc>会以int<1>表示。

  2)当251 <= n < 2^16时,int<lenenc>会以0xfc int<2>表示。

  3)当2^16 <= n < 2^24时,int<lenenc>会以0xfd int<3>表示。

  4)当2^24 <= n < 2^64时,int<lenenc>会以0xfe int<8>表示。

  那就象征如果大家相遇int<lenenc>类型,大家供给先读取第叁个数值type来判别

  1)当type < 0xfb时,就以为读取的数是type。

  2)当type == 0xfc时,就读取前边的int<2>,int<2>才是一丝不苟的数值。

  3)当type == 0xfd时,就读取前面包车型地铁int<3>,int<3>才是屏息凝视的数值。

  4)当type == 0xfe时,就读取前边的int<8>,int<8>才是开诚布公的数值。

 那么当type为0xff和0xfb是什么?那边挖坑在这之后再填。

   能够剧透下的是:

   0xff在mysql交互公约中貌似代表某贰个动作错误,

   如发送一个布置命令退步后会有这种回复现身。

   而0xfb代表NULL,正是mysql插入值往往会是空值,指的便是NULL

2.字符串类型

这里的字符串类型能够用来表示mysql的高精度小数类型、字符串类型、大比特类型以至大整数类型等等。

此间的字符串类型首倘若

(1)string<len>正是长度为len的字符串。

(2)string<NUL> 正是string '0x00',这里的'0x00'是用作结尾符的。

(3)string<lenenc>正是int<lenenc> string,int<lenenc> 代表字符串的尺寸。

(4)string<EOF>正是在贰个mysql交互包结尾处现身的字符串。换言之,那个字符串是贰个mysql交互包的末梢贰个字符串。

(5)string<fix>和string<var>差不离用不到。

3.mysql包为主格式

mysql包长度 int<3> mysql包序号 int<1> mysql包内容 string<len>

 

 

mysql包长度正是mysql包内容的长度,不把大庆即包长度和包序号计入mysql包长度中,经常是int<3>,假使超越长度2^24-1,mysql会进展分包,如2^24-1,分成下述三个包。

0xfffffff 0x00 mysql包内容
0x000000 0x01 mysql包内容

 

 

 

mysql包序号正是八个安然无恙流程的发包序号,正是由该流程的产生的率先包是从0x00开首的,未来无论回复的包照旧包罗的包都会在上头加1,直到包序号达到0xff,再从0x001最早计数。

比方笔者要查询语句"select * from 某表",那么作者会发送出第多个带有查询语句"select * from 某表"的mysql包给mysql数据库,那一个包的序号是0x00,这时候,流程起头,将来的mysql数据库回复的包都会从0x01起始计数,直到回复截至,这时候,该流程就得了了。笔者要询问新的说话就表示新的流程带头,mysql包序号计数重新从0x00开端。

 参照他事他说加以考察网站 

             

本文由澳门新萄京官方网站发布于数据库网络,转载请注明出处:详解Mysql通讯协议,mysql交互协议解析

关键词: