| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> mysql握手链接,服务端到底发过来了什么? -> 正文阅读 |
|
[大数据]mysql握手链接,服务端到底发过来了什么? |
目录 字符串(以NULL结尾)(Null-Terminated String) 二进制数据(长度编码)(Length Coded Binary) 字符串(长度编码)(Length Coded String) --Row Data 结构 / 二进制Row Data 结构 ?最近工作关系,想能不能增加mysql每次传输数据的行数来提升传输数据性能。 所以最近开始研究mysql的数据传输协议。 mysql客户端与服务端的认证流程连接方式mysql的主要连接方式有几种: SOCKET连接(Linux) 目标 启动选项 默认值 在Linux和Unix环境下,可以使用Unix套接字进行Mysql服务器的连接;Unix套接字其实不是一个网络协议,只能在客户端和Mysql服务器在同一台电脑上才可以使用 PIPE连接(Windows) 目标 启动选项 默认值 在window系统中客户端和Mysql服务器在同一台电脑上,可以使用命名管道的方式, SHARED MEMORY连接(Windows) 目标 启动选项 默认值 在window系统中客户端和Mysql服务器在同一台电脑上,可以使用共享内存的方式, TCP连接(Linux,Windows) 目标 启动选项 默认值 任何系统下都可以使用的方式,也是使用的最多的方式。 其实熟悉操作系统的朋友应该能体会出来,像前两种,因为客户端和服务端在同一台主机上,也就是一台主机的两个应用,所以这也就是进程间通信的方式,而在不同的主机上就不一样了,就需要网络,tcp/ip建立了。 通信过程在生产环境中,常用的肯定是tcp连接方式,不光适配windows和linux,而且能用于多台主机。除非产品抗压需求不高,不然客户端和服务端不会放到一台机子上的。 那么主要来学习mysql使用tcp的连接。 Mysql是一个c/s架构的软件,所以有服务端和客户端。 在使用mysql客户端时,会通过bin目录下的mysql可执行文件启动。 比如使用: ./mysql?-hhost -Pport -uusername -ppassword 。 这时会创建并启动一个新的mysql客户端进程。 使用ps aux|grep mysql 可以查看到: 那么在使用这个命令时,干了哪些事? mysql客户端与服务端通信是基于tcp来连接的,所以第一步就是经历三次握手,建立tcp连接。 在建立好tcp连接后,就开始进行握手认证阶段。 握手认证阶段为客户端与服务器建立连接后进行,交互过程如下: 为什么要进行三次握手认证? 因为tcp三次握手,只是将客户端与服务端建立起了连接,然后通过端口知道我要访问的是mysql这个服务,但是mysql它不同于http,只要你知道url就能得到一个响应,mysql必须登陆后你才能进行操作。所以这个过程最重要的就是验证客户端的登陆权限。 为什么是服务端主动给客户端发送认证呢? http不是说只有客户端主动与服务端进行请求,服务端不是不能在没有请求的情况下主动进行响应吗? 再说为什么服务端先发送,那肯定是因为他有不得不发送的道理,所以我们就需要理解一下,他发送的是什么东西。 第一次握手报文? 基于mysql5.1.73(mysql4.1以后的版本) 第一次握手报文也就是服务端向客户端发送的握手初始化报文。
第二次握手报文第二次握手报文也就是客户端向服务端发送的登录认证报文。
第三次握手报文第三次握手报文就是服务端发给客户端的认证结果。 ?这个就比较好理解了,服务端主要验证,用户名,密码是否正确存在,如果都是正确的,就返回ok报文,错误的话就是ERROR报文。 所以整个客户端和服务端的交互流程如下: ? 服务端->客户端,响应报文来源于mysql的官方文档。 报文结构报文分为消息头和消息体两部分,其中消息头占用固定的4个字节,消息体长度由消息头中的长度字段决定,报文结构如下:
报文数据基本类型每个消息体都是由多个这些基本类型来构建的。 整型值MySQL报文中整型值分别有1、2、3、4、8字节长度,使用小字节序传输。 字符串(以NULL结尾)(Null-Terminated String)字符串长度不固定,当遇到'NULL'(0x00)字符时结束。 二进制数据(长度编码)(Length Coded Binary)数据长度不固定,长度值由数据前的1-9个字节决定,其中长度值所占的字节数不定,字节数由第1个字节决定,如下表:
字符串(长度编码)(Length Coded String)字符串长度不固定,无'NULL'(0x00)结束符,编码方式与上面的 Length Coded Binary 相同。 来大概看一下mysql服务端给客户端的响应流程: ? 当客户端发起认证请求或命令请求后,服务器会返回相应的执行结果给客户端。客户端在收到响应报文后,需要首先检查类型标识符,来区分响应报文的类型。 可以看出,mysql的通用返回包共有几种类型:
下面开始逐个介绍不同的报文类型。? OK响应报文当用户发出的命令成功执行时,会返回一个ok响应报文。 检查当前第一个字节的数据,发现为0x00,那么此时的报文就是一个OK响应报文。 在确定当前报文为OK报文后,之后的结构如下:
ERROR响应报文当用户发出的命令执行报错时,会返回一个ERROR响应报文。 检查当前第一个字节的数据,发现为0xFF,那么此时的报文就是一个ERROR响应报文。 在确定当前报文为ERROR报文后,之后的结构如下:
ERROR的种类非常丰富,且非常具体,我给大家截个图看一下: ?有兴趣了解的可以直接去源码里查看。 EOF响应报文
官方的大概意思就是,EOF_Packet和OK_Packet 都是用来表示一个query的结果的尾包,mysql5.7.5之后就不推荐使用EOF了,推荐使用OK包。 mysql为了和老版本客户端兼容,如果需要使用带EOF标志的OK_Packet,需要客户端连接时声明CLIENT_DEPRECATE_EOF标志。 OK_Packet和EOF_Packet区别方式和包格式如下:
Result Set 响应报文客户端发送查询请求后,在没有错误的情况下,服务器会返回结果集(Result Set)给客户端。 官网上称Result Set 消息是由两部分组成的
如果更细分的话,是这样描述的: ?分为五部分,结构如下:
--Result Set Header 结构
--column definitions?结构?元数据部分以字段计数的数据包开头,后跟字段定义的数据包,每个字段一个数据包,如果未设置CLIENT_DEPRECATE_EOF,则以EOF_Packet结束。 在Result Set中,Field会连续出现多次,次数由Result Set Header结构中的IField结构计数值决定。每个field就是一个列的信息。
mysql支持的列类型如下:
mysql支持的列的标志如下:
--Row Data 结构 / 二进制Row Data 结构每个Row Data其实就是一行数据,包含有多个字段值,每个字段值就是一个基本的数据类型。
而一个Result Set消息中,会包含多个Row Data结构。 如果不是二进制的RowData结构,那么结构如下:
? ?如果是二进制的RowData结构,那么结构如下:
LOCAL INFILE 响应报文如果客户端发送LOAD DATA LOCAL INFILE....命令来导入数据,就将触发该协议包,需要客户端返回LOCAL INFILE Data进行响应,直到最后客户端返回一个空包为止,整个流程见下图: ? 参考MySQL :: MySQL Internals Manual :: 14.1 Overview MySQL :: MySQL Internals Manual :: 14.6.4.1 COM_QUERY Response MySQL :: MySQL Internals Manual :: 14.6.4.1 COM_QUERY Response? mysql交互协议解析——mysql包基础数据、mysql包基本格式 - 我没货,只剩下水了 - 博客园 彻底弄懂mysql(一)--mysql的通信协议_LYue123的博客-CSDN博客_mysql通信协议 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 5:05:18- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |