国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Linux C/C++下抓包分析mysql流量(協(xié)議解析)

這篇具有很好參考價值的文章主要介紹了Linux C/C++下抓包分析mysql流量(協(xié)議解析)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

MySQL通信協(xié)議是一個有狀態(tài)的協(xié)議,主要用于MySQL客戶端與服務器之間的通信。這個協(xié)議在MySQL客戶端連接器(如Connector/C、Connector/J等)、MySQL Proxy以及主從復制中都有實現(xiàn)。

該協(xié)議的特性包括:支持SSL、壓縮和認證等功能。

MySQL客戶端和服務端的交互過程主要分為兩個階段:握手認證階段和命令執(zhí)行階段。
在握手認證階段,服務端會生成一些服務信息,包括協(xié)議號、server版本、線程id、加密隨機數(shù)(seeds)和服務端能力flag等信息??蛻舳藙t會生成認證信息,包含客戶端能力flag、用戶名、加密密碼和連接數(shù)據(jù)庫名字等信息。然后,服務端返回認證結果,如果驗證正確,則返回OK包,否則是異常包。

此外,MySQL通信協(xié)議還支持多種進程間通信方式,例如管道、命名管道、共享內(nèi)存、TCP/IP套接字和UNIX域套接字等。在實際應用中,可以使用諸如Wireshark的工具來抓取并分析MySQL協(xié)議。

mysql協(xié)議握手過程

MySQL協(xié)議的握手過程包括客戶端和服務器之間的交互流程。下面是該過程的概述:

  1. 客戶端向服務器發(fā)送連接請求。

  2. 服務器接收到連接請求后,返回一個握手數(shù)據(jù)包給客戶端。
    Linux C/C++下抓包分析mysql流量(協(xié)議解析),C/C++,c語言,c++,mysql,協(xié)議解析,網(wǎng)絡安全

  3. 客戶端收到握手數(shù)據(jù)包后,解析其中的信息,包括服務器版本、連接狀態(tài)等。

  4. 客戶端根據(jù)握手數(shù)據(jù)包中的信息,確定需要使用的協(xié)議版本,并發(fā)送一個握手響應數(shù)據(jù)包給服務器。
    Linux C/C++下抓包分析mysql流量(協(xié)議解析),C/C++,c語言,c++,mysql,協(xié)議解析,網(wǎng)絡安全

  5. 服務器接收到握手響應數(shù)據(jù)包后,驗證客戶端的身份和權限,并回復一個認證結果給客戶端。

  6. 客戶端接收到認證結果后,根據(jù)結果進行相應的處理,如關閉連接或進入下一步驟。
    Linux C/C++下抓包分析mysql流量(協(xié)議解析),C/C++,c語言,c++,mysql,協(xié)議解析,網(wǎng)絡安全

  7. 如果認證成功,客戶端和服務器之間開始正常的通信,可以進行后續(xù)的查詢、插入等數(shù)據(jù)庫操作。

  8. 客戶端將查詢結果返回給服務器,服務器接收到結果并返回給客戶端。
    Linux C/C++下抓包分析mysql流量(協(xié)議解析),C/C++,c語言,c++,mysql,協(xié)議解析,網(wǎng)絡安全Linux C/C++下抓包分析mysql流量(協(xié)議解析),C/C++,c語言,c++,mysql,協(xié)議解析,網(wǎng)絡安全

  9. 斷開連接請求
    Linux C/C++下抓包分析mysql流量(協(xié)議解析),C/C++,c語言,c++,mysql,協(xié)議解析,網(wǎng)絡安全
    MySQL開啟SSL加密協(xié)議的交互流程

Linux C/C++下抓包分析mysql流量(協(xié)議解析),C/C++,c語言,c++,mysql,協(xié)議解析,網(wǎng)絡安全

  1. 服務器配置SSL:首先,MySQL服務器需要配置SSL證書和密鑰。服務器會生成自己的SSL證書,并將證書和密鑰配置到MySQL服務器的配置文件中。

  2. 客戶端請求加密連接:客戶端連接MySQL服務器時,需要在連接字符串中指定使用SSL協(xié)議。例如,可以在連接命令中添加--ssl參數(shù),或者在連接配置文件中設置ssl-mode為"required"。

  3. 服務器握手協(xié)商:當服務器接收到客戶端的連接請求并請求使用SSL協(xié)議時,服務器會回復一個握手數(shù)據(jù)包,其中包含服務器的SSL證書和其他SSL參數(shù)。

  4. 客戶端驗證證書:客戶端收到服務器的握手數(shù)據(jù)包后,會驗證服務器的SSL證書??蛻舳藭z查證書是否合法且由受信任的發(fā)行機構簽署。如果證書有效,則繼續(xù)連接。

  5. 服務器驗證客戶端證書:如果服務器需要驗證客戶端的SSL證書,服務器會要求客戶端提供SSL證書,并對證書進行驗證。如果驗證成功,則繼續(xù)連接。

  6. SSL連接建立:在驗證過程完成后,雙方開始使用SSL協(xié)議進行通信,所有的數(shù)據(jù)傳輸都會被加密。
    Linux C/C++下抓包分析mysql流量(協(xié)議解析),C/C++,c語言,c++,mysql,協(xié)議解析,網(wǎng)絡安全

