免费申请下域名的网站:弄懂mysql:mysql的通讯协议
本文摘要: 我准备从mysql的完成出发,将mysql好好了解一下,从他的逻辑结构一层一层出发,感受一下,所以再学第一层之前,要先对mysql全体的逻辑结构有一个开始知道mysql逻辑架构全体来说,MySql的逻辑架构分红三个部分,这个之前我认为提
我准备从mysql的完成出发,将mysql好好了解一下,从他的逻辑结构一层一层出发,感受一下,所以再学第一层之前,要先对mysql全体的逻辑结构有一个开始知道

mysql逻辑架构

全体来说,MySql的逻辑架构分红三个部分,这个之前我认为提到过

1)客户端:主要是建立连接的过程,交互的过程

2)核心效劳

3)存储引擎

这个可能比较笼统,我们结合MySql的查询过程,结合着进行学习

MySql查询过程

这个图其实就是在第一个的基础上,进行的更加详尽的划分,因为上面只是大致画出了逻辑架构,可是这个就展示了一整个过程。

我说一下大致的过程:

1)客户端向效劳端发起一条请求

2)效劳端先查看查询缓存,假如射中缓存,则直接返回成果,不然交给下一阶段

3)效劳器进行SQL解析,预处理,在通过查询优化构成对应的执行方案

4)mysql依据执行方案,调用API给存储引擎,进行数据的读取和存储

5)将成果返回给客户端,并缓存查询成果

大致全体的步骤就是这样的,我们要把每一步都尽量的深化考虑下,我可能考虑的有欠缺,欢迎我们进行留言

今天先不深化数据库里边,先将mysql的通讯协议搞清楚,也就是执行sql语句之前都干了什么

要了解mysql通讯协议,就要知道mysql是通过什么连接的,这个怎么考率的,mysql是应用,我们需要完成的是mysql客户端与效劳端进行通讯,这里比如http,所以在客户端找到效劳端之前,就需要他们所处的物理机先建立起连接,就好像http建立连接之前,需要tcp先建立连接。

Mysql的主要连接方式包括:Unix套接字,内存同享,命名管道,TCP/IP套接字等。

有的同学可能问了,怎么这么多方式,那我用的哪种呢,或者是我应该用哪种呢,其实他们其实不是等价的

Unix套接字:

在Linux和Unix环境下,能够使用Unix套接字进行Mysql效劳器的连接;Unix套接字其实不是一个网络协议,只能在客户端和Mysql效劳器在同一台电脑上才能够使用

命名管道和内存同享

在window体系中客户端和Mysql效劳器在同一台电脑上,能够使用命名管道和同享内存的方式,

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

同享内存开启:–enable-named-pipe=on/off;

TCP/IP套接字

任何体系下都能够使用的方式,也是使用的最多的方式,我主要介绍的也是这种方式

其实熟悉操作体系的朋友应该能体会出来,像前两种,因为客户端和效劳端在同一台主机上,也就是一台主机的两个应用,所以这也就是进程间通讯的方式,而在不同的主机上就不一样了,就需要网络,tcp/ip建立了。

mysql通讯过程

了解了mysql基于的就是tcp的底层协议,所以必定,需要阅历tcp的三次握手,没错第一步就是tcp的三次握手(因为这里不是重点,就不详细说明,不太清楚的同学,可以查看我network的相关博客),建立连接之后就能够发送sql命令了吗,当然不能,细心的同学会发现,我用客户端登陆的时分,是需要用户名,密码的,这才是真实的mysql客户端与效劳端的交互过程,之前还没有到应用层,下面就说一下,交互过程

mysql客户端与效劳端的交互过程

主要分为两部分:握手认证阶段,命令执行阶段

留意哦,这个握手和上面过的握手不一样哦

1.1握手认证阶段

握手认证阶段为客户端与效劳器建立连接后进行,交互过程如下:

效劳器 -> 客户端:握手初始化音讯

客户端 -> 效劳器:登陆认证音讯

效劳器 -> 客户端:认证成果音讯

1.2命令执行阶段

客户端认证成功后,会进入命令执行阶段,交互过程如下:

客户端 -> 效劳器:执行命令音讯

效劳器 -> 客户端:命令执行成果

不知道我们看了有无发生一些问题,那我就我的一些问题说一下

为何还要进行三次握手认证

因为tcp三次握手,只是将客户端与效劳端建立起了连接,然后通过端口知道我要拜访的是mysql这个效劳,可是mysql它不同于http,只需你知道url就可以得到一个呼应,mysql有必要登陆后你才干进行操作。所以这个过程最重要的就是验证客户端的登陆权限。

为何是效劳端主动给客户端发送认证呢?

http不是说只有客户端主动与效劳端进行请求,效劳端不是不能在没有请求的状况下主动进行呼应吗?

首要,我们也不要堕入误区,在进行认证的这个交互中,实践上客户端与效劳端还没有进行任何事务上的往来,只是进行一个认证,所以与上面说的http的不同,假如细心的话你会发现,认证成功后,在命令执行阶段,mysql这种通讯方式是与http十分类似的,在没有请求的状况下,效劳端的mysql也不会主动给你发送任何数据,所以这里不要稠浊。

再说为何效劳端先发送,那肯定是因为他有不能不发送的道理,所以我们就需要了解一下,他发送的是什么东西。

mysql报文

主要分红三个部分:登录认证报文,客户端请求报文以及效劳器端返回报,基于mysql5.1.73(mysql4.1今后的版本)

登陆认证报文

1)握手初始化报文(效劳端->客户端)

协议版本号:效劳端所使用的mysql协议的版本号

效劳器线程ID:效劳端为此客户端所创建的线程的ID

应战随机数:MySQL数据库用户认证选用的是应战/应对的方式,效劳器生成该应战数并发送给客户端,由客户端进行处理并返回相应成果,然后效劳器查看是否与预期的成果相同,从而完成用户认证的过程。

**效劳器权能标志:**用于与客户端协商通讯方式

这个我略微解释下,他这个只需发送的就是,我效劳端能承受的通讯方式是什么样的,我们下面详细说一下

登陆认证报文(客户端 -> 效劳器)

客户端权能标志客户端收到效劳器发来的初始化报文后,会对效劳器发送的权能标志进行修正,保留本身所支撑的功用,然后将权能标返回给效劳器,从而保证效劳器与客户端通讯的兼容性。

音讯长度客户端发送请求时所支撑的最大音讯长度值

字符编码表明通讯过程当中使用的字符编码,与效劳器在认证报文中发送的相同

用户名客户端登陆的用户名

应战认证数据:客户端用户密码使用效劳器发送的应战随机数进行加密后,生成应战认证数据,返回给效劳器用于效劳端的认证

效劳端认证成果报文(效劳端->客户端)

这个就比较好了解了,效劳端主要验证,用户名,密码是否正确存在,假如都是正确的,就返回ok报文,过错的话就是ERROR报文

好了,我相信我们应该都有一定的了解了,那么现在再想一下那个问题是否是觉得对错常有道理的,之所以效劳端先发送一个握手以前,就是提前告诉一下客户端,你要遵循的一些协议

【免责声明】本文仅代表作者或发布者个人观念,不代表(www.lmnkf.cn)及其所属公司官方发声,对文章观念有疑义请先联络作者或发布者自己修正,若内容触及侵权或违法信息,请先联络发布者或作者删除,若需我们协助请联络平台管理员,Emailcxb5918(本平台不支撑其他投诉反馈渠道,谢谢合作)。若需要学习以上相关常识请到巨推学院观看视频教程,网站地址www.tsllg.cn。

相关内容