MySQL协议包说明

Packet基本构成

  • Packet不能超过16M(224-1 byte,0xffffff),如果超过了会拆成多个Packet发送
  • Packet头部都必须携带Header信息

Packet拆解

  • Header信息由4个字节组成,前3字节代表mysql包长度(payload_length),第4字节表示包序号(sequence_id)
  • 从第5个字节开始表示mysql包内容(payload),具体长度由payload_length决定
    在这里插入图片描述

举个例子,Packet用字节数组表示:49 1 0 0 2 50 22…………

  • payload_length = 305
  • sequence_id = 0

payload_length 计算逻辑如下:

	byte[] buf= new byte[3];
    buf[0] = 49;
    buf[1] = 1;
    buf[2] = 0;
    
	payload_length  = (0xff & buf[position]) | ((0xff & buf[position + 1]) << 8) | ((0xff & buf[position + 2]) << 16);

mysql包大小超过16M的情况

前面讲过payload大小必须<= 224-1(FF FF FF), 假设现有payload大小等于224,那么会被拆成2次发送:
FF FF FF
00 00 01

sequence_id 说明

sequence_id表示一个完整流程的包序号,从0开始,当有拆包或者回复包都会往上+1。新的流程会重新从0开始。

Client发送的命令类型

命令类型由第5个字节表示:

在这里插入图片描述
命令类型具体有哪几种,可以参考官方文档:https://dev.mysql.com/doc/internals/en/command-phase.html

Server返回给Client的Packet格式

Server返回的Packet有3种类型:OK_Packet、ERR_Packet、EOF_Packet

  • OK_Packet:表示Client发送的命令执行成功,第1个字节值等于 00
  • ERR_Packet:表示发生异常,第1个字节值等于 FF
  • EOF_Packet:在MySQL 5.7.5版本弃用了,作用和OK_Packet类似,第1个字节值等于 FE,可以不用管。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

°Fuhb

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值