通過以上的握手和驗證過程,MySQL客戶端和服務器建立了一個安全的加密連接,確保數(shù)據(jù)在傳輸過程中的機密性和完整性。

mysql客戶端/服務器功能

#define MYSQL_CAPS_LP 0x0001 /* CLIENT_LONG_PASSWORD */
#define MYSQL_CAPS_FR 0x0002 /* CLIENT_FOUND_ROWS */
#define MYSQL_CAPS_LF 0x0004 /* CLIENT_LONG_FLAG */
#define MYSQL_CAPS_CD 0x0008 /* CLIENT_CONNECT_WITH_DB */
#define MYSQL_CAPS_NS 0x0010 /* CLIENT_NO_SCHEMA */
#define MYSQL_CAPS_CP 0x0020 /* CLIENT_COMPRESS */
#define MYSQL_CAPS_OB 0x0040 /* CLIENT_ODBC */
#define MYSQL_CAPS_LI 0x0080 /* CLIENT_LOCAL_FILES */
#define MYSQL_CAPS_IS 0x0100 /* CLIENT_IGNORE_SPACE */
#define MYSQL_CAPS_CU 0x0200 /* CLIENT_PROTOCOL_41 */
#define MYSQL_CAPS_IA 0x0400 /* CLIENT_INTERACTIVE */
#define MYSQL_CAPS_SL 0x0800 /* CLIENT_SSL */
#define MYSQL_CAPS_II 0x1000 /* CLIENT_IGNORE_SPACE */
#define MYSQL_CAPS_TA 0x2000 /* CLIENT_TRANSACTIONS */
#define MYSQL_CAPS_RS 0x4000 /* CLIENT_RESERVED */
#define MYSQL_CAPS_SC 0x8000 /* CLIENT_SECURE_CONNECTION */

mysql客戶端和服務器之間的通信怎么實現(xiàn)?協(xié)議特征有哪些?

MySQL客戶端和服務器之間的通信是通過TCP/IP協(xié)議實現(xiàn)的。以下是MySQL協(xié)議的一些特征:

  1. 基于請求-響應模型:通信過程中,客戶端發(fā)送請求到服務器,服務器進行處理后返回響應給客戶端。

  2. 二進制協(xié)議:MySQL協(xié)議使用二進制格式進行傳輸,每個數(shù)據(jù)報文都包含了特定的字段結構以及相應的數(shù)據(jù)類型。

  3. 數(shù)據(jù)報文格式:數(shù)據(jù)報文由固定長度的報頭和可變長度的有效載荷(payload)組成。報頭包含了協(xié)議版本、連接ID、數(shù)據(jù)長度等信息。

  4. 多線程支持:MySQL協(xié)議支持多個線程在同一個連接上并發(fā)執(zhí)行多個查詢。服務器會為每個線程分配一個線程ID。

  5. 長連接:MySQL協(xié)議支持長連接,即客戶端和服務器之間的連接可以保持開放狀態(tài),減少了連接和斷開連接的開銷。

  6. SQL語句支持:MySQL協(xié)議可以發(fā)送SQL語句(如查詢語句、事務語句等)到服務器執(zhí)行,并接收服務器返回的結果集。

  7. 錯誤處理:MySQL協(xié)議支持服務器返回錯誤信息,包括錯誤代碼和錯誤描述,以便客戶端處理異常情況。

  8. 安全連接:MySQL協(xié)議支持通過SSL/TLS進行通信加密,保護會話數(shù)據(jù)的安全性。

mysql服務器狀態(tài)(位字段)

#define MYSQL_STAT_IT 0x0001
#define MYSQL_STAT_AC 0x0002
#define MYSQL_STAT_MR 0x0004
#define MYSQL_STAT_MU 0x0008
#define MYSQL_STAT_BI 0x0010
#define MYSQL_STAT_NI 0x0020
#define MYSQL_STAT_CR 0x0040
#define MYSQL_STAT_LR 0x0080
#define MYSQL_STAT_DR 0x0100
#define MYSQL_STAT_BS 0x0200
#define MYSQL_STAT_SESSION_STATE_CHANGED 0x0400
#define MYSQL_STAT_QUERY_WAS_SLOW 0x0800
#define MYSQL_STAT_PS_OUT_PARAMS 0x1000

