• Linux C/C++下抓包分析mysql流量(协议解析)


    MySQL通信协议是一个有状态的协议,主要用于MySQL客户端与服务器之间的通信。这个协议在MySQL客户端连接器(如Connector/C、Connector/J等)、MySQL Proxy以及主从复制中都有实现。

    该协议的特性包括:支持SSL、压缩和认证等功能。

    MySQL客户端和服务端的交互过程主要分为两个阶段:握手认证阶段和命令执行阶段。
    在握手认证阶段,服务端会生成一些服务信息,包括协议号、server版本、线程id、加密随机数(seeds)和服务端能力flag等信息。客户端则会生成认证信息,包含客户端能力flag、用户名、加密密码和连接数据库名字等信息。然后,服务端返回认证结果,如果验证正确,则返回OK包,否则是异常包。

    此外,MySQL通信协议还支持多种进程间通信方式,例如管道、命名管道、共享内存、TCP/IP套接字和UNIX域套接字等。在实际应用中,可以使用诸如Wireshark的工具来抓取并分析MySQL协议。

    mysql协议握手过程

    MySQL协议的握手过程包括客户端和服务器之间的交互流程。下面是该过程的概述:

    1. 客户端向服务器发送连接请求。

    2. 服务器接收到连接请求后,返回一个握手数据包给客户端。

    3. 客户端收到握手数据包后,解析其中的信息,包括服务器版本、连接状态等。

    4. 客户端根据握手数据包中的信息,确定需要使用的协议版本,并发送一个握手响应数据包给服务器。

    5. 服务器接收到握手响应数据包后,验证客户端的身份和权限,并回复一个认证结果给客户端。

    6. 客户端接收到认证结果后,根据结果进行相应的处理,如关闭连接或进入下一步骤。

    7. 如果认证成功,客户端和服务器之间开始正常的通信,可以进行后续的查询、插入等数据库操作。

    8. 客户端将查询结果返回给服务器,服务器接收到结果并返回给客户端。

    9. 断开连接请求

      MySQL开启SSL加密协议的交互流程

    1. 服务器配置SSL:首先,MySQL服务器需要配置SSL证书和密钥。服务器会生成自己的SSL证书,并将证书和密钥配置到MySQL服务器的配置文件中。

    2. 客户端请求加密连接:客户端连接MySQL服务器时,需要在连接字符串中指定使用SSL协议。例如,可以在连接命令中添加--ssl参数,或者在连接配置文件中设置ssl-mode为"required"。

    3. 服务器握手协商:当服务器接收到客户端的连接请求并请求使用SSL协议时,服务器会回复一个握手数据包,其中包含服务器的SSL证书和其他SSL参数。

    4. 客户端验证证书:客户端收到服务器的握手数据包后,会验证服务器的SSL证书。客户端会检查证书是否合法且由受信任的发行机构签署。如果证书有效,则继续连接。

    5. 服务器验证客户端证书:如果服务器需要验证客户端的SSL证书,服务器会要求客户端提供SSL证书,并对证书进行验证。如果验证成功,则继续连接。

    6. SSL连接建立:在验证过程完成后,双方开始使用SSL协议进行通信,所有的数据传输都会被加密。

    通过以上的握手和验证过程,MySQL客户端和服务器建立了一个安全的加密连接,确保数据在传输过程中的机密性和完整性。

    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 */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    mysql客户端和服务器之间的通信怎么实现?协议特征有哪些?

    MySQL客户端和服务器之间的通信是通过TCP/IP协议实现的。以下是MySQL协议的一些特征:

    1. 基于请求-响应模型:通信过程中,客户端发送请求到服务器,服务器进行处理后返回响应给客户端。

    2. 二进制协议:MySQL协议使用二进制格式进行传输,每个数据报文都包含了特定的字段结构以及相应的数据类型。

    3. 数据报文格式:数据报文由固定长度的报头和可变长度的有效载荷(payload)组成。报头包含了协议版本、连接ID、数据长度等信息。

    4. 多线程支持:MySQL协议支持多个线程在同一个连接上并发执行多个查询。服务器会为每个线程分配一个线程ID。

    5. 长连接:MySQL协议支持长连接,即客户端和服务器之间的连接可以保持开放状态,减少了连接和断开连接的开销。

    6. SQL语句支持:MySQL协议可以发送SQL语句(如查询语句、事务语句等)到服务器执行,并接收服务器返回的结果集。

    7. 错误处理:MySQL协议支持服务器返回错误信息,包括错误代码和错误描述,以便客户端处理异常情况。

    8. 安全连接:MySQL协议支持通过SSL/TLS进行通信加密,保护会话数据的安全性。

    mysql服务器状态(位字段)

    #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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    MySQL提供了多个命令用于执行数据库操作。下面列举了一些常用的MySQL命令及其作用:

    1. USE :切换到指定的数据库。

    2. SHOW DATABASES:列出所有可用的数据库。

    3. SHOW TABLES:列出当前数据库中的所有表。

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

    5. SELECT FROM WHERE :从指定表中查询符合条件的数据。

    6. INSERT INTO () VALUES ():向指定表中插入新的行。

    7. UPDATE SET = WHERE :更新指定表中符合条件的行。

    8. DELETE FROM WHERE :从指定表中删除符合条件的行。

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

    10. CREATE TABLE ():创建一个新的表。

    11. DROP TABLE :删除指定的表。

    12. GRANT ON TO @:授予用户对指定表的权限。

    13. REVOKE ON FROM @:从用户中撤销对指定表的权限。

    14. DESCRIBE EXPLAIN :显示指定表的详细结构信息。

    以上只是一些常见的MySQL命令,还有更多的命令可以用于执行复杂的数据库操作,如合并、分组、排序、连接等。MySQL命令的具体作用取决于使用的上下文和参数。

    mysql数据报文类型分析

    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}};
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    MySQL协议数据报文类型主要有以下几种:

    • 连接请求报文(Handshake Packet)

    连接请求报文用于建立客户端与服务器之间的连接。其字段含义如下:
    Protocol Version(协议版本):表示客户端和服务器之间使用的MySQL协议版本,例如5.7.21表示使用MySQL 5.7.21版本的协议。
    Server Version(服务器版本):表示服务器的MySQL版本信息。
    Connection ID(连接ID):表示客户端与服务器之间的连接标识符。
    Salt(盐值):用于加密连接密码的随机字符串。
    Session Capabilities(会话能力):表示客户端支持的会话特性,如事务、多语句执行等。
    Charset(字符集):表示客户端与服务器之间通信所使用的字符编码方式。
    Client Capabilities(客户端能力):表示客户端支持的特性,如支持的SQL语法、插件等。

    • 查询请求报文(Query Packet)

    查询请求报文用于向服务器发送SQL查询语句。其字段含义如下:
    Command Type(命令类型):表示查询请求的类型,值为0x03表示普通查询请求。
    Status Code(状态码):表示服务器处理请求的结果,0表示成功,其他值表示错误。
    Protocol Version(协议版本):表示客户端和服务器之间使用的MySQL协议版本。
    Message(消息):表示服务器返回的关于请求处理结果的详细信息,通常包含错误信息或警告信息。
    Fields Present(字段存在标志):表示数据包中实际存在的字段数量。
    Column Count(列数):表示响应结果中的列的数量。
    Row Data(行数据):包含查询结果的每一行数据。

    • 关闭连接报文(Terminate Packet)

    关闭连接报文用于终止客户端与服务器之间的连接。其字段含义如下:
    Status Code(状态码):表示服务器处理请求的结果,0表示成功,其他值表示错误。
    Reason(原因):表示关闭连接的原因,如正常关闭、超时等。
    Protocol Version(协议版本):表示客户端和服务器之间使用的MySQL协议版本。

    MySQL的基本数据类型

    MySQL的基本数据类型包括:

    • 1.数值数据类型:

    整数类型:包括TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,这些类型占用字节数(存储空间)从小到大。
    浮点小数数据类型:包括FLOAT和DOUBLE。
    定点小数类型:用DECIMAL(M,N)表示,其中M表示精度、总共的位数;N表示标度、小数的位数。

    • 2.日期和时间数据类型:

    YEAR
    DATE
    TIME
    DATETIME
    TIMESTAMP

    • 3.字符串数据类型:

    CHAR:定长字符串,最大长度为255个字符。
    VARCHAR:可变长字符串,最大长度为65535个字符。
    TINYTEXT:非常小的文本字符串,最大长度为255个字符。
    TEXT:小型文本字符串,最大长度为65535个字符。
    BINARY:二进制字符串,最大长度为65535个字符。
    VARBINARY:可变长二进制字符串,最大长度为65535个字符。

    • 4.二进制数据类型:

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

    这些基本类型为MySQL提供了丰富的数据表达方式。在使用MySQL时,可以根据需要选择合适的数据类型来存储数据。

    Linux C/C++下抓包分析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 */
    
    /* 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("端口数超限 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);
    ...
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201

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

    运行结果:




    总结

    MySQL协议是MySQL数据库管理系统在客户端和服务器之间通信时使用的协议。它规定了客户端如何向服务器发送请求,以及服务器如何向客户端返回响应。MySQL协议是一种基于文本的协议,使用ASCII码进行通信。

    MySQL协议由多个命令组成,每个命令都有特定的格式和语法规则。其中包括连接、查询、插入、更新、删除等命令,用于实现数据库的各种操作。

    在MySQL协议中,每个命令都以一个“包”的形式传输。一个包由多个字段组成,包括命令类型、序列号、参数等。客户端发送一个命令包,服务器接收后解析出命令类型和参数,然后执行相应的操作并返回响应。

    Welcome to follow WeChat official account【程序猿编码

    参考:《MySQL Internals Manual: MySQL Client/Server Protocol》

  • 相关阅读:
    markdown语法简述
    JavaScript游戏恢复
    【GO-OpenCV】go-cv快速配置
    GO语言规范
    JavaScript
    想要写出好的测试用例,先要学会测试设计
    bean的生命周期
    计算机毕业设计ssm电子书店管理系统ya226系统+程序+源码+lw+远程部署
    解读 --- System.Windows.Forms.Timer是前台线程吗?
    python 方法加强@ pytho中@ python@
  • 原文地址:https://blog.csdn.net/chen1415886044/article/details/134171886