交互过程
MySQL客户端与服务器的交互主要分为两个阶段:握手认证阶段和命令执行阶段。
握手认证阶段
握手认证阶段为客户端与服务器建立连接后进行,交互过程如下:
服务器 -> 客户端:握手初始化消息
客户端 -> 服务器:登陆认证消息
服务器 -> 客户端:认证结果消息
命令执行阶段
客户端认证成功后,会进入命令执行阶段,交互过程如下:
客户端 -> 服务器:执行命令消息
服务器 -> 客户端:命令执行结果
上面就是mysql客户端和服务端的交互流程,然后结合实际中的抓包工具来看先这个过程。这里使用php的PDO扩展连接数据库并执行一条查询语句,抓包情况如下
下面一条一条的来分析每个包中的内容,在此之前先看下报文的结构,报文分为消息头和消息体两部分,其中消息头占用固定的4个字节,消息体长度由消息头中的长度字段决定,报文结构如下:
先看下握手初始化的报文,如图:
其中前三个字节 4a 00 00 表示消息体的长度,但是这里需要注意的是在报文中整数是以小端存储(即低位放在低地址,高位放在高地址)的方式进行传输的,所以转为我们平时阅读的形式的话应该是 00 00 4a 转为十进制应该是 74 ,也就是报文中的消息体长度应该是 74个字节(即出去开头的 4a 00 00 00 字节消息头之外所有的蓝色背景部分)。再来看下初始化信息中包含了哪些内容