mysql通信协议

MySQL通信报文结构

长度使用3个字节表示,最大值16MByte.

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个字节表示,小端字节序( the least significant byte first)。
  • 序列号使用一个字节表示,新command开始时,重置为0。

Example

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

COM_QUIT 报文格式如下:

01 00 00 00 01

  • length: 1
  • sequence_id: x00
  • payload: 0x01

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

猜你喜欢

转载自www.cnblogs.com/lanyangsh/p/9782206.html