MySQL 通信协议 tcp c/s架构 jdbc java

简介

服务器启动后,会使用 TCP 监听一个本地端口,当客户端的连接请求到达时,就会执行三段握手以及 MySQL 的权限验证;验证成功后,客户端开始发送请求,服务器会以响应的报文格式返回数据;当客户端发送完成后,会发送一个特殊的报文,告知服务器已结束会话。

MySQL 定义了几种包类型,A) 客户端->服务器,登录时的 auth 包、执行 SQL 时的 CMD 包;B) 服务器->客户端,登录时的握手包、数据包、数据流结束包、成功包(OK Packet)、错误信息包。

协议定义了基本的数据类型,如 int、string 等;数据的传送格式等。

MySQL 通讯协议

MySql客户端服务端通信的两个阶段

MySQL客户端与服务器的交互主要分为两个阶段:握手认证阶段和命令执行阶段。

握手认证阶段

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

  • 服务器 -> 客户端:握手初始化消息
  • 客户端 -> 服务器:登陆认证消息
  • 服务器 -> 客户端:认证结果消息
命令执行阶段

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

  • 客户端 -> 服务器:执行命令消息
  • 服务器 -> 客户端:命令执行结果

怒肝两个月MySQL源码,我总结出这篇2W字的MySQL协议详解(超硬核干货)!!-腾讯云开发者社区-腾讯云

MySql协议详解-HandShake握手篇

Step1:客户端向DB发起TCP握手。

Step2:三次握手成功。与通常流程不同的是,由DB发送HandShake信息。这个Packet里面包含了MySql的能力、加密seed等信息。

Step3:客户端根据HandShake包里面的加密seed对MySql登录密码进行摘要后,构造Auth认证包发送给DB。

Step4:DB接收到客户端发过来的Auth包后会对密码摘要进行比对,从而确认是否能够登录。如果能,则发送Okay包返回。

Step5:客户端与DB的连接至此完毕。

JDBC与MySQL通信协议格式介绍 - 知乎

1.Unix Sockets
如果在MySQL本机使用这种方式连接MySQL数据库,默认使用Unix Sockets。

2.TCP/IP
连接的时候指定连接协议,或者指定相应的IP及端口,则连接方式就变成了TCP/IP方式。

[玩转MySQL之二]MySQL连接机制浅析及运维 - 知乎

TCP/IP 传输支持与本地或远程 MySQL 服务器的连接。

套接字文件,命名管道,共享内存传输仅支持与本地 MySQL 服务器的连接。 (命名管道传输的确允许远程连接,但此功能未在 MySQL 中实现.)

 MySql 中文文档 - 4.2.5 连接传输协议 | Docs4dev

Mysql的4种连接方式

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的通信协议_mysql 查询 是http请求吗-CSDN博客

mysql的通信协议

服务器响应包

服务器响应包分为4类:OK包,ERR包,EOF包,数据包

        OK包

在5.7.5之前,ok包首字节为0,;在5.7.5之后,ok包的首字节可能为0xFE,表示EOF。该包包括成功执行后影响的行数,最新的自增id, 告警信息(4.1版本之上),服务器状态信息:status_flag(该字段要留意,后续后讲到)

执行函数:sql/protocol_classic.cc :   net_send_ok

由于协议的内容容易变更,建议查看官网的最新版格式:https://dev.mysql.com/doc/internals/en/packet-OK_Packet.html

        ERR包

首字节是255,报错错误码和错误的描述信息。4.1版本之上包括错误状态。

执行函数:sql/protocol_classic.cc :   net_send_error_packet

具体包格式:https://dev.mysql.com/doc/internals/en/packet-ERR_Packet.html

        EOF包

首字节254,包括服务器状态和告警数量(4.1版本之上)

执行函数:sql/protocol_classic.cc :   net_send_eof

具体包格式:https://dev.mysql.com/doc/internals/en/packet-EOF_Packet.html

        数据包

和具体的协议类型有关,后续讲解

Mysql JDBC的通信协议(报文的格式和基本类型)

 

