- 1、本文档共22页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
MySQL协议分析
MySQL协议分析
@hoterran
议程
协议头
协议类型
网络协议相关函数
NET缓冲
VIO缓冲
MySQL api
协议头
● 数据变成在网络里传输的数据,需要额外的在头部添加4个
字节的包头.
1. packet length(3字节), 包体的长度
2. packet number(1字节), 从0开始的递增的,到了255又从0开始.
● sql “select 1” 的网络协议是?
协议头
● packet length
三个字节意味着MySQL packet最大16M
大于16M则被分包(net_write_command, my_net_write)
● packet number
分包从0开始,依次递增.
每一次执行sql, packet_number清零(sql/net_serv.c:net_clear)
协议类型
● handshake
● auth
● ok|error
● resultset
○ header
○ field
○ eof
○ row
● command packet
连接时的交互
协议说明
● 协议内字段分三种形式
○ 固定长度(include/my_global.h)
■ uint*korr 解包
■ int*store 封包
○ length coded binary(sql-common/pack.c)
■ net_field_length 解包
■ net_store_length 封包
○ null-terminated string
● length coded binary
避免binary unsafe string, 字符串的长度保存在字符串的前面
■ length251 1 byte
■ length 256^2 3 byte(第一个byte是252)
■ length256^3 4byte(第一个byte是253)
■ else 9byte(第一个byte是254)
handshake packet
● 该协议 由服务端发送客户端
● 括号内为字节数,字节数为n为
是null-terminated string;字节数
为大写的N表示length code binary.
● salt就是scramble.分成两个部
分是为了兼容4.1版本
● sql_connect.cc:check_connection
● sql_client.c:mysql_real_connect
auth packet
● 该协议是从客户端对密码使用
scramble加密后发送到服务端
● 其中databasename是可选的.
salt就是加密后的密码.
● sql_client.c:mysql_real_connect
● sql_connect.c:check_connection
ok packet
● ok包,命令和insert,update,
delete的返回结果
● 包体首字节为0.
● insert_id, affect_rows也是
一并发过来.
● src/protocol.cc:net_send_ok
error packet
● 错误的命令,非法的sql的返回包
● 包体首字节为255.
● error code就是CR_***,include/errmsg.h
● sqlstate marker是#
● sqlstate是错误状态,include/sql_state.h
文档评论(0)