MySQL命令代碼

#define MYSQL_SLEEP 0 /* not from client */
#define MYSQL_QUIT 1
#define MYSQL_INIT_DB 2
#define MYSQL_QUERY 3
#define MYSQL_FIELD_LIST 4
#define MYSQL_CREATE_DB 5
#define MYSQL_DROP_DB 6
#define MYSQL_REFRESH 7
#define MYSQL_SHUTDOWN 8
#define MYSQL_STATISTICS 9
#define MYSQL_PROCESS_INFO 10
#define MYSQL_CONNECT 11 /* not from client */
#define MYSQL_PROCESS_KILL 12
#define MYSQL_DEBUG 13
#define MYSQL_PING 14
#define MYSQL_TIME 15         /* not from client */
#define MYSQL_DELAY_INSERT 16 /* not from client */
#define MYSQL_CHANGE_USER 17
#define MYSQL_BINLOG_DUMP 18    /* replication */
#define MYSQL_TABLE_DUMP 19     /* replication */
#define MYSQL_CONNECT_OUT 20    /* replication */
#define MYSQL_REGISTER_SLAVE 21 /* replication */
#define MYSQL_STMT_PREPARE 22
#define MYSQL_STMT_EXECUTE 23
#define MYSQL_STMT_SEND_LONG_DATA 24
#define MYSQL_STMT_CLOSE 25
#define MYSQL_STMT_RESET 26
#define MYSQL_SET_OPTION 27
#define MYSQL_STMT_FETCH 28

MySQL提供了多個命令用于執(zhí)行數(shù)據(jù)庫操作。下面列舉了一些常用的MySQL命令及其作用:

  1. USE <database_name>:切換到指定的數(shù)據(jù)庫。

  2. SHOW DATABASES:列出所有可用的數(shù)據(jù)庫。

  3. SHOW TABLES:列出當前數(shù)據(jù)庫中的所有表。

  4. SHOW COLUMNS FROM <table_name>:列出指定表的所有字段。

  5. SELECT <column_names> FROM <table_name> WHERE <condition>:從指定表中查詢符合條件的數(shù)據(jù)。

  6. INSERT INTO <table_name> (<column_names>) VALUES (<values>):向指定表中插入新的行。

  7. UPDATE <table_name> SET <column_name>=<new_value> WHERE <condition>:更新指定表中符合條件的行。

  8. DELETE FROM <table_name> WHERE <condition>:從指定表中刪除符合條件的行。

  9. ALTER TABLE <table_name> ADD COLUMN <column_definition>:向指定表中添加新的列。

  10. CREATE TABLE <table_name> (<column_definitions>):創(chuàng)建一個新的表。

  11. DROP TABLE <table_name>:刪除指定的表。

  12. GRANT <privileges> ON <table_name> TO <user_name>@<host_name>:授予用戶對指定表的權限。

  13. REVOKE <privileges> ON <table_name> FROM <user_name>@<host_name>:從用戶中撤銷對指定表的權限。

  14. DESCRIBE <table_name>EXPLAIN <table_name>:顯示指定表的詳細結構信息。

以上只是一些常見的MySQL命令,還有更多的命令可以用于執(zhí)行復雜的數(shù)據(jù)庫操作,如合并、分組、排序、連接等。MySQL命令的具體作用取決于使用的上下文和參數(shù)。

mysql數(shù)據(jù)報文類型分析

static const struct val_str mysql_state_table[] = {
    {UNDEFINED, "undefined"},
    {LOGIN, "login"},
    {REQUEST, "request"},
    {RESPONSE_OK, "response OK"},
    {RESPONSE_MESSAGE, "response message"},
    {RESPONSE_TABULAR, "tabular response"},
    {RESPONSE_SHOW_FIELDS, "response to SHOW FIELDS"},
    {FIELD_PACKET, "field packet"},
    {ROW_PACKET, "row packet"},
    {RESPONSE_PREPARE, "response to PREPARE"},
    {PREPARED_PARAMETERS, "parameters in response to PREPARE"},
    {PREPARED_FIELDS, "fields in response to PREPARE"},
    {AUTH_SWITCH_REQUEST, "authentication switch request"},
    {AUTH_SWITCH_RESPONSE, "authentication switch response"},
    {0, NULL}};

MySQL協(xié)議數(shù)據(jù)報文類型主要有以下幾種:

  • 連接請求報文(Handshake Packet)