connection-phase

客户端和服务端建立连接 

1.client 发起一个 TCP 连接。

2.server 响应一个 Initial Handshake Packet(初始化握手包),内容会包含一个默认的认证方式。

3.这一步是可选的,双方建立 SSL 加密连接。

4.client 回应 Handshake Response Packet,内容需要包括用户名和按照指定方式进行加密后的密码数据。

5.server 响应 OK_Packet 确认认证成功,或者 ERR_Packet 表示认证失败并关闭连接。

Packet

一个 Packet 其实就是一个 TCP 包,所有包都有一个最基本的结构:

如上图所示,所有包都可以看作由 header 和 body 两部分构成:第一部分 header 总共有 4 个字节,3 个字节用来标识 body 即 payload 的大小,1 个字节记录 sequence ID;第二部分 body 就是 payload 实际的负载数据。

由于 payload length 只有 3 个字节来记录,所以一个 packet 的 payload 的大小不能超过 2^24 = 16 MB ,准确来说是 payload 的大小不超过 2^24-1 Byte(三个字节所能表示的最大整数 0xFFFFFF)。当数据大小超过了 16 MB 时,就需要把数据切分成多个 packet 传输。

解读 MySQL Client/Server Protocol: Connection & Replication

 

【总结】MySQL技术内幕九:通信协议详解 - 知乎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/808337.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

股票高胜率的交易法则是什么?

股票交易中的高胜率交易法则并非一成不变,而是根据市场状况、个人投资风格和经验等多种因素综合而定的。以下是一些有助于提升交易胜率的法则和策略: 1.趋势跟踪法则:在股票交易中,趋势跟踪是一种有效的策略。通过观察大盘和个股…

快速排序:深入解析其原理、实现与性能特性

快速排序,以其名字所示,是一种追求速度的高效排序算法。作为分治法在排序问题上的典型应用,快速排序凭借其平均情况下近乎理想的O(n log n)时间复杂度和简洁的实现逻辑,在实际编程与数据处理中占据着重要地位。本篇博客将详细解析…

Week6-LeetCode

1600.王位继承顺序 (中等) 关键思路: 多叉树的前序遍历。 class ThroneInheritance(object):def __init__(self, kingName):""":type kingName: str"""self.king kingNameself.dead set() # 记录死亡人员self.edges defaultdict…

Hadoop安装部署-NameNode高可用版

Hadoop分布式文件系统支持NameNode的高可用性,本文主要描述NameNode多节点高可用性的安装部署。 如上所示,Hadoop分布式文件系统部署了NameNode的Master主节点以及NameNode的Slave副节点,当Master主节点发生故障变得不可用时,ZooK…

llama-factory SFT系列教程 (一),大模型 API 部署与使用

文章目录 背景简介难点 前置条件1. 大模型 api 部署下一步阅读 背景 本来今天没有计划学 llama-factory,逐步跟着github的文档走,发现这框架确实挺方便,逐渐掌握了一些。 最近想使用 SFT 微调大模型,llama-factory 是使用非常广泛…

python之文件操作与管理

