1. 程式人生 > >MySQL協議分析

MySQL協議分析

1 互動過程

MySQL客戶端與伺服器的互動主要分為兩個階段:握手認證階段和命令執行階段。

1.1 握手認證階段

握手認證階段為客戶端與伺服器建立連線後進行,互動過程如下:

  • 伺服器 -> 客戶端:握手初始化訊息
  • 客戶端 -> 伺服器:登陸認證訊息
  • 伺服器 -> 客戶端:認證結果訊息

1.2 命令執行階段

客戶端認證成功後,會進入命令執行階段,互動過程如下:

  • 客戶端 -> 伺服器:執行命令訊息
  • 伺服器 -> 客戶端:命令執行結果

MySQL客戶端與伺服器的完整互動過程如下

MySQL客戶端與伺服器互動示意圖

2 基本型別

2.1 整型值

MySQL報文中整型值分別有1、2、3、4、8位元組長度,使用小位元組序傳輸。

2.2 字串(以NULL結尾)(Null-Terminated String)

字串長度不固定,當遇到'NULL'(0x00)字元時結束。

2.3 二進位制資料(長度編碼)(Length Coded Binary)

資料長度不固定,長度值由資料前的1-9個位元組決定,其中長度值所佔的位元組數不定,位元組數由第1個位元組決定,如下表:

第一個位元組值 後續位元組數 長度值說明
0-250 0 第一個位元組值即為資料的真實長度
251 0 空資料,資料的真實長度為零
252 2 後續額外2個位元組標識了資料的真實長度
253 3 後續額外3個位元組標識了資料的真實長度
254 8 後續額外8個位元組標識了資料的真實長度

2.4 字串(長度編碼)(Length Coded String)

字串長度不固定,無'NULL'(0x00)結束符,編碼方式與上面的 Length Coded Binary 相同。

3 報文結構

報文分為訊息頭和訊息體兩部分,其中訊息頭佔用固定的4個位元組,訊息體長度由訊息頭中的長度欄位決定,報文結構如下:

MySQL報文結構

3.1 訊息頭

3.1.1 報文長度

用於標記當前請求訊息的實際資料長度值,以位元組為單位,佔用3個位元組,最大值為 0xFFFFFF,即接近 16 MB 大小(比16MB少1個位元組)。

3.1.2 序號

在一次完整的請求/響應互動過程中,用於保證訊息順序的正確,每次客戶端發起請求時,序號值都會從0開始計算。

3.2 訊息體

訊息體用於存放請求的內容及響應的資料,長度由訊息頭中的長度值決定。

4 報文型別

4.1 登陸認證互動報文

4.1.1 握手初始化報文(伺服器 -> 客戶端)

MySQL握手初始化報文

服務協議版本號:該值由 PROTOCOL_VERSION 巨集定義決定(參考MySQL原始碼/include/mysql_version.h標頭檔案定義)

服務版本資訊:該值為字串,由 MYSQL_SERVER_VERSION 巨集定義決定(參考MySQL原始碼/include/mysql_version.h標頭檔案定義)

伺服器執行緒ID:伺服器為當前連線所建立的執行緒ID。

挑戰隨機數:MySQL資料庫使用者認證採用的是挑戰/應答的方式,伺服器生成該挑戰數併發送給客戶端,由客戶端進行處理並返回相應結果,然後伺服器檢查是否與預期的結果相同,從而完成使用者認證的過程。

伺服器權能標誌:用於與客戶端協商通訊方式,各標誌位含義如下(參考MySQL原始碼/include/mysql_com.h中的巨集定義):

