1. 程式人生 > >mysql報文通訊:基本結構介紹

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

          資料包:和具體的協議型別有關,後續講解