MySQL通信协议栈Java实现-(2)协议包格式

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<lenec>, 命令影响的记录数
3. last_insert_id:int<lenec>,上一次插入的id
如果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<lenec>,状态信息解释
如果status_flags & SERVER_SESSION_STATE_CHANGED 为真{
7. session_state_changes:string<lenec>,会话状态信息
}
} else {
6. info:string<EOF>,状态信息解释
}

你可能感兴趣的:(mysql,通信,协议栈)