mysql報文通訊:基本結構介紹
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_serv.cc : 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. 可編碼長度的字串
字串的長度採用可變長度的整數進行編碼。
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_classic.cc : net_send_ok
由於協議的內容容易變更,建議檢視官網的最新版格式:https://dev.mysql.com/doc/internals/en/packet-OK_Packet.html
ERR包:首位元組是255,報錯錯誤碼和錯誤的描述資訊。4.1版本之上包括錯誤狀態。
執行函式:sql/protocol_classic.cc : net_send_error_packet
具體包格式:https://dev.mysql.com/doc/internals/en/packet-ERR_Packet.html
EOF包:首位元組254,包括伺服器狀態和告警數量(4.1版本之上)
執行函式:sql/protocol_classic.cc : net_send_eof
具體包格式:https://dev.mysql.com/doc/internals/en/packet-EOF_Packet.html
資料包:和具體的協議型別有關,後續講解