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. 可編碼長度的字串
字串的長度採用可變長度的整數進行編碼。
資料長度不固定,長度值由資料前的1-9個位元組決定,其中長度值所佔的位元組數不定,位元組數由第1個位元組決定,如下表:
第乙個位元組值後續位元組數長度值說明
0-250
第乙個位元組值即為資料的真實長度
空資料,資料的真實長度為零
後續額外2個位元組標識了資料的真實長度
後續額外3個位元組標識了資料的真實長度
後續額外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_classic.cc : net_send_ok
由於協議的內容容易變更,建議檢視官網的最新版格式:
err包:首位元組是255,報錯錯誤碼和錯誤的描述資訊。4.1版本之上包括錯誤狀態。
執行函式:sql/protocol_classic.cc : net_send_error_packet
具體包格式:
eof包:首位元組254,包括伺服器狀態和告警數量(4.1版本之上)
執行函式:sql/protocol_classic.cc : net_send_eof
具體包格式:
資料報:和具體的協議型別有關,後續講解
mysql報文格式 Mysql 報文格式
mysql client和server端之間的的資料根據不同的協議規則的進行組織傳送。每包資料在傳送的時候都要新增上協議頭。mysql原始碼採用5.7.10版本 協議頭 每個協議頭共4個位元組 包資料長度 前三個位元組表示資料部分的長度 不包括協議頭 三位元組能表示的最大長度是16m 1 2 24 ...
TCP報文格式 UDP報文格式 MAC幀格式
tcp和udp的區別 1 tcp是面向連線的,而udp是無連線的 2 tcp提供可靠服務,而udp不提供可靠服務,只是盡最大努力交付報文 3 tcp面向位元組流,tcp把資料看成一串無結構的位元組流,而udp是面向報文的 udp資料報 ip頭部 ip資料報 4 tcp有擁塞控制,udp沒有擁塞控制 ...
TCP報文格式
傳輸控制協議 tcp 向上與使用者應用程式程序介面,向下與網路層協議ip介面。使用者應用程式採用首先呼叫tcp 或udp 然後將應用程式資料遞交給tcp這一方式,在ip網路上傳送資料。tcp將這些資料打包分段並呼叫ip模組向目的主機傳送每個資料段。接收方的tcp將段中的資料放入接收緩衝器,然後將段重...