標誌位名稱 標誌位 說明
CLIENT_LONG_PASSWORD 0x0001 new more secure passwords
CLIENT_FOUND_ROWS 0x0002 Found instead of affected rows
CLIENT_LONG_FLAG 0x0004 Get all column flags
CLIENT_CONNECT_WITH_DB 0x0008 One can specify db on connect
CLIENT_NO_SCHEMA 0x0010 Do not allow database.table.column
CLIENT_COMPRESS 0x0020 Can use compression protocol
CLIENT_ODBC 0x0040 Odbc client
CLIENT_LOCAL_FILES 0x0080 Can use LOAD DATA LOCAL
CLIENT_IGNORE_SPACE 0x0100 Ignore spaces before '('
CLIENT_PROTOCOL_41 0x0200 New 4.1 protocol
CLIENT_INTERACTIVE 0x0400 This is an interactive client
CLIENT_SSL 0x0800 Switch to SSL after handshake
CLIENT_IGNORE_SIGPIPE 0x1000 IGNORE sigpipes
CLIENT_TRANSACTIONS 0x2000 Client knows about transactions
CLIENT_RESERVED 0x4000 Old flag for 4.1 protocol
CLIENT_SECURE_CONNECTION 0x8000 New 4.1 authentication
CLIENT_MULTI_STATEMENTS 0x0001 0000 Enable/disable multi-stmt support
CLIENT_MULTI_RESULTS 0x0002 0000 Enable/disable multi-results

字元編碼:標識伺服器所使用的字符集。

伺服器狀態:狀態值定義如下(參考MySQL原始碼/include/mysql_com.h中的巨集定義):

狀態名稱 狀態值
SERVER_STATUS_IN_TRANS 0x0001
SERVER_STATUS_AUTOCOMMIT 0x0002
SERVER_STATUS_CURSOR_EXISTS 0x0040
SERVER_STATUS_LAST_ROW_SENT 0x0080
SERVER_STATUS_DB_DROPPED 0x0100
SERVER_STATUS_NO_BACKSLASH_ESCAPES 0x0200
SERVER_STATUS_METADATA_CHANGED 0x0400

4.1.2 登陸認證報文(客戶端 -> 伺服器)

MySQL 4.0 及之前的版本

MySQL登陸認證報文(4.0及之前的版本)

MySQL 4.1 及之後的版本

MySQL登陸認證報文(4.1及之後的版本)

客戶端權能標誌:用於與客戶端協商通訊方式,標誌位含義與握手初始化報文中的相同。客戶端收到伺服器發來的初始化報文後,會對伺服器傳送的權能標誌進行修改,保留自身所支援的功能,然後將權能標返回給伺服器,從而保證伺服器與客戶端通訊的相容性。

最大訊息長度:客戶端傳送請求報文時所支援的最大訊息長度值。

字元編碼:標識通訊過程中使用的字元編碼,與伺服器在認證初始化報文中傳送的相同。

使用者名稱:客戶端登陸使用者的使用者名稱稱。

挑戰認證資料:客戶端使用者密碼使用伺服器傳送的挑戰隨機數進行加密後,生成挑戰認證資料,然後返回給伺服器,用於對使用者身份的認證。

資料庫名稱:當客戶端的權能標誌位 CLIENT_CONNECT_WITH_DB 被置位時,該欄位必須出現。

4.2 客戶端命令請求報文(客戶端 -> 伺服器)

MySQL客戶端命令請求報文

命令:用於標識當前請求訊息的型別,例如切換資料庫(0x02)、查詢命令(0x03)等。命令值的取值範圍及說明如下表(參考MySQL原始碼/include/mysql_com.h標頭檔案中的定義):

