主人看到navicat和mysql在那嘻嘻哈哈,眉来眼去的,好不快乐,忽然也想自己写个程序,直接去访问Mysql,虽然现在已经有很多现成的中间件可以直接拿来用了,程序只要负责写sql语句就行了,但是主人想要自己通过mysql协议直接和mysql通讯,一窥究竟。于是主人找到Mysql说:亲爱的mysql,我以前和你交流总要通过第三方的驱动在中间传话,总感觉我们之间还有一个隔阂,有些话也不方便说,我现在有些心里话想直接和你交流。。。你说行吗?

mysql说:当然行啊,mysql受宠若惊,要和我打交道有多种方法比如:TCP/IP,TLS/SSL,Unix Sockets,Shared Memory,Named pipes等,那我们就用TCP/IP的方吧。用tcp协议就绕不开三次握手连接和四次握手断开,所以呢你和我连接的第一件事就是三次握手连接。

主人尴尬的笑了笑,tcp的三次握手听到听说过很多次,但是从没有真正的理解。。。

mysql从身后丢过来一个便签:这里有篇文章可以参考下:https://www.cnblogs.com/zhanyd/p/9877762.html

主人谢道,还是你体贴,刚开始navicat和你连接的时候,我是输入了主机地址,用户名,密码的,你们之间是怎么验证的呢?

mysql说:好问题,所有的客户端和我连接首先都要先经过我的认证,我和客户端一次正常的交互过程如下:

1. 三次握手建立 TCP 连接。

2. 建立 MySQL 连接,也就是认证阶段。
服务端 -> 客户端:发送握手初始化包 (Handshake Initialization Packet)。
客户端 -> 服务端:发送验证包 (Client Authentication Packet)。
服务端 -> 客户端:认证结果消息。 3. 认证通过之后,客户端开始与服务端之间交互,也就是命令执行阶段。
客户端 -> 服务端:发送命令包 (Command Packet)。
服务端 -> 客户端:发送回应包 (OK Packet, or Error Packet, or Result Set Packet)。 4. 断开 MySQL 连接。
客户端 -> 服务器:发送退出命令包。 5. 四次握手断开 TCP 连接。

我专门搞了个认证报文格式,我会按照以下的格式给客户端发送数据,然后客户端要根据这里面的内容给我返回验证包,然后我判断是否有权限登录:

官方的文档是这样子滴:

感觉不直观,在网上找到一个更直观的图:

具体解释如下:

  • protocol_version (1) -- 0x0a protocol_version

    第一个字节表示协议版本号

  • server_version (string.NUL) -- human-readable server version

    服务器版本号,字符串遇到Null结束

  • connection_id (4) -- connection id

    服务器线程id

  • auth_plugin_data_part_1 (string.fix_len) -- [len=8] first 8 bytes of the auth-plugin data

    第一部分8个字节的挑战随机数,后面还有第二部分

  • filler_1 (1) -- 0x00

    填充位0x00

  • capability_flag_1 (2) -- lower 2 bytes of the Protocol::CapabilityFlags (optional)

    服务器权能标志(低位2个字节)

  • character_set (1) -- default server character-set, only the lower 8-bits Protocol::CharacterSet (optional)

    This “character set” value is really a collation ID but implies the character set; see the Protocol::CharacterSet description.

    字符编码

  • status_flags (2) -- Protocol::StatusFlags (optional)

    服务器状态

  • capability_flags_2 (2) -- upper 2 bytes of the Protocol::CapabilityFlags

    服务器权能标志(高位2个字节)

  • auth_plugin_data_len (1) -- length of the combined auth_plugin_data, if auth_plugin_data_len is > 0

    挑战随机数的长度

  • string[10]     reserved (all [00])

    10个字节的保留位,都是00

  • auth_plugin_data_part_2

    挑战随机数的第二部分,通常是12字节

  • 挑战随机数结束标志00

  • auth_plugin_name (string.NUL) -- name of the auth_method that the auth_plugin_data belongs to

