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<var> | 报文内容(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.