型別值 命令 功能 關聯函式
0x00 COM_SLEEP (內部執行緒狀態) (無)
0x01 COM_QUIT 關閉連線 mysql_close
0x02 COM_INIT_DB 切換資料庫 mysql_select_db
0x03 COM_QUERY SQL查詢請求 mysql_real_query
0x04 COM_FIELD_LIST 獲取資料表字段資訊 mysql_list_fields
0x05 COM_CREATE_DB 建立資料庫 mysql_create_db
0x06 COM_DROP_DB 刪除資料庫 mysql_drop_db
0x07 COM_REFRESH 清除快取 mysql_refresh
0x08 COM_SHUTDOWN 停止伺服器 mysql_shutdown
0x09 COM_STATISTICS 獲取伺服器統計資訊 mysql_stat
0x0A COM_PROCESS_INFO 獲取當前連線的列表 mysql_list_processes
0x0B COM_CONNECT (內部執行緒狀態) (無)
0x0C COM_PROCESS_KILL 中斷某個連線 mysql_kill
0x0D COM_DEBUG 儲存伺服器除錯資訊 mysql_dump_debug_info
0x0E COM_PING 測試連通性 mysql_ping
0x0F COM_TIME (內部執行緒狀態) (無)
0x10 COM_DELAYED_INSERT (內部執行緒狀態) (無)
0x11 COM_CHANGE_USER 重新登陸(不斷連線) mysql_change_user
0x12 COM_BINLOG_DUMP 獲取二進位制日誌資訊 (無)
0x13 COM_TABLE_DUMP 獲取資料表結構資訊 (無)
0x14 COM_CONNECT_OUT (內部執行緒狀態) (無)
0x15 COM_REGISTER_SLAVE 從伺服器向主伺服器進行註冊 (無)
0x16 COM_STMT_PREPARE 預處理SQL語句 mysql_stmt_prepare
0x17 COM_STMT_EXECUTE 執行預處理語句 mysql_stmt_execute
0x18 COM_STMT_SEND_LONG_DATA 傳送BLOB型別的資料 mysql_stmt_send_long_data
0x19 COM_STMT_CLOSE 銷燬預處理語句 mysql_stmt_close
0x1A COM_STMT_RESET 清除預處理語句引數快取 mysql_stmt_reset
0x1B COM_SET_OPTION 設定語句選項 mysql_set_server_option
0x1C COM_STMT_FETCH 獲取預處理語句的執行結果 mysql_stmt_fetch

引數:內容是使用者在MySQL客戶端輸入的命令(不包括每行命令結尾的";"分號)。另外這個欄位的字串不是以NULL字元結尾,而是通過訊息頭中的長度值計算而來。

例如:當我們在MySQL客戶端中執行use hutaow;命令時(切換到hutaow資料庫),傳送的請求報文資料會是下面的樣子:

0x02 0x68 0x75 0x74 0x61 0x6f 0x77

其中,0x02為請求型別值COM_INIT_DB,後面的0x68 0x75 0x74 0x61 0x6f 0x77為ASCII字元hutaow

4.2.1 COM_QUIT 訊息報文

功能:關閉當前連線(客戶端退出),無引數。

4.2.2 COM_INIT_DB 訊息報文

功能:切換資料庫,對應的SQL語句為USE <database>

位元組 說明
n 資料庫名稱(字串到達訊息尾部時結束,無結束符)

4.2.3 COM_QUERY 訊息報文

功能:最常見的請求訊息型別,當用戶執行SQL語句時傳送該訊息。

位元組 說明
n SQL語句(字串到達訊息尾部時結束,無結束符)

4.2.4 COM_FIELD_LIST 訊息報文

功能:查詢某表的欄位(列)資訊,等同於SQL語句SHOW [FULL] FIELDS FROM ...

位元組 說明
n 表格名稱(Null-Terminated String)
n 欄位(列)名稱或萬用字元(可選)

4.2.5 COM_CREATE_DB 訊息報文

功能:建立資料庫,該訊息已過時,而被SQL語句CREATE DATABASE代替。

位元組 說明
n 資料庫名稱(字串到達訊息尾部時結束,無結束符)

4.2.6 COM_DROP_DB 訊息報文

功能:刪除資料庫,該訊息已過時,而被SQL語句DROP DATABASE代替。

位元組 說明
n 資料庫名稱(字串到達訊息尾部時結束,無結束符)

4.2.7 COM_REFRESH 訊息報文

