翔云

Just try, don't shy. 最新文章请点击
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

mysql通信协议

Posted on 2018-10-13 11:04  翔云123456  阅读(1318)  评论(0编辑  收藏  举报

mysql在传输层使用的TCP协议。一个TCP payload可能有多个mysql packet。如下图所示。

TCP head TCP payload
(mysql packet1, mysql packet2,mysql packet 3...)

MySQL packet通信报文结构

Type Name Description
int<3> payload_length payload的长度,按照the least significant byte first存储,3个字节的payload 长度和1个字节的序列号组合成报文头
int<1> sequence_id Sequence ID序列号
string payload 报文体,长度即为前面指定的payload长度
  • payload 长度使用3个字节表示,最大值16MByte,小端字节序( the least significant byte first)。
  • 序列号使用一个字节表示,每个新command开始时,seq重置为0。

Example

COM_QUIT 是client关闭连接时发送给server端的消息。
payload的第一个字节是Command。

COM_QUIT 报文格式如下:

01 00 00 00 01

  • length: 前3个字节是长度字段,这里长度值为1.
  • sequence_id: 第4个字节是序列号,0x00
  • payload: 0x01, 第5个字节是COM_QUIT

Command

client向server发送的操作命令,例如查询,插入,更新等等。
这里只列出几个常用的命令。

COM_INIT_DB
改变连接的数据库

COM_QUERY
查询操作

COM_STMT_PREPARE
creates a prepared statement from the passed query string.

**COM_STMT_EXECUTE **
asks the server to execute a prepared statement as identified by stmt-id.

连接阶段

client首先连接server,然后server开始握手过程。

  1. client connect
  2. server sending Initial Handshake Packet
  3. client replying with Handshake Response Packet

流程图如下:

c                                           s
|----------------connect------------------->|
|<---------initial Handshake Packet---------|
|-----------Handshake Response Packet------>|

两种类型的handshake reponse packet:

  • Protocol::HandshakeResponse41
    4.1以后版本,支持 CLIENT_PROTOCOL_41 capability

    CLIENT_PROTOCOL_41定义为0x00000200

  • Protocol::HandshakeResponse320
    老版本

连接阶段完成:

  • exchange the capabilities of client and server
  • 如果需要,建立SSL 通信通道
  • client到server的认证

参考

https://dev.mysql.com/doc/internals/en/client-server-protocol.html