认证插件的名称,null结尾(这部分上面的图表里没有加进去)

主人听完后,跃跃欲试,很想验证下Mysql说的是不是真的,于是他找到了密友Wiresshark,让他监听下navicat和mysql之间的认证包,Wiresshark很快就完成了任务,把结果呈上来了:

具体先看服务器发送过来的第一个包:

主人一看,居然和mysql说的一模一样,好神奇。。。

mysql笑道:那当然,我还能骗你不成。我发给客户端收到后,客户端就要返回认证包给我验证啦,是驴是马我一眼就能认出来了哦,客户端返回给我要遵循以下的格式:

Fields

  • capability_flags (4) -- capability flags of the client as defined in Protocol::CapabilityFlags

    客户端权能标志

  • max_packet_size (4) -- max size of a command packet that the client wants to send to the server

    报文的最大字节数

  • character_set (1) -- connection's default character set as defined in Protocol::CharacterSet.

    字符集编码

  • username (string.fix_len) -- name of the SQL account which client wants to log in -- this string should be interpreted using the character set indicated by character set field.

    用户名

  • auth-response (string.NUL) -- opaque authentication response data generated by Authentication Method indicated by the plugin name field

    用户认证信息,即密码明文和挑战随机数加密后的token

  • database (string.NUL) -- initail database for the connection -- this string should be interpreted using the character set indicated by character set field.

    数据库名称

  • auth plugin name (string.NUL) -- the Authentication Method used by the client to generate auth-response value in this packet. This is an UTF-8 string.

    认证方法

主人抓包的结果:

mysql收到了主人发过来的认证包:主人,经过验证用户名密码都是正确的,可以登录了,我要返回一个ok报文,告诉你操作成功了哦,报文结构如下:

  • header:

    OK: header = 0 and length of packet > 7

    header=0并且报文长度>7表示当前是ok报文

    EOF: header = 0xfe and length of packet < 9

    header=0xfe并且报文长度<9表示当前是eof报文

主人抓包的结果:

header = 0,表示这个是个ok报文,status_flags(server status)= 02表名设置自动提交成功。

 

主人很高兴:这是不是说明,我和你的连接成功了呀?

mysql:恭喜你连接成功了,我们走出了第一步,接下来你就可以发送命令让我执行了哟。

