Mysql系列(2)-MySQL网络协议基础分析

引言

阅读本文之前你需要对网络协议需要有基本的了解,比如两台机子之间的数据是如何通信的,硬件层可以暂时不需了解,但网络层和传输层的协议要有一定的理解,比如IP数据包,TCP/IP协议,UDP协议等相关概念,有了这些基础,有利于你阅读本文。

背景

在历史悠久的时代,数据库只作为单机存储,也不怎么需要与程序进行交互的时候的首,它的网络通信并不是那么重要,但随着时代的发展,数据库不再只是单纯的作为一个数据的仓库了,它需要提供与外界的交互,比如远程连接,程序操作数据库等,这时候一份规范的网络通信的协议就非常重要了,比如它是如何校验权限,如何解析SQL语句,如何返回执行结果都需要用到相应的协议,很多时候我们并不需要接触这些内容,因为它太底层了,我们直接使用把它们封装好的第三方包就可以了,为什么还要去学习它的网络协议呢?确实对于一开始学习编程的人来说,这有点操之过急,反而有时候会适得其反,但当你对这一方面有了一定的了解之后,你便会迫不及待得想去探索更深层的奥秘,去了解并学习我们平常用的第三方类库是怎么去实现,明白它的底层原理,甚至对一些莫名其妙的bug也不会再害怕。

MySQL连接方式

分析协议,我们首先要了解如何与数据库连接,说到MySQL连接方式,大家突然可能有点懵,其实它一直伴随着我们,比如我们第一次装数据库完成后执行的第一次登录,比如你没有设置密码:

mysql –uroot
 
这是最基本的一种数据库连接方式,那么MySQL连接方式到底有几种呢?到MySQL5.7为止,总共有五种,分别是TCP/IP,TLS/SSL,Unix Sockets,Shared Memory,Named pipes,下面我们就来看看这五种的区别:
 
方式 默认开启 支持系统 只支持本机 如何开启 参数配置
TCP/IP 所有系统 --skip-networking=yes/no --port  --bind-address
TLS/SSL 所有系统(基于tcp/ip之上) --ssl=yes/no --ssl-* options
Unix Sockets 类Unix系统 设置--socket=<empty>来关闭 --socket=socket path
Shared Memory Windows系统 --sharet-memory=on/off

--shared-memory-base-name=<name>

Named pipes Windows系统 --enable-named-piped=on/off --socket=<name>
 
 
从上表中我们可以清晰看出每种连接方式的区别,接下里我会具体说明几种连接是怎么操作的,由于我的机子是Mac OS系统,这里只模拟非Windows系统下的三种方式,因为这三种方式都是默认开启的,我们不需要进行任何配置:
 

1.Unix Sockets:

mysql –uroot
 
若你在本机使用这种方式连接MySQL数据库的话,它默认会使用Unix Sockets。
 
 

2.TCP/IP:

mysql --protocol=tcp -uroot
mysql -P3306 -h127.0.0.1 –uroot
 
连接的时候我们指定连接协议,或者指定相应的IP及端口,我们的连接方式就变成了TCP/IP方式。
 
 

3.TLS/SSL:

mysql --protocol=tcp -uroot --ssl=on
mysql -P3306 -h127.0.0.1 -uroot --ssl=on
 

上表说过,TLS/SSL是基于TCP/IP的,所以我们只需再指定打开ssl配置即可。

然后我们可以通过以下语句来查询目前数据库的连接情况:

SELECT DISTINCT connection_type from performance_schema.threads where connection_type is not null
 

那么我们如何选择连接方式呢?个人总结了以下几个原则:

  • 若是你能确定程序和数据库在同一台机子(类Unix系统)上,推荐使用Unix Sockets,因为它效率更高;
  • 若数据库分布在不同的机子上,且能确保连接安全或者安全性要求不是那么高,推荐使用TCP/IP,反之使用TLS/SSL;
 
 

MySQL数据包

通信中最重要的就是数据,那么程序是如何和MySQL Server进行通信,并交互数据的呢?比如如何验证账户,发送查询语句,返回执行结果等,我先画一个流程图来模拟一下整个过程,帮助大家理解:

3120625295-5a1aa4252b897_articlex

整个过程相对来说还是比较清晰的,我们对连接请求和断开请求不需要过分关心,只需要了解这一点就可以了,重要的是其他几点,那么在这几步中,数据是怎么进行交互的呢?

其实主要就是两步,Client将执行命令编码成Server要求的格式传输给Server端执行,Server端将执行结果传输给Client端,Client端再根据相应的数据包格式解析获得所需的数据

猜你喜欢

转载自www.cnblogs.com/brucetang/p/9822231.html
今日推荐