mysql报文协议第一篇

MySql 客户端和服务器端交互方式

如果Mysql 客户端或者服务器端想发送数据,那么:

  • 他们会将数据分割成大小最大为2^24个字节的包进行发送
  • 他们会预备每个包一个报文头

原文
If a MySQL client or server wants to send data, it:

  • Splits the data into packets of size 2^24 bytes
  • Prepends to each chunk a packet header

报文格式

用于服务器与客户端通信的报文的大小最大为16MByte-1byte,实际的报文长度可以计算等于byte[0]+(byte[1]<<8)+(byte[2]<<16),

Type name Description
int<3> 报文长度(payload_length) 一共三个字节,是报文内容的长度,最大长度为2^24-1,与序列号一起组成报文头
int<1> 序列号(sequence_id) 序列号与报文长度一起组成报文头
string 报文内容(payLoad) 报文内容

如果要发送的报文内容大于16MB怎么办?

  • 如果报文内容大于2^24-1 字节,那么会加上额外的报文,直到报文的报文头小于2^24-1 字节;就是说,如果一个报文的payLoad装不下所有内容,那么会通过第二个继续发送,然后第三个、第四个,直到最后的报文的payLoad字节小于2^24-1 为止,如果最后一个报文刚好等于2^24-1个字节,那么还要再发送一个额外的空的报文。

  • If the payload is larger than or equal to 2^24-1 bytes the length is set to 2^24-1 (ff ff ff) and a additional packets are sent with the rest of the payload until the payload of a packet is less than 2^24-1 bytes.

序列号的作用

  • 序列号会随着每个包进行自增并且如果达到最大值会重置为0;序列号从0开始,然后又会在新的命令开始的时候重新设置为0
  • The sequence-id is incremented with each packet and may wrap around. It starts at 0 and is reset to 0 when a new command begins in the Command Phase.

参考

  • https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_basic_packets.html

你可能感兴趣的:(mysql报文协议第一篇)