MySQL协议包采用二进制格式传输,以减少传输的字节量。它由4个部分组成:
+------------------------+ | packet length | +------------------------+ | packet number | +------------------------+ | payload | +------------------------+ | checksum | +------------------------+
第一个部分是packet length,它表示协议包的定义长度。packet length的长度为3个字节,最大值为16MB-1。
第二个部分是packet number,表示协议包的编号,它也是3个字节长。
第三个部分是payload,它表示协议包的负载,也就是实际要传输的数据。payload长度是由packet length确定的。在payload中,第一个字节是命令码,表示这个协议包要执行的命令。命令码和其它参数一起构成了协议包的语义。接下来的字节就是参数了。
+--------+--------+--------+--------+--------+ | command | arg1 | arg2 ... +--------+--------+--------+--------+--------+
最后一个部分是checksum,它使用快速哈希算法(快速Adler哈希)计算,在payload中所有字节的和的基础上计算得出。
MySQL协议包使用的命令码有许多,包括登录,查询,事务控制等等。每种命令码都有不同的参数和语法,对于协议包的解析需要根据不同的命令码采取不同的解析方式。