連接請求報文用于建立客戶端與服務器之間的連接。其字段含義如下:
Protocol Version(協(xié)議版本):表示客戶端和服務器之間使用的MySQL協(xié)議版本,例如5.7.21表示使用MySQL 5.7.21版本的協(xié)議。
Server Version(服務器版本):表示服務器的MySQL版本信息。
Connection ID(連接ID):表示客戶端與服務器之間的連接標識符。
Salt(鹽值):用于加密連接密碼的隨機字符串。
Session Capabilities(會話能力):表示客戶端支持的會話特性,如事務、多語句執(zhí)行等。
Charset(字符集):表示客戶端與服務器之間通信所使用的字符編碼方式。
Client Capabilities(客戶端能力):表示客戶端支持的特性,如支持的SQL語法、插件等。

  • 查詢請求報文(Query Packet)

查詢請求報文用于向服務器發(fā)送SQL查詢語句。其字段含義如下:
Command Type(命令類型):表示查詢請求的類型,值為0x03表示普通查詢請求。
Status Code(狀態(tài)碼):表示服務器處理請求的結果,0表示成功,其他值表示錯誤。
Protocol Version(協(xié)議版本):表示客戶端和服務器之間使用的MySQL協(xié)議版本。
Message(消息):表示服務器返回的關于請求處理結果的詳細信息,通常包含錯誤信息或警告信息。
Fields Present(字段存在標志):表示數(shù)據(jù)包中實際存在的字段數(shù)量。
Column Count(列數(shù)):表示響應結果中的列的數(shù)量。
Row Data(行數(shù)據(jù)):包含查詢結果的每一行數(shù)據(jù)。

  • 關閉連接報文(Terminate Packet)

關閉連接報文用于終止客戶端與服務器之間的連接。其字段含義如下:
Status Code(狀態(tài)碼):表示服務器處理請求的結果,0表示成功,其他值表示錯誤。
Reason(原因):表示關閉連接的原因,如正常關閉、超時等。
Protocol Version(協(xié)議版本):表示客戶端和服務器之間使用的MySQL協(xié)議版本。

MySQL的基本數(shù)據(jù)類型

MySQL的基本數(shù)據(jù)類型包括:

  • 1.數(shù)值數(shù)據(jù)類型:

整數(shù)類型:包括TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,這些類型占用字節(jié)數(shù)(存儲空間)從小到大。
浮點小數(shù)數(shù)據(jù)類型:包括FLOAT和DOUBLE。
定點小數(shù)類型:用DECIMAL(M,N)表示,其中M表示精度、總共的位數(shù);N表示標度、小數(shù)的位數(shù)。

  • 2.日期和時間數(shù)據(jù)類型:

YEAR
DATE
TIME
DATETIME
TIMESTAMP

  • 3.字符串數(shù)據(jù)類型:

CHAR:定長字符串,最大長度為255個字符。
VARCHAR:可變長字符串,最大長度為65535個字符。
TINYTEXT:非常小的文本字符串,最大長度為255個字符。
TEXT:小型文本字符串,最大長度為65535個字符。
BINARY:二進制字符串,最大長度為65535個字符。
VARBINARY:可變長二進制字符串,最大長度為65535個字符。

  • 4.二進制數(shù)據(jù)類型:

BINARY、VARBINARY、BIT、TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB。

這些基本類型為MySQL提供了豐富的數(shù)據(jù)表達方式。在使用MySQL時,可以根據(jù)需要選擇合適的數(shù)據(jù)類型來存儲數(shù)據(jù)。

Linux C/C++下抓包分析mysql流量(協(xié)議解析)

...
#define MYSQL_CAPS_LP 0x0001 /* CLIENT_LONG_PASSWORD */
#define MYSQL_CAPS_FR 0x0002 /* CLIENT_FOUND_ROWS */
#define MYSQL_CAPS_LF 0x0004 /* CLIENT_LONG_FLAG */
#define MYSQL_CAPS_CD 0x0008 /* CLIENT_CONNECT_WITH_DB */
#define MYSQL_CAPS_NS 0x0010 /* CLIENT_NO_SCHEMA */
#define MYSQL_CAPS_CP 0x0020 /* CLIENT_COMPRESS */
#define MYSQL_CAPS_OB 0x0040 /* CLIENT_ODBC */
#define MYSQL_CAPS_LI 0x0080 /* CLIENT_LOCAL_FILES */
#define MYSQL_CAPS_IS 0x0100 /* CLIENT_IGNORE_SPACE */
#define MYSQL_CAPS_CU 0x0200 /* CLIENT_PROTOCOL_41 */
#define MYSQL_CAPS_IA 0x0400 /* CLIENT_INTERACTIVE */
#define MYSQL_CAPS_SL 0x0800 /* CLIENT_SSL */
#define MYSQL_CAPS_II 0x1000 /* CLIENT_IGNORE_SPACE */
#define MYSQL_CAPS_TA 0x2000 /* CLIENT_TRANSACTIONS */
#define MYSQL_CAPS_RS 0x4000 /* CLIENT_RESERVED */
#define MYSQL_CAPS_SC 0x8000 /* CLIENT_SECURE_CONNECTION */