mysql协议分析2---认证包的更多相关文章

  1. MySQL协议分析

    MySQL协议分析 标签: mysql 2015-02-27 10:22 1807人阅读 评论(1) 收藏 举报  分类: 数据库(19)    目录(?)[+]   1 交互过程 MySQL客户端与 ...

  2. MySQL协议分析2

    MySQL协议分析 议程 协议头 协议类型 网络协议相关函数 NET缓冲 VIO缓冲 MySQL API 协议头 ● 数据变成在网络里传输的数据,需要额外的在头部添加4 个字节的包头. . packe ...

  3. MySQL协议分析(2)

    MySQL协议分析(2) 此阶段是在压缩传输无加密条件下进行的协议分析 思路 结合Oracle官网的说明和自己用wireshark加python进行数据包分析 步骤 客户端与服务器端是否压缩的协商阶段 ...

  4. MySQL协议分析(1)

    MySQL协议分析 此阶段的协议分析是在未压缩未加密情况下的协议分析 思路: 结合Oracle官网和自己用wireshark抓的网络数据包进行协议分析 官网说明 mysql包共分为4段,格式如下: 第 ...

  5. mixer: mysql协议分析

    综述 要实现一个mysql proxy,首先需要做的就是理解并实现mysql通讯协议.这样才能通过proxy架起client到server之间的桥梁. mixer的mysql协议实现主要参考mysql ...

  6. mysql 协议分析

    MYSQL Binlog协议分析 此处不讨论建立连接,验证和handshake的交互协议 Binlog协议 一个MYSQL 通信包由包头包体组成 包体根据具体的交互协议有自身的组成结构, 在binlo ...

  7. mysql协议分析1---报文的格式和基本类型

    navicat 和 mysql 是一对好基友,每天都有非常频繁的交流,主人在navicat上写下每条sql语句,轻轻的点了下执行按钮,navicat就飞快的把主人的指令传送到mysql那里,mysql ...

  8. 网络协议分析之wireshark---抓包使用

    Wireshark基本介绍和学习TCP三次握手 之前写过一篇博客:用 Fiddler 来调试HTTP,HTTPS. 这篇文章介绍另一个好用的抓包工具wireshark, 用来获取网络数据封包,包括ht ...

  9. kerberos认证协议分析

    Kerberos认证协议分析 Kerberos认证协议流程 如上图: * 第一步:client和认证服务器(AS)通信完成认证过程,如果认证成功AS返回给client一个TGT(用来向TGS获取tic ...

随机推荐

  1. Spring之bean后处理器

    Bean后处理器是一种特殊的Bean,容器中所有的Bean在初始化时,均会自动执行该类的两个方法.由于该Bean是由其它Bean自动调用执行,不是程序员手工调用,故此Bean无须id属性.需要做的是, ...

  2. 第二章: Identifiers, Keywords and Types

    一:方法的定义和方法的调用 方法的定义:修饰符 方法的返回值 方法名(参数列表){ 方法体 } 如果没有方法的返回值就写成:void 参数列表:参数类型 参数名 方法的调用:方法名(参数值) 第二天: ...

  3. 【JAVA】我的爬虫

    简介:不是很智能的爬虫,效率慢,仅用作自娱自乐,需要观察目标网站的页面然后修改相关正则去获取自己想要的数据 环境:需要Http-client相关jar包,如下,可以去我的下载链接下载: https:/ ...

  4. 前端摸爬滚打之路(一)之 JavaScript 基础

    前言:这是我第一次在博客上记录自己的前端学习过程,以往都是在桌面右侧开个 onenote 小窗,记录自己在学习过程中获得的知识.通常都是记录的满满当当,然后心满意足的关闭窗口,但是记录不代表学会.这些 ...

  5. kafka搭建相关可能出现的bug

    在Kafka搭建时,首先安装zookeeper,新版本直接解压,启动就好了.由于什么原因,在虚拟机下,必须用root账户启动zookeeper,不然其中一个文件由于没有权限无法创建,导致zookeep ...

  6. 一套简单的web即时通讯——第一版

    前言 我们之前已经实现了 WebSocket+Java 私聊.群聊实例,后面我们模仿layer弹窗,封装了一个自己的web弹窗 自定义web弹窗/层:简易风格的msg与可拖放的dialog,生成博客园 ...

  7. WordPress教程之初识WordPress

    你是否梦想过以极低的成本获得一个漂亮的网站,而无需聘请专业的开发和设计人员,也不必学习任何编程知识,并且网站功能可以无限扩展?对这些问题中的任何一个,如果你的答案是肯定的,那么 WordPress 将 ...

  8. 机器学习读书笔记(五)AdaBoost

    一.Boosting算法 .Boosting算法是一种把若干个分类器整合为一个分类器的方法,在boosting算法产生之前,还出现过两种比较重要的将多个分类器整合为一个分类器的方法,即boostrap ...

  9. Vue兄弟组件(非父子组件)状态共享与传值

      前言:网上大部分文章写的有点乱,很少有讲得易懂的文章. 所以,我写了篇在我能看得懂的基础上又照顾到大家的文章 =.= 作者:X1aoYE 备注:此文原创,转载请注明~  内容里的<br> ...

  10. 【搜索引擎】 PostgreSQL 10 实时全文检索和分词、相似搜索、模糊匹配实现类似Google搜索自动提示

    需求分析 要通过PostgreSQL实现类似Google搜索自动提示的功能,例如要实现一个查询海量数据中的商品名字,每次输入就提示用户各种相关搜索选项,例如淘宝.京东等电商查询 思路 这个功能可以用 ...