电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

怒肝两个月MySQL源码总结出这篇2W字的MySQL协议详解

36页
  • 卖家[上传人]:I***
  • 文档编号:190129586
  • 上传时间:2021-08-09
  • 文档格式:DOCX
  • 文档大小:248.48KB
  • / 36 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 1、 怒肝两个月MySQL源码,总结出这篇2W字的MySQL协议详解 导读最近,在开发一个分库分表中间件,由于功能需求,需要分析MySQL协议,发现网上对于MySQL协议分析的文章大部分都过时了,原因是分析的MySQL版本太低了。怎么办?于是乎,我便硬着头皮开始啃MySQL源码,经过两个多月的整理,终于总结出这篇MySQL协议!写在前面最近,在开发一个分库分表中间件,由于功能需求,需要分析MySQL协议,发现网上对于MySQL协议分析的文章大部分都过时了,原因是分析的MySQL版本太低了。怎么办呢?于是乎,我便硬着头皮开始啃MySQL源码,经过两个多月的整理,终于总结出这篇MySQL协议。注:部分来自于互联网,感谢数据库大牛前辈们的默默付出!交互过程MySQL客户端与服务器的交互主要分为两个阶段:握手认证阶段和命令执行阶段。握手认证阶段握手认证阶段为客户端与服务器建立连接后进行,交互过程如下: 服务器 - 客户端:握手初始化消息 客户端 - 服务器:登陆认证消息 服务器 - 客户端:认证结果消息命令执行阶段客户端认证成功后,会进入命令执行阶段,交互过程如下: 客户端 - 服务器:执行命令消

      2、息 服务器 - 客户端:命令执行结果MySQL客户端与服务器的完整交互过程如下:基本类型整型值MySQL报文中整型值分别有1、2、3、4、8字节长度,使用小字节序传输。字符串(以NULL结尾)(Null-Terminated String)字符串长度不固定,当遇到NULL(0x00)字符时结束。二进制数据(长度编码)(Length Coded Binary)数据长度不固定,长度值由数据前的1-9个字节决定,其中长度值所占的字节数不定,字节数由第1个字节决定,如下表:第一个字节值后续字节数长度值说明0-2500第一个字节值即为数据的真实长度2510空数据,数据的真实长度为零2522后续额外2个字节标识了数据的真实长度2533后续额外3个字节标识了数据的真实长度2548后续额外8个字节标识了数据的真实长度字符串(长度编码)(Length Coded String)字符串长度不固定,无NULL(0x00)结束符,编码方式与上面的 Length Coded Binary 相同。报文结构报文分为消息头和消息体两部分,其中消息头占用固定的4个字节,消息体长度由消息头中的长度字段决定,报文结构如下:

      3、消息头报文长度用于标记当前请求消息的实际数据长度值,以字节为单位,占用3个字节,最大值为 0xFFFFFF,即接近 16 MB 大小(比16MB少1个字节)。序号在一次完整的请求/响应交互过程中,用于保证消息顺序的正确,每次客户端发起请求时,序号值都会从0开始计算。消息体消息体用于存放请求的内容及响应的数据,长度由消息头中的长度值决定。报文类型登陆认证交互报文握手初始化报文(服务器 - 客户端)服务协议版本号:该值由 PROTOCOL_VERSION 宏定义决定(参考MySQL源代码/include/mysql_version.h头文件定义)服务版本信息:该值为字符串,由 MYSQL_SERVER_VERSION 宏定义决定(参考MySQL源代码/include/mysql_version.h头文件定义)服务器线程ID:服务器为当前连接所创建的线程ID。挑战随机数:MySQL数据库用户认证采用的是挑战/应答的方式,服务器生成该挑战数并发送给客户端,由客户端进行处理并返回相应结果,然后服务器检查是否与预期的结果相同,从而完成用户认证的过程。服务器权能标志:用于与客户端协商通讯方式,各标志

      4、位含义如下(参考MySQL源代码/include/mysql_com.h中的宏定义):标志位名称标志位说明CLIENT_LONG_PASSWORD0x0001new more secure passwordsCLIENT_FOUND_ROWS0x0002Found instead of affected rowsCLIENT_LONG_FLAG0x0004Get all column flagsCLIENT_CONNECT_WITH_DB0x0008One can specify db on connectCLIENT_NO_SCHEMA0x0010Do not allow database.table.columnCLIENT_COMPRESS0x0020Can use compression protocolCLIENT_ODBC0x0040Odbc clientCLIENT_LOCAL_FILES0x0080Can use LOAD DATA LOCALCLIENT_IGNORE_SPACE0x0100Ignore spaces before (CLIENT_PROTOCOL_4

      5、10x0200New 4.1 protocolCLIENT_INTERACTIVE0x0400This is an interactive clientCLIENT_SSL0x0800Switch to SSL after handshakeCLIENT_IGNORE_SIGPIPE0x1000IGNORE sigpipesCLIENT_TRANSACTIONS0x2000Client knows about transactionsCLIENT_RESERVED0x4000Old flag for 4.1 protocolCLIENT_SECURE_CONNECTION0x8000New 4.1 authenticationCLIENT_MULTI_STATEMENTS0x0001 0000Enable/disable multi-stmt supportCLIENT_MULTI_RESULTS0x0002 0000Enable/disable multi-results字符编码:标识服务器所使用的字符集。服务器状态:状态值定义如下(参考MySQL源代码/include/mysql_

      6、com.h中的宏定义):状态名称状态值SERVER_STATUS_IN_TRANS0x0001SERVER_STATUS_AUTOCOMMIT0x0002SERVER_STATUS_CURSOR_EXISTS0x0040SERVER_STATUS_LAST_ROW_SENT0x0080SERVER_STATUS_DB_DROPPED0x0100SERVER_STATUS_NO_BACKSLASH_ESCAPES0x0200SERVER_STATUS_METADATA_CHANGED0x0400登陆认证报文(客户端 - 服务器)MySQL 4.0 及之前的版本MySQL 4.1 及之后的版本客户端权能标志:用于与客户端协商通讯方式,标志位含义与握手初始化报文中的相同。客户端收到服务器发来的初始化报文后,会对服务器发送的权能标志进行修改,保留自身所支持的功能,然后将权能标返回给服务器,从而保证服务器与客户端通讯的兼容性。最大消息长度:客户端发送请求报文时所支持的最大消息长度值。字符编码:标识通讯过程中使用的字符编码,与服务器在认证初始化报文中发送的相同。用户名:客户端登陆用户的用户名称。挑

      7、战认证数据:客户端用户密码使用服务器发送的挑战随机数进行加密后,生成挑战认证数据,然后返回给服务器,用于对用户身份的认证。数据库名称:当客户端的权能标志位 CLIENT_CONNECT_WITH_DB 被置位时,该字段必须出现。客户端命令请求报文(客户端 - 服务器)命令:用于标识当前请求消息的类型,例如切换数据库(0x02)、查询命令(0x03)等。命令值的取值范围及说明如下表(参考MySQL源代码/include/mysql_com.h头文件中的定义):类型值命令功能关联函数0x00COM_SLEEP(内部线程状态)(无)0x01COM_QUIT关闭连接mysql_close0x02COM_INIT_DB切换数据库mysql_select_db0x03COM_QUERYSQL查询请求mysql_real_query0x04COM_FIELD_LIST获取数据表字段信息mysql_list_fields0x05COM_CREATE_DB创建数据库mysql_create_db0x06COM_DROP_DB删除数据库mysql_drop_db0x07COM_REFRESH清除缓存mys

      8、ql_refresh0x08COM_SHUTDOWN停止服务器mysql_shutdown0x09COM_STATISTICS获取服务器统计信息mysql_stat0x0ACOM_PROCESS_INFO获取当前连接的列表mysql_list_processes0x0BCOM_CONNECT(内部线程状态)(无)0x0CCOM_PROCESS_KILL中断某个连接mysql_kill0x0DCOM_DEBUG保存服务器调试信息mysql_dump_debug_info0x0ECOM_PING测试连通性mysql_ping0x0FCOM_TIME(内部线程状态)(无)0x10COM_DELAYED_INSERT(内部线程状态)(无)0x11COM_CHANGE_USER重新登陆(不断连接)mysql_change_user0x12COM_BINLOG_DUMP获取二进制日志信息(无)0x13COM_TABLE_DUMP获取数据表结构信息(无)0x14COM_CONNECT_OUT(内部线程状态)(无)0x15COM_REGISTER_SLAVE从服务器向主服务器进行注册(无)0x16COM_STMT_PREPARE预处理SQL语句mysql_stmt_prepare0x17COM_STMT_EXECUTE执行预处理语句mysql_stmt_execute0x18COM_STMT_SEND_LONG_DATA发送BLOB类型的数据mysql_stmt_send_long_data0x19COM_STMT_CLOSE销毁预处理语句mysql_stmt_close0x1ACOM_STMT_RESET清除预处理语句参数缓存mysql_stmt_reset0x1BCOM_SET_OPTION设置语句选项mysql_set_server_option0x1CCOM_STMT_FETCH获取预处理语句的执行结果mysql_stmt_fetch参数:内容是用户在MyS

      《怒肝两个月MySQL源码总结出这篇2W字的MySQL协议详解》由会员I***分享,可在线阅读,更多相关《怒肝两个月MySQL源码总结出这篇2W字的MySQL协议详解》请在金锄头文库上搜索。

      点击阅读更多内容
    最新标签
    监控施工 信息化课堂中的合作学习结业作业七年级语文 发车时刻表 长途客运 入党志愿书填写模板精品 庆祝建党101周年多体裁诗歌朗诵素材汇编10篇唯一微庆祝 智能家居系统本科论文 心得感悟 雁楠中学 20230513224122 2022 公安主题党日 部编版四年级第三单元综合性学习课件 机关事务中心2022年全面依法治区工作总结及来年工作安排 入党积极分子自我推荐 世界水日ppt 关于构建更高水平的全民健身公共服务体系的意见 空气单元分析 哈里德课件 2022年乡村振兴驻村工作计划 空气教材分析 五年级下册科学教材分析 退役军人事务局季度工作总结 集装箱房合同 2021年财务报表 2022年继续教育公需课 2022年公需课 2022年日历每月一张 名词性从句在写作中的应用 局域网技术与局域网组建 施工网格 薪资体系 运维实施方案 硫酸安全技术 柔韧训练 既有居住建筑节能改造技术规程 建筑工地疫情防控 大型工程技术风险 磷酸二氢钾 2022年小学三年级语文下册教学总结例文 少儿美术-小花 2022年环保倡议书模板六篇 2022年监理辞职报告精选 2022年畅想未来记叙文精品 企业信息化建设与管理课程实验指导书范本 草房子读后感-第1篇 小数乘整数教学PPT课件人教版五年级数学上册 2022年教师个人工作计划范本-工作计划 国学小名士经典诵读电视大赛观后感诵读经典传承美德 医疗质量管理制度 2
    关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
    手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
    ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.