/* field flags */
#define MYSQL_FLD_NOT_NULL_FLAG 0x0001
#define MYSQL_FLD_PRI_KEY_FLAG 0x0002
#define MYSQL_FLD_UNIQUE_KEY_FLAG 0x0004
#define MYSQL_FLD_MULTIPLE_KEY_FLAG 0x0008
#define MYSQL_FLD_BLOB_FLAG 0x0010
#define MYSQL_FLD_UNSIGNED_FLAG 0x0020
#define MYSQL_FLD_ZEROFILL_FLAG 0x0040
#define MYSQL_FLD_BINARY_FLAG 0x0080
#define MYSQL_FLD_ENUM_FLAG 0x0100
#define MYSQL_FLD_AUTO_INCREMENT_FLAG 0x0200
#define MYSQL_FLD_TIMESTAMP_FLAG 0x0400
#define MYSQL_FLD_SET_FLAG 0x0800
...
#define MYSQL_CAPS_MS 0x0001 /* CLIENT_MULTI_STATMENTS */
#define MYSQL_CAPS_MR 0x0002 /* CLIENT_MULTI_RESULTS */
#define MYSQL_CAPS_PM 0x0004 /* CLIENT_PS_MULTI_RESULTS */
#define MYSQL_CAPS_PA 0x0008 /* CLIENT_PLUGIN_AUTH */
#define MYSQL_CAPS_CA 0x0010 /* CLIENT_CONNECT_ATTRS */
#define MYSQL_CAPS_AL 0x0020 /* CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA */
#define MYSQL_CAPS_EP 0x0040 /* CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS */
#define MYSQL_CAPS_ST 0x0080 /* CLIENT_SESSION_TRACK */
#define MYSQL_CAPS_DE 0x0100 /* CLIENT_DEPRECATE_EOF */
#define MYSQL_CAPS_UNUSED 0xFE00

/* status bitfield */
#define MYSQL_STAT_IT 0x0001
#define MYSQL_STAT_AC 0x0002
#define MYSQL_STAT_MR 0x0004
#define MYSQL_STAT_MU 0x0008
#define MYSQL_STAT_BI 0x0010
#define MYSQL_STAT_NI 0x0020
#define MYSQL_STAT_CR 0x0040
#define MYSQL_STAT_LR 0x0080
#define MYSQL_STAT_DR 0x0100
#define MYSQL_STAT_BS 0x0200
#define MYSQL_STAT_SESSION_STATE_CHANGED 0x0400
#define MYSQL_STAT_QUERY_WAS_SLOW 0x0800
#define MYSQL_STAT_PS_OUT_PARAMS 0x1000

/* bitfield for MYSQL_REFRESH */
#define MYSQL_RFSH_GRANT 1    /* Refresh grant tables */
#define MYSQL_RFSH_LOG 2      /* Start on new log file */
#define MYSQL_RFSH_TABLES 4   /* close all tables */
#define MYSQL_RFSH_HOSTS 8    /* Flush host cache */
#define MYSQL_RFSH_STATUS 16  /* Flush status variables */
#define MYSQL_RFSH_THREADS 32 /* Flush thread cache */
#define MYSQL_RFSH_SLAVE 64   /* Reset master info and restart slave thread */
#define MYSQL_RFSH_MASTER 128 /* Remove all bin logs in the index and truncate the index */

/* MySQL command codes */
#define MYSQL_SLEEP 0 /* not from client */
#define MYSQL_QUIT 1
#define MYSQL_INIT_DB 2
#define MYSQL_QUERY 3
#define MYSQL_FIELD_LIST 4
#define MYSQL_CREATE_DB 5
#define MYSQL_DROP_DB 6
#define MYSQL_REFRESH 7
#define MYSQL_SHUTDOWN 8
#define MYSQL_STATISTICS 9
#define MYSQL_PROCESS_INFO 10
#define MYSQL_CONNECT 11 /* not from client */
#define MYSQL_PROCESS_KILL 12
#define MYSQL_DEBUG 13
#define MYSQL_PING 14
#define MYSQL_TIME 15         /* not from client */
#define MYSQL_DELAY_INSERT 16 /* not from client */
#define MYSQL_CHANGE_USER 17
#define MYSQL_BINLOG_DUMP 18    /* replication */
#define MYSQL_TABLE_DUMP 19     /* replication */
#define MYSQL_CONNECT_OUT 20    /* replication */
#define MYSQL_REGISTER_SLAVE 21 /* replication */
#define MYSQL_STMT_PREPARE 22
#define MYSQL_STMT_EXECUTE 23
#define MYSQL_STMT_SEND_LONG_DATA 24
#define MYSQL_STMT_CLOSE 25
#define MYSQL_STMT_RESET 26
#define MYSQL_SET_OPTION 27
#define MYSQL_STMT_FETCH 28
...

