mysql 协议的ping命令包及解析详解及实例

2020-02-02 17:39 来源:未知

mysql 协议的ping命令包及解析详解

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) 报文内容

MySQL客户端可以用ping命令来检查服务端的状态,正常会返回ok包。

如果要发送的报文内容大于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.

mysql通信报文结构

序列号的作用

  • 序列号会随着每个包进行自增并且如果达到最大值会重置为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.

类型

参考

名字

描述

int3 payload长度 按照the least significant byte first存储,3个字节的payload和1个字节的序列号组合成报文头 int1 序列号 string payload 报文体,长度即为前面指定的payload长度

TAG标签:
版权声明:本文由澳门新浦金网站发布于数据库,转载请注明出处:mysql 协议的ping命令包及解析详解及实例