MySQL协议包说明
生活随笔
收集整理的這篇文章主要介紹了
MySQL协议包说明
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Packet基本構成
- Packet不能超過16M(224-1 byte,0xffffff),如果超過了會拆成多個Packet發送
- Packet頭部都必須攜帶Header信息
Packet拆解
- Header信息由4個字節組成,前3字節代表mysql包長度(payload_length),第4字節表示包序號(sequence_id)
- 從第5個字節開始表示mysql包內容(payload),具體長度由payload_length決定
舉個例子,Packet用字節數組表示:49 1 0 0 2 50 22…………
- payload_length = 305
- sequence_id = 0
payload_length 計算邏輯如下:
byte[] buf= new byte[3];buf[0] = 49;buf[1] = 1;buf[2] = 0;payload_length = (0xff & buf[position]) | ((0xff & buf[position + 1]) << 8) | ((0xff & buf[position + 2]) << 16);mysql包大小超過16M的情況
前面講過payload大小必須<= 224-1(FF FF FF), 假設現有payload大小等于224,那么會被拆成2次發送:
FF FF FF
00 00 01
sequence_id 說明
sequence_id表示一個完整流程的包序號,從0開始,當有拆包或者回復包都會往上+1。新的流程會重新從0開始。
Client發送的命令類型
命令類型由第5個字節表示:
命令類型具體有哪幾種,可以參考官方文檔:https://dev.mysql.com/doc/internals/en/command-phase.html
Server返回給Client的Packet格式
Server返回的Packet有3種類型:OK_Packet、ERR_Packet、EOF_Packet
- OK_Packet:表示Client發送的命令執行成功,第1個字節值等于 00
- ERR_Packet:表示發生異常,第1個字節值等于 FF
- EOF_Packet:在MySQL 5.7.5版本棄用了,作用和OK_Packet類似,第1個字節值等于 FE,可以不用管。
總結
以上是生活随笔為你收集整理的MySQL协议包说明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Canal实时同步数据到RocketMQ
- 下一篇: zookeeper可视化工具zkui