navicat 和 mysql 是一对好基友,每天都有非常频繁的交流,主人在navicat上写下每条sql语句,轻轻的点了下执行按钮,navicat就飞快的把主人的指令传送到mysql那里,mysql立马把返回结果传回navicat那里显示给主人看。主人对他们的效率很满意,同时主人也有点好奇:你们两个基友是怎么通讯的呢?如果不通过navicat,我用程序直接和mysql交互该怎么做呢?

mysql 笑道:这是我们之间的秘密。。。

navicat有点不开心了:难道主人想抛弃我吗?呜呜呜。。。

主人安慰道:你想多了,我只是想更了解你们呀。

那我就给你详细讲讲我们之间的小秘密吧,mysql悠悠的说道:

想要通过我的交互,就得照我规定的格式来,不能每个人过来都讲自己的方言,我可听不懂,来到我的地盘就得按我的规矩来。

1.我给你发的报文都是这种格式的:

服务器--->客户端的报文格式

前面3个字节payload_length表示后面数据的实际长度,中间一个字节sequence_id表示报文的序号,从0开始,每次加1,最后的paylaod就是我发你的内容啦。

你可能也发现了,payload_length用3个字节表示,最大只能表示 224−1 bytes也是16M,如果报文大于或者等于16M那就要拆成2个报文了哦,

比如刚好发送16M的报文:

ff ff ff 00 (数据域16M)...
00 00 00 01 (数据域为空)

第二个报文的数据域是空的。

2.客户端发给我的报文也是要按照一定格式的哦:

客户端--->服务器的报文格式

第一个字节表示命令的类型

后面的字节表示具体的命令,例如关闭连接的报文是长这样子滴:

这样规定好后,我们就有共同语言啦,就能听得懂对方在讲什么了,所以说有共同语言是很重要滴。

主人细细的回味了下mysql刚才说的话,发现还有个地方没弄明白问道:你发给我的报文中int<3>,string<var>表示什么意思呀?

mysql忽然意识到还忘了说一件重要的事情:哎呦,我忘了和你说基本的数据类型了。

mysql有2种基本的数据类型:

Integers(整数型)String(字符串)

Integers(整数型)分为定长的整数类型(Fixed-length integers)和变长的整数类型(Length-encoded integers)

1.定长的整数类型(Fixed-length integers)分别能表示1,2,3,4,6,8字节的长度:

int<1>表示占1个字节的长度, int<2>表示占2个字节的长度,以此类推,

比如 int<3> 表示1是这么表示的:01 00 00

对了,mysql协议中字节是按小头(LittileEndian)的方式表示的,低位的字节在前面,总体占3个字节,所以第一个字节是01,后面是00 00

2.变长的整数类型(Length-encoded integers)

  • 如果数字 < 251, 就用一个字节表示 = 1个字节
  • 如果数字 ≥ 251 并且 < (216),就用 fc + 2个字节表示  = 3个字节
  • 如果数字 ≥ (216) 并且 < (224),就用 fd + 3个字节表示  = 4个字节
  • 如果数字 ≥ (224) 并且 < (264) ,就用 fe + 8个字节表示  = 9个字节

主人表示很奇怪:一个字节最多能表示255个数,为什么不能直接表示到255?而是只表示到250?

mysql微微一笑道:因为251,252,253,254,255已经被我征用了哦,它们表示特殊的用途:

251(fb):表示 NULL

252(fc):表示数值的大小占后面的2个字节

253(fd):表示数值的大小占后面的3个字节

254(fe):表示数值的大小占后面的8个字节

255(ff): 表示一个错误报文 ERR packet



下面说说String(字符串)类型:

1.变长的字符类型(LengthEncodedString):和上面变长整数类型是一样的,根据第一个字节的值判断所占字节的长度

2.定长的字符串类型(FixedLengthString):后面的数字表示字符串所占字节的长度

3.动态的计算长度(VariableLengthString):根据var动态的计算长度
4.包末端字符串方式(RestOfPacketString):没搞懂
5.空结尾的字符串类型(NulTerminatedString):字符串遇到 00 结束
 
