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开始握手过程。
- client connect
- server sending Initial Handshake Packet
- 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 capabilityCLIENT_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