mysql的通信协议

mysql逻辑架构

整体来说,MySql的逻辑架构分成三个部分

image.png

1)客户端:主要是建立连接的过程,交互的过程
2)核心服务
3)存储引擎

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

MySql查询过程

image.png

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

大致的过程

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服务器在同一台电脑上才可以使用

TCP/IP套接字

任何系统下都可以使用的方式,也是使用的最多的方式,我主要介绍的也是这种方式,其实熟悉操作系统的朋友应该能体会出来,像前两种,因为客户端和服务端在同一台主机上,也就是一台主机的两个应用,所以这也就是进程间通信的方式,而在不同的主机上就不一样了,就需要网络,需要建立连接。

mysql通信过程

了解了mysql基于的就是tcp的底层协议,所以必然,需要经历tcp的三次握手,没错第一步就是tcp的三次握手。建立连接之后就可以发送sql命令了吗,当然不能,细心的同学会发现,我用客户端登陆的时候,是需要用户名,密码的,这才是真正的mysql客户端与服务端的交互过程,之前还没有到应用层,下面就说一下,交互过程

mysql客户端与服务端的交互过程

主要分为两部分:握手认证阶段,命令执行阶段
注意,这个握手和上面过的握手不一样的。

1.1握手认证阶段

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

服务器 -> 客户端:握手初始化消息
客户端 -> 服务器:登陆认证消息
服务器 -> 客户端:认证结果消息

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

客户端 -> 服务器:执行命令消息
服务器 -> 客户端:命令执行结果
image.png
为什么还要进行三次握手认证

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

为什么是服务端主动给客户端发送认证呢?

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

登陆认证报文
1)握手初始化报文(服务端->客户端)

image.png

  • 协议版本号:服务端所使用的mysql协议的版本号
  • 服务器线程ID:服务端为此客户端所创建的线程的ID
  • 挑战随机数:MySQL数据库用户认证采用的是挑战/应答的方式,服务器生成该挑战数并发送给客户端,由客户端进行处理并返回相应结果,然后服务器检查是否与预期的结果相同,从而完成用户认证的过程。
  • 服务器权能标志:用于与客户端协商通讯方式

登陆认证报文(客户端 -> 服务器)

image.png

image.png

  • 客户端权能标志: 客户端收到服务器发来的初始化报文后,会对服务器发送的权能标志进行修改,保留自身所支持的功能,然后将权能标返回给服务器,从而保证服务器与客户端通讯的兼容性。
  • 消息长度: 客户端发送请求时所支持的最大消息长度值
  • 字符编码: 表示通讯过程中使用的字符编码,与服务器在认证报文中发送的相同
  • 用户名: 客户端登陆的用户名
  • 挑战认证数据:客户端用户密码使用服务器发送的挑战随机数进行加密后,生成挑战认证数据,返回给服务器用于服务端的认证

服务端认证结果报文(服务端->客户端)
服务端主要验证,用户名,密码是否正确存在,如果都是正确的,就返回ok报文,错误的话就是ERROR报文

好了,我相信大家应该都有一定的了解了,那么现在再想一下那个问题(为什么是服务端主动给客户端发送认证呢?)是不是觉得是非常有道理的,之所以服务端先发送一个握手过去,就是提前通知一下客户端,你要遵循的一些协议.

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1、TCP状态linux查看tcp的状态命令:1)、netstat -nat 查看TCP各个状态的数量2)、lso...
    北辰青阅读 13,191评论 0 11
  • 第一章 引言和网络编程基础知识 1.1 分别简述OSI参考模型和TCP/IP模型,并阐述他们之间的对应关系 1.2...
    V0W阅读 10,844评论 0 9
  • TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据。关于TC...
    字节码阅读 4,608评论 0 3
  • 今天中午姑父急匆匆的发微信消息给我,说我大姨和表姐失联一周了。吓得我们一家人感觉给他想办法。结果我问了我表姐的好朋...
    泽蒙阅读 952评论 0 0
  • 海纳百川,有容乃大。宽容是一种高尚的品质,一个懂得宽容的人会营造出一片祥和友善的天空,他同样会受到人们的尊重...
    WLCmq阅读 2,767评论 0 0

友情链接更多精彩内容