1、文件操作 通过open()操作,来创建文件对象,下面是open()函数语法如下: open(file,mode r,buffering -1 , encoding None ,errors None , newline None,closefd True,opener …

【综合分析类】校园霸凌

题目:近日,某地发生了一名初中生被3名初中生霸凌致S的事件,在社会上引起了广泛争议。有人呼吁,要完善未成年人保护法,进一步惩戒有关未成年的犯罪人员。对此你怎么看。 逐字稿:各位考官,考生思…

14. TypeScript类型保护(类型缩小、类型守卫)

类型保护是一种TypeScript技术,用于获取变量类型信息,通常使用在条件块语句中。 类型守卫是返回布尔值的常规函数,接受一个类型并告诉TypeScript是否可以缩小到更具体的类型。 TypeScript类型保护的方式 类型断言 类型断言是一种告诉编译器…

汇编基础-----常见命令基本使用

汇编基础-----常见命令基本使用 MOV:将数据从一个位置复制到另一个位置。 MOV destination, source例如: MOV RAX, RBX ; 将RBX寄存器中的值复制到RAX寄存器中ADD/SUB:将两个操作数相加或相减。 ADD destination, source SUB destinatio…

Python(3):条件语句+循环语句+逻辑运算符+符号优先级

文章目录 一、if语句1.if语句2.if 和 elif区别3.三元表达式 二、循环语句1.range函数和循环结束关键字2.while循环3.for循环 三、逻辑运算符1.and语句2.or语句3.not语句4.逻辑运算法的优先级 四、python运算符优先级和结合性一览表 一、if语句 1.if语句 1.if单分支语句 格式…

Python项目1 外星人入侵_外星人

在本章中,我们将在游戏《外星人入侵》中添加外星人。首先,我们在屏幕上边缘附近添加一个外星人,然后生成一群外星人。我们让这群外星人向两边和下面移 动,并删除被子弹击中的外星人。最后,我们将显示玩家拥有的飞船数量…

Python-configparser更新write保留注释

背景 python语言用来解析配置文件的模块是ConfigParser,python3中是configparser模块,在使用中经常用到write方法将配置项重新写入文件: config.ini文件: # 数据库配置 [database] # 主机 # IP host localhost # 端口 port 3…

从路由器syslog日志监控路由器流量

路由器是关键的网络基础设施组件,需要随时监控,定期监控路由器可以帮助管理员确保路由器通信正常。日常监控还可以清楚地显出通过网络的流量,通过分析路由器流量,安全管理员可及早识别可能发生的网络事件,从而避免停机…

关于STL容器线程安全性的问题

关于STL容器线程安全性的问题 STL容器(如vector)本身并不是线程安全的,因此在使用它们进行多线程编程时需要格外小心。即便写入操作(由生产者执行)是由单线程完成的,但在并发读取时,由于可能发…

程序员如何搞副业——中学生视角看职业拓展的深入探索

在数字化浪潮席卷全球的今天,程序员这一职业因其独特的魅力和广阔的发展前景而备受瞩目。作为一名中学生,虽然尚未步入职业领域,但提前了解程序员的副业之路,不仅可以帮助我们拓宽视野,还能为未来的职业规划提供有益的参考。 首先,个人项目开发是程序员搞副业的一个重要…

计算机中,逻辑端口

计算机中,端口是什么 在计算机领域中,端口(Port)是一个逻辑概念,用于标识计算机与外部设备或另一台计算机通信时的出入口。它是计算机与外部通信的途径,分为物理端口和逻辑端口两种。 物理端口:物理端口也被称为接口,是计算机主板上或其他设备上的硬件接口,如USB接口…

算法训练营第二十三天(二叉树完结)

算法训练营第二十三天(二叉树完结) 669. 修剪二叉搜索树 力扣题目链接(opens new window) 题目 给定一个二叉搜索树,同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树,使得所有节点的值在[L, R]中 (R>L) 。你可能需要改…

SQLite数据库在Linux系统上的使用

SQLite是一个轻量级的数据库解决方案,它是一个嵌入式的数据库管理系统。SQLite的特点是无需独立的服务器进程,可以直接嵌入到使用它的应用程序中。由于其配置简单、支持跨平台、服务器零管理,以及不需要复杂的设置和操作,SQLite非…

【算法】排硬币 - 二分法/牛顿迭代

题目 假设有n枚硬币,要摆一个阶梯形,第一行1个,第二行2个,以此类推,看n枚硬币能摆多少行,返回行数。未摆满行的不算。 原理 二分法 先假设放 x 行需要 m 个硬币,用 m 与 n 对比,…

OpenGL着色器实现纹理合并显示

OpenGL着色器实现纹理合并显示 本文介绍了opengl下实现纹理的装载,同时借助顶点着色器和片源着色器实现两个不同外部纹理的合并显示。 目录 1 opengl下纹理的装载2 纹理合并效果显示3 完整的代码 1 opengl下纹理的装载 // 初始化GLFWif (!glfwInit()) {std::cerr …