MySQL协议分析
议程协议头协议类型网络协议相关函数NET缓冲VIO缓冲MySQLAPI
协议头
● 数据变成在网络里传输的数据,需要额外的在头部添加4 个字节的包头.
. packet length(3字节), 包体的长度
. packet number(1字节), 从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
○ 避免binaryunsafe string, 字符串的长度保存在字符串的前面
■ length<251 1 byte■ length<256^2 3 byte(第一个byte是252)
■ length<256^3 4byte(第一个byte是253)
■else 9byte(第一个byte是254)
handshake packet
● 该协议由服务端发送客户端