功能:清除快取,等同於SQL語句FLUSH,或是執行mysqladmin flush-foo命令時傳送該訊息。

位元組 說明
1 清除快取選項(點陣圖方式儲存,各標誌位含義如下)
0x01: REFRESH_GRANT
0x02: REFRESH_LOG
0x04: REFRESH_TABLES
0x08: REFRESH_HOSTS
0x10: REFRESH_STATUS
0x20: REFRESH_THREADS
0x40: REFRESH_SLAVE
0x80: REFRESH_MASTER

4.2.8 COM_SHUTDOWN 訊息報文

功能:停止MySQL服務。執行mysqladmin shutdown命令時傳送該訊息。

位元組

相關推薦

mysql協議分析1---報文的格式和基本型別

navicat 和 mysql 是一對好基友,每天都有非常頻繁的交流,主人在navicat上寫下每條sql語句,輕輕的點了下執行按鈕,navicat就飛快的把主人的指令傳送到mysql那裡,mysql立馬把返回結果傳回navicat那裡顯示給主人看。主人對他們的效率很滿意,同時主人也有點好奇:你們兩個基友是怎

mysql協議分析2---認證包

主人看到navicat和mysql在那嘻嘻哈哈,眉來眼去的,好不快樂,忽然也想自己寫個程式,直接去訪問Mysql,雖然現在已經有很多現成的中介軟體可以直接拿來用了,程式只要負責寫sql語句就行了,但是主人想要自己通過mysql協議直接和mysql通訊,一窺究竟。於是主人找到Mysql說:親愛的mysql,我以

MySQL協議分析

1 互動過程 MySQL客戶端與伺服器的互動主要分為兩個階段:握手認證階段和命令執行階段。 1.1 握手認證階段 握手認證階段為客戶端與伺服器建立連線後進行,互動過程如下: 伺服器 -> 客戶端:握手初始化訊息客戶端 -> 伺服器:

MySQL之——協議分析(下篇)

MySQL協議分析議程 協議頭 協議型別 網路協議相關函式 NET緩衝 VIO緩衝 MySQL API協議頭● 資料變成在網路裡傳輸的資料,需要額外的在頭部新增4 個位元組的包頭. . packet length(3位元組), 包體的長度 . packet number(1位元組), 從0開始的遞增的 ●

mysql狀態分析之show global status

其中 正在 中一 未使用 更多 同事 排序 eat 配置文件 公司的nagios監控服務器長期對內網用MySQL數據庫發出ctritical報警,因為我將其他同事的手機短信報警也開通了,搞得整個系統組的同事都怨聲載道(呵呵)這時候就需要根據其status對其Mysql數據庫

協議分析】HTTP響應頭中的2種編碼方式介紹

href intro feo 發送 文檔 bsp firefox cep 目前 HTTP 1.1中有兩個實體頭(Entity-Header)直接與編碼相關,分別為Content-Encoding和Transfer-Encoding。 先說Content-Encodin

物聯網MQTT協議分析和開源Mosquitto部署驗證

-h etc 遙感 並且 傳輸 物聯網平臺 發布消息 情況 all 在《物聯網核心協議—消息推送技術演進》一文中已向讀者介紹了多種消息推送技術的情況,包括HTTP單向通信、Ajax輪詢、Websocket、MQTT、CoAP等,其中MQTT協議為IBM制定並力推

Zookeeper ZAB 協議分析

指令 get 不同 保持 lead 細節 決定 rsquo res 前言 ZAB 協議是為分布式協調服務 ZooKeeper 專門設計的一種支持崩潰恢復的原子廣播協議。在 ZooKeeper 中,主要依賴 ZAB 協議來實現分布式數據一致性,基於該協議,ZooKeeper

TLS協議分析

和數 技術分享 連接建立 發現 p地址 .cn 瀏覽器 及其 任務 一、實驗目的 1.本次實驗主要目的是分析訪問網站時捕捉TLS包,並且對TLS協議進行分析。 2.分析連接建立的完整過程,如:TCP三次握手、SSL安全連接,使用TLS協議連接、協商過程,加密傳送的狀態、TC

