MysqlJDBC的通信协议(报文的格式和基本类型)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MysqlJDBC的通信协议(报⽂的格式和基本类型)
mysql client和server端之间的的数据根据不同的协议规则的进⾏组织发送。
每包数据在发送的时候都要添加上协议头。
mysql源码采⽤5.7.10版本:
协议头:
每个协议头共4个字节
包数据长度:
前三个字节表⽰数据部分的长度(不包括协议头),三字节能表⽰的最⼤长度是16M-1(2^24 - 1),如果要发送的数据部分⼤于这个长度,要进⾏拆包,每16M-1个长度为⼀包。
接收端在接受数据的时候,如果检测到包的长度是16M-1,说明后续还有数据部分,直到接收到<16M-1长度的数据包结束。
这意味着最后⼀包的数据长度可能为0.
序号:
1个字节,从0开始递增。
当发送⼀个新的sql、数据库重连,该值清0(函数sql/Net_ : net_clear).
数据类型:
除了固定长度的整型或者字符串之外,还有其他⼏种类型的数据。
(固定长度字段数据的存取:include/Mybyte_order.h :存值 int*store 取值:int*korr 多字节的处理按照⼩端优先的⽅式)
1. 可变长度的整数
对该类数据的存取在函数:sql-common/Pack.c: 存整数: net_store_length 读整数:net_field_length
如果数值<251,直接⽤⼀个字节存储这个值。
如果251<=数值<2^16, 采⽤3个字节存储,第⼀个字节是252,另外2个字节存储整数内容
如果2^16<=数值<2^24,采⽤4字节存储,第⼀个字节是252,另外3个字节存储整数内容
如果2^24<=数值<2^64,采⽤9字节存储,第⼀个字节255,另外8字节存储整数内容
如果第⼀个字节为251,表⽰该整数字段为null
如果第⼀个字节为255,表⽰该字节是ERR包的第⼀个字节
2. 可编码长度的字符串
字符串的长度采⽤可变长度的整数进⾏编码。
数据长度不固定,长度值由数据前的1-9个字节决定,其中长度值所占的字节数不定,字节数由第1个字节决定,如下表:
第⼀个字节值后续字节数长度值说明
0-2500第⼀个字节值即为数据的真实长度
2510空数据,数据的真实长度为零
2522后续额外2个字节标识了数据的真实长度
2533后续额外3个字节标识了数据的真实长度
2548后续额外8个字节标识了数据的真实长度
3. null结尾的字符串
服务器响应包:
服务器响应包分为4类: OK包 ERR包 EOF包数据包
OK包:在5.7.5之前,ok包⾸字节为0,;在5.7.5之后,ok包的⾸字节可能为0xFE,表⽰EOF。
该包包括成功执⾏后影响的⾏数,最新的⾃增id,告警信息(4.1版本之上),服务器状态信息:status_flag(该字段要留意,后续后讲到)
执⾏函数:sql/protocol_ : net_send_ok
由于协议的内容容易变更,建议查看官⽹的最新版格式:https:///doc/internals/en/packet-OK_Packet.html
ERR包:⾸字节是255,报错错误码和错误的描述信息。
4.1版本之上包括错误状态。
执⾏函数:sql/protocol_ : net_send_error_packet
具体包格式:https:///doc/internals/en/packet-ERR_Packet.html
EOF包:⾸字节254,包括服务器状态和告警数量(4.1版本之上)
执⾏函数:sql/protocol_ : net_send_eof
具体包格式:https:///doc/internals/en/packet-EOF_Packet.html
数据包:和具体的协议类型有关,后续讲解。