原来如此,主人豁然开朗,看着navicat 和 mysql都亲切了许多,知道他们之间是怎么通话之后,一个邪恶的想法慢慢从心底升起,嘿嘿,那我不就可以监听他们之间的对话了嘛,哈哈哈哈哈哈哈哈。。。


我的公众号,欢迎关注

 

mysql协议分析1---报文的格式和基本类型的更多相关文章

  1. MySQL协议分析

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

  2. MySQL协议分析(2)

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

  3. MySQL协议分析(1)

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

  4. MySQL协议分析2

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

  5. mixer: mysql协议分析

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

  6. mysql协议分析2---认证包

    主人看到navicat和mysql在那嘻嘻哈哈,眉来眼去的,好不快乐,忽然也想自己写个程序,直接去访问Mysql,虽然现在已经有很多现成的中间件可以直接拿来用了,程序只要负责写sql语句就行了,但是主 ...

  7. mysql 协议分析

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

  8. mysql协议简析

    前言 如果要在命令行中连接mysql,最常用的便是 mysql -u root -p 这样指定用户名和密码 当然还可以使用远程连接 mysql -h 127.0.0.1 -u root -p 还有一种 ...

  9. 应用层协议FTP、DNS协议、HTTP协议分析

    分析所用软件下载:Wireshark-win32-1.10.2.exe 一.阅读导览 1.分析FTP协议 2.分析DNS协议 3. 分析HTTP协议 二.分析要求 (1)ftp部分: 学习 Serv- ...

随机推荐

  1. Spring_two

    Spring_two 基于注解的IOC配置 准备工作(参考上一篇) ); 接口的实现类AccountDaoImpl.java修改 /** * 账户的持久层实现类 */ @Repository(&quo ...

  2. Sqoop 的基本使用

    目录 一.Sqoop 基本命令 1. 查看所有命令 2. 查看某条命令的具体使用方法 二.Sqoop 与 MySQL 1. 查询MySQL所有数据库 2. 查询指定数据库中所有数据表 三.Sqoop ...

  3. Java NIO 学习笔记(五)----路径、文件和管道 Path/Files/Pipe

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  4. HTML行内元素、块级元素、行内块级元素的特点与区别

    元素 HTML 元素指的是从开始标签(start tag)到结束标签(end tag)的所有代码. 元素分类方式 HTML 可以将元素分类方式分为行内元素.块状元素和行内块状元素三种,这三者可以通过设 ...

  5. Centos7下安装Mysql8.0

    突然发现mysql都有8.0了,且性能提升比较明显,就自己装来玩玩. centos的yum源中默认是没有mysql的,所以我们需要先去官网下载mysql的repo源并安装: 官网:http://dev ...

  6. python函数之 range()

      Python range() 函数用法 python range() 函数可创建一个整数列表,一般用在 for 循环中. 函数语法 range(start, stop[, step]) 参数说明: ...

  7. 分析了16年的福利彩票记录,原来可以用Python这么买彩票

    目录 0 引言 1 环境 2 需求分析 3 代码实现 4 后记 0 引言 上周被一则新闻震惊到了,<2454万元大奖无人认领!福彩史上第二大弃奖在广东中山产生 >,在2019年5月2日开奖 ...

  8. 2018.7.16 题解 2018暑假集训之Roads-roads

    题面描述 有标号为1--n的城市与单行道相连.对于每条道路有两个与之相关的参数:道路的长度以及需要支付的费用(用硬币的数量表示) 鲍勃和爱丽丝曾经生活在城市1.在注意到爱丽丝在他们喜欢玩的卡牌游戏中作 ...

  9. K2工作流引擎Demo

    ---恢复内容开始--- 以前的工作都是电商网站形式的,从未接触过工作流相关工作,新公司是传统制造业行业,我进的这个组又是做工作流这块相关工作的,所以避免不了和工作流打交道. 这边工作流主要用K2来做 ...

  10. 《C#并发编程经典实例》学习笔记—2.7 避免上下文延续

    避免上下文延续 在默认情况下,一个 async 方法在被 await 调用后恢复运行时,会在原来的上下文中运行. 为了避免在上下文中恢复运行,可让 await 调用 ConfigureAwait 方法 ...