TCP、UDP、IP 協議分析

cin 數值 style width 流量 serve 地址解析 checksum log TCP、UDP、IP 協議分析 http://rabbit.xttc.edu.cn/rabbit/htm/artical/201091145609.shtml http://b

實驗八 應用層協議Ⅱ-FTP協議分析

erl .cn 圖片 ftp連接 ext es2017 用戶 ftp服務 發送 實驗八 應用層協議Ⅱ-FTP協議分析 一、實驗目的 1.掌握FTP協議的實現原理。 2.了解控制通道和數據通道。 二、實驗內容 用WareShark

03002_Http請求協議分析

https agent tomcat doc 菜單 clas 技術 ref http 1、編寫一個form.html的表單頁面   (1)使用EclipseEE新建一個動態的web項目;      (2)Dynamic web module version選擇2,5版本;

TCP與UDP協議分析

war 封裝 cde vpd cto tel image 由器 ase 1 案例1:TCP與UDP協議分析1.1 問題1、通過抓包分析TCP與UDP的封裝格式2、通過抓包分析TCP三次握手1.2 方案1、實驗環境由兩臺主機PC1和PC2組成,PC1使用宿主機,PC2使用VM

ARP協議分析

時間 提交 所有 更新 轉換成 body 充值 命令類型 一個 前言:ARP協議的作用 1、什麽是ARP?    ARP (Address Resolution Protocol) 是個地址解析協議。最直白的說法是:在IP以太網中,當一個上層協議要發包時,有了該節點的IP

mysql日誌分析

技術分享 查詢日誌 ror glob 命令 查看 slow ria alt mysql的日誌分為錯誤日誌、二進制日誌、慢查詢日誌、查詢日誌 1.錯誤日誌 可以通過以下命令,來查看錯誤日誌的文件: show variables like ‘log_error‘; 通過上

協議分析之HTTP

wireshark 協議分析工作 http 一、小試牛刀** http協議是互聯網上應用最為廣泛的一種網絡協議,它工作在應用層,由請求和響應構成,是一個標準的客戶端服務器模型,http是無狀態的協議。我們接下來要做的,是通過網絡嗅探工具來捕獲網絡中傳輸的http包,從分析數據包的角度來學習http

shell腳本實現網絡掃描 自動抓包 協議分析 nmap

shell腳本 nmap 網絡抓包 協議分析 掃描 此文章提供思想基礎用法:關於自動檢測功能,各個端口和抓包功能,項目中使用的為nmap軟件,Linux操作系統,首先我們要安裝nmap的軟件 項目中使用的為nmap-6.40-7.el7.x86_64版本,命令格式為: #nmap [掃

MySQL瓶頸分析與優化

MySQL 優化 簡介通過sysbench的oltp_read_write測試來模擬業務壓力、以此來給指定的硬件環境配置一份比較合理的MySQL配置文件。環境介紹硬件配置軟件環境優化層級與指導思想優化層級MySQL數據庫優化可以在多個不同的層級進行,常見的有:SQL優化參數優化 架構優化本文重點關註:

安卓脫殼&&協議分析&&burp輔助分析插件編寫

自動 ges 程序 ima 到手 插件 無線 gin adb 前言 本文由 本人 首發於 先知安全技術社區: https://xianzhi.aliyun.com/forum/user/5274 本文以一個 app 為例,演示對 app脫殼,然後分析其 協議加密和簽名方

分布式環境中,模塊數據交互協議分析 (百度brpc)

sign short 自己的 source 變量 git character 消息 sock 1. 背景 之前聽到同事說,要為自己的模塊考慮寫個數據協議。今天有空想了一下。寫出來,方便後續使用。 開源代碼brpc中可以支持多種協議,nshead、redis、mongo等20