static void mysql_dissect_auth_switch_request(struct buffer *buf, mysql_conn_data_t *conn_data);
static void mysql_dissect_auth_switch_response(struct buffer *buf, mysql_conn_data_t *conn_data);
static void mysql_dissect_error_packet(struct buffer *buf);
static void mysql_set_conn_state(mysql_conn_data_t *conn_data, mysql_state_t state);
static void mysql_dissect_greeting(struct buffer *buf, mysql_conn_data_t *conn_data);
static void mysql_dissect_login(struct buffer *buf, mysql_conn_data_t *conn_data);
static int mysql_dissect_attributes(struct buffer *buf);
static void mysql_dissect_request(struct buffer *buf, mysql_conn_data_t *conn_data);
static void mysql_dissect_response(struct buffer *buf, mysql_conn_data_t *conn_data);
static void mysql_dissect_result_header(struct buffer *buf, mysql_conn_data_t *conn_data);
static void mysql_dissect_ok_packet(struct buffer *buf, mysql_conn_data_t *conn_data);
static void mysql_dissect_field_packet(struct buffer *buf, mysql_conn_data_t *conn_data);
static int mysql_dissect_session_tracker_entry(struct buffer *buf);
static void mysql_dissect_row_packet(struct buffer *buf);
static void mysql_dissect_exec_string(struct buffer *buf, uint8_t param_unsigned, int *param_idx);
static void mysql_dissect_exec_time(struct buffer *buf, uint8_t param_unsigned, int *param_idx);
static void mysql_dissect_exec_datetime(struct buffer *buf, uint8_t param_unsigned, int *param_idx);
static void mysql_dissect_exec_tiny(struct buffer *buf, uint8_t param_unsigned, int *param_idx);
static void mysql_dissect_exec_short(struct buffer *buf, uint8_t param_unsigned, int *param_idx);
static void mysql_dissect_exec_long(struct buffer *buf, uint8_t param_unsigned, int *param_idx);
static void mysql_dissect_exec_float(struct buffer *buf, uint8_t param_unsigned, int *param_idx);
static void mysql_dissect_exec_double(struct buffer *buf, uint8_t param_unsigned, int *param_idx);
static void mysql_dissect_exec_longlong(struct buffer *buf, uint8_t param_unsigned, int *param_idx);
static void mysql_dissect_exec_null(struct buffer *buf, uint8_t param_unsigned, int *param_idx);
static char mysql_dissect_exec_param(struct buffer *buf, int *param_idx, uint8_t param_flags);
static void mysql_dissect_response_prepare(struct buffer *buf, mysql_conn_data_t *conn_data);
static void mysql_print_bytes(const char *payload, size_t size);
...

int main(int argc, char **argv)
{
...
    while (opt != -1)
    {
        switch (opt)
        {
        case 'i':
            opts->interface = strdup(optarg);
            assert(opts->interface);
            break;
        case 'p':

            i += snprintf(opts->expression + i, max_filter_sz - i - 1, "tcp and ( port 0 ");
            assert(i <= max_filter_sz - 1);
            while ((port = strsep(&optarg, ",")) != NULL)
            {
                if (port)
                {
                    if (!atoi(port))
                    {
                        LOG_ERROR("端口號有誤 %s", port);
                        goto free;
                    }
                    opts->mysql_server_ports[opts->port_sz++] = atoi(port);
                    i += snprintf(opts->expression + i, max_filter_sz - i - 1, "or port %d ", atoi(port));
                    assert(i <= max_filter_sz - 1);
                    if (opts->port_sz >= max_port_sz)
                    {
                        LOG_ERROR("端口數(shù)超限 max=%d", max_port_sz);
                        break;
                    }
                }
            }
            i += snprintf(opts->expression + i, max_filter_sz - i - 1, ")");
            assert(i <= max_filter_sz - 1);
            break;
        case 'v':
            opts->verbose = !!optarg;
            break;
        case '?':
            usage();
            break;
        default:
            break;
        }
        opt = getopt(argc, argv, optString);
        optarg = str_trim(optarg, "=");
    }
    if (!opts->interface)
    {
        opts->interface = strdup("eth0");
        assert(opts->interface);
    }
...

    struct mysql_ss *ss = mysql_ss_create(opts->mysql_server_ports, opts->port_sz);
    assert(ss);

    struct tcpsniff_opt sniffopt = {
        .snaplen = 65535,
        .pkt_cnt_limit = 0,
        .timeout_limit = 10,
        .device = opts->interface,
        .filter_exp = opts->expression,
        .ud = ss};

...

    mysql_ss_release(ss);
...
}

