2. 协议包格式
MySQL client和MySQL server之间要想传输数据,必须:
1. 将数据切分成若干个大小不超过字节(16MB)的packet里面
2. 将每一个数据包封装一个包头
2.1. 数据包结构
Type
Name
Description
int<3>
payload_length
负载数据长度,除了包头的前4字节剩余的长度
int<1>
sequence_id
序列号
string
payload
长度为payload_length的字符串
注意:
当传输大于16MB的数据包时,payload_length为,并且还有其他的包包含剩余的数据,直到有一个包的数据量少于为止。
序列号:序列号随着包增长并且可以循环利用。序列号从0开始,在MySQL command(MySQL命令)阶段时,每次有新的命令,就会有新的序列号。
2.2. 基本响应包
2.2.1. OK Packet
服务器用OK Packet来告诉客户端一条命令执行成功了。在MySQL5.7.5中,OK Packet用来标识EOF,EOF Packet废弃不用了。
结构:
1. header:int<1> ,包头:内容为[00]或者[fe]
2. affected_rows: int
3. last_insert_id:int
如果capabilities & CLIENT_PROTOCOL_41为真 {
4. status_flags:int<2>,状态位
5. warnings:int<2>,waring个数
}或者如果capabilities & CLIENT_TRANSACTIONS为真
4. status_flags:int<2>,状态位
}
如果capabilities & CLIENT_SESSION_TRACK为真{
6. info:string
如果status_flags & SERVER_SESSION_STATE_CHANGED 为真{
7. session_state_changes:string
}
} else {
6. info:string
}