If you need the complete source code, please add the WeChat number (c17865354792)

運行結果:
Linux C/C++下抓包分析mysql流量(協(xié)議解析),C/C++,c語言,c++,mysql,協(xié)議解析,網(wǎng)絡安全
Linux C/C++下抓包分析mysql流量(協(xié)議解析),C/C++,c語言,c++,mysql,協(xié)議解析,網(wǎng)絡安全
Linux C/C++下抓包分析mysql流量(協(xié)議解析),C/C++,c語言,c++,mysql,協(xié)議解析,網(wǎng)絡安全
Linux C/C++下抓包分析mysql流量(協(xié)議解析),C/C++,c語言,c++,mysql,協(xié)議解析,網(wǎng)絡安全
Linux C/C++下抓包分析mysql流量(協(xié)議解析),C/C++,c語言,c++,mysql,協(xié)議解析,網(wǎng)絡安全

總結

MySQL協(xié)議是MySQL數(shù)據(jù)庫管理系統(tǒng)在客戶端和服務器之間通信時使用的協(xié)議。它規(guī)定了客戶端如何向服務器發(fā)送請求,以及服務器如何向客戶端返回響應。MySQL協(xié)議是一種基于文本的協(xié)議,使用ASCII碼進行通信。

MySQL協(xié)議由多個命令組成,每個命令都有特定的格式和語法規(guī)則。其中包括連接、查詢、插入、更新、刪除等命令,用于實現(xiàn)數(shù)據(jù)庫的各種操作。

在MySQL協(xié)議中,每個命令都以一個“包”的形式傳輸。一個包由多個字段組成,包括命令類型、序列號、參數(shù)等??蛻舳税l(fā)送一個命令包,服務器接收后解析出命令類型和參數(shù),然后執(zhí)行相應的操作并返回響應。

Welcome to follow WeChat official account【程序猿編碼

參考:《MySQL Internals Manual: MySQL Client/Server Protocol》文章來源地址http://www.zghlxwxcb.cn/news/detail-744737.html

到了這里,關于Linux C/C++下抓包分析mysql流量(協(xié)議解析)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 接口協(xié)議之抓包分析 TCP 協(xié)議

    接口協(xié)議之抓包分析 TCP 協(xié)議

    TCP 協(xié)議是在傳輸層中,一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議。 環(huán)境準備 對接口測試工具進行分類,可以如下幾類: 網(wǎng)絡嗅探工具:tcpdump,wireshark 代理工具:fiddler,charles,anyproxyburpsuite,mitmproxy 分析工具:curl,postman,chrome Devtool 抓包分析TCP協(xié)議 tcpd

    2023年04月08日
    瀏覽(23)
  • 【抓包分析tcp協(xié)議】

    【抓包分析tcp協(xié)議】

    1、網(wǎng)絡監(jiān)聽:TcpDump + WireShark(適用偏底層的協(xié)議分析) 2、代理Proxy(適用偏高層的協(xié)議分析,如http) ① 推薦工具:手工測試charles[全平臺]、安全測試burpsuite[全平臺java] ② 自動化測試:mitmproxy ③ 其他代理:fiddler[僅windows、AnyProxy[全平臺] 3、協(xié)議客戶端工具:curl、postman

    2024年02月07日
    瀏覽(27)
  • 抓包分析 TCP 協(xié)議

    抓包分析 TCP 協(xié)議

    TCP 協(xié)議是在傳輸層中,一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議。 對接口測試工具進行分類,可以如下幾類: 網(wǎng)絡嗅探工具:tcpdump,wireshark 代理工具:fiddler,charles,anyproxyburpsuite,mitmproxy 分析工具:curl,postman,chrome Devtool tcpdump tcpdump 是一款將網(wǎng)絡中傳送

    2024年02月19日
    瀏覽(24)
  • Wireshark抓包分析IP協(xié)議

    Wireshark抓包分析IP協(xié)議

    「作者主頁」: 士別三日wyx 「作者簡介」: CSDN top100、阿里云博客專家、華為云享專家、網(wǎng)絡安全領域優(yōu)質創(chuàng)作者 「專欄簡介」: 此文章已錄入專欄《計算機網(wǎng)絡零基礎快速入門》 試驗目的:抓包分析IP協(xié)議的傳輸過程和數(shù)據(jù)分片 操作系統(tǒng):Windows 10 企業(yè)版 抓包工具:W

    2024年02月06日
    瀏覽(21)
  • Wireshark抓包分析ICMP協(xié)議

    Wireshark抓包分析ICMP協(xié)議

    「作者主頁」: 士別三日wyx 「作者簡介」: CSDN top100、阿里云博客專家、華為云享專家、網(wǎng)絡安全領域優(yōu)質創(chuàng)作者 「推薦專欄」: 對網(wǎng)絡安全感興趣的小伙伴可以關注專欄《網(wǎng)絡安全入門到精通》 分析目的:分析ICMP協(xié)議的數(shù)據(jù)格式、報文類型及作用。 操作系統(tǒng):Windows

    2024年02月08日
    瀏覽(19)
  • 使用Wireshark抓包分析TCP協(xié)議

    使用Wireshark抓包分析TCP協(xié)議

    wireshark數(shù)據(jù)包詳細欄每個字段對應的分層。 我們點開這個字段,從該字段中可以看到相鄰兩個設備的MAC地址 本層主要負責將TCP層傳輸下來的數(shù)據(jù)加上目標地址和源地址。 這一層用到了TCP協(xié)議 tcp包頭 每個字段對應的TCP包頭 TCP三次握手示意圖 第一次握手 :客戶端向服務器發(fā)

    2023年04月13日
    瀏覽(27)
  • Wireshark數(shù)據(jù)抓包分析之傳輸層協(xié)議(TCP協(xié)議)

    Wireshark數(shù)據(jù)抓包分析之傳輸層協(xié)議(TCP協(xié)議)

    ? ? ? ? 通過使用wireshark對TCP協(xié)議的數(shù)據(jù)包的抓取分析TCP協(xié)議的具體內(nèi)容 ? ? ? ? 1.需要了解TCP協(xié)議的三次握手過程 ? ? ? ? 2.需要了解TCP協(xié)議的四次揮手的過程 part1:3次握手和4次揮手的數(shù)據(jù)包的獲取 1.通過使用TCP測試工具在機器一中創(chuàng)建服務器,并且進行相應的配置,然

    2024年02月11日
    瀏覽(48)
  • Wireshark抓包分析之ICMP協(xié)議包

    Wireshark抓包分析之ICMP協(xié)議包

    一、 Wireshark簡介:(前身為Ethereal,2006年改名為wireshark) Wireshark 是一個網(wǎng)絡封包分析軟件。網(wǎng)絡封包分析軟件的功能是擷取網(wǎng)絡封包,并盡可能顯示出最為詳細的網(wǎng)絡封包資料。 Wireshark 使用 WinPCAP 作為接口,直接與網(wǎng)卡進行數(shù)據(jù)報文交換。 (一) 功能:可用于網(wǎng)絡流量捕獲

    2024年02月08日
    瀏覽(18)
  • Wireshark數(shù)據(jù)抓包分析之互聯(lián)網(wǎng)協(xié)議(IP協(xié)議)

    Wireshark數(shù)據(jù)抓包分析之互聯(lián)網(wǎng)協(xié)議(IP協(xié)議)

    ? ? ? ? 通過wireshark抓包分析IP協(xié)議的具體內(nèi)容 ? ? ? ? 1.IP地址存在的意義,就是為了彌補mac地址的不足,用于區(qū)分不同的網(wǎng)絡 ? ? ? ? 2.還有一些ip協(xié)議、ip數(shù)據(jù)包這些東西 part1:數(shù)據(jù)包的抓取 1.抓取發(fā)往www.baidu.com的ip數(shù)據(jù)包,略,因為虛擬機無法聯(lián)網(wǎng),這里桌面有現(xiàn)成的

    2024年02月11日
    瀏覽(25)
  • Wireshark數(shù)據(jù)抓包分析之ARP協(xié)議

    Wireshark數(shù)據(jù)抓包分析之ARP協(xié)議

    ? ? ? ? 通過wireshark的數(shù)據(jù)抓包了解這個ARP協(xié)議的具體內(nèi)容 ? ? ? ? 1.Address Resolution Protocol協(xié)議,就是通過目標IP的值,獲取到目標的mac地址的一個協(xié)議 ? ? ? ? 2.ARP協(xié)議的詳細工作過程,下面描述得非常清晰: ? ? ? ? ?3.關于上面提到的ARP緩存表這個東西: (1)首先,這里

    2024年02月11日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包