1. 服务器响应报文(服务器 -> 客户端)
当客户端发起认证请求或命令请求后,服务器会返回相应的执行结果给客户端。客户端在收到响应报文后,需要首先检查第1个字节的值,来区分响应报文的类型。
响应报文类型 | 第1个字节取值范围 |
---|---|
OK 响应报文 | 0x00 |
Error 响应报文 | 0xFF |
EOF 报文 | 0xFE |
Result Set 报文 | 0x01 - 0xFA |
Field 报文 | 0x01 - 0xFA |
Row Data 报文 | 0x01 - 0xFA |
1.1 ok响应报文
ok响应报文是对下面命令的响应:
- COM_PING
- COM_QUERY,条件是查询不需要结果返回设置;譬如:insert,update或者alter table
- COM_REFRESH
- COM_REGISTER_SLAVE
这一类型的包适用于不要求返回结果集的命令。
1.1.1 响应包(除去包头 packet header4个字节)格式:
字节数量 | 说明 |
---|---|
1 | OK报文,值恒为0x00 |
int < lenenc> | 长度编码(length encoded)的整形值,1-9个字节; affected rows 影响行数 |
int < lenenc> | last_insert_id |
int <2> | Status Flags |
int<2> | number of warnings |
1.1.2 举例譬如,请求命令(客户端->服务器):
use test ;//切换数据库,对应命令类型为 COM_INIT_DB
01:18:48.909981 IP (tos 0x8, ttl 64, id 56656, offset 0, flags [DF], proto TCP (6), length 61, bad cksum 0 (->5f60)!)
localhost.52284 > localhost.mysql: Flags [P.], cksum 0xfe31 (incorrect -> 0x3146), seq 350:359, ack 3667, win 12623, options [nop,nop,TS val 1034407982 ecr 1034407982], length 9
0x0000: 4508 003d dd50 4000 4006 0000 7f00 0001 E..=.P@.@.......
0x0010: 7f00 0001 cc3c 0cea 00a0 a735 2265 761f .....<.....5"ev.
0x0020: 8018 314f fe31 0000 0101 080a 3da7 d02e ..1O.1......=...
0x0030: 3da7 d02e 0500 0000 0274 6573 74 =........test
^^----- 02标示COM_INIT_DB命令类型
^^------00标示sequence id是0
^^^^ ^^-----0x05 00 00标示mysql packet payload长度是5
^^^^ ^^^^ ^^---------5个字节的payload
response ip报文
01:18:48.910082 IP (tos 0x0, ttl 64, id 40877, offset 0, flags [DF], proto TCP (6), length 63, bad cksum 0 (->9d09)!)
localhost.mysql > localhost.52284: Flags [P.], cksum 0xfe33 (incorrect -> 0x0aac), seq 3667:3678, ack 359, win 12739, options [nop,nop,TS val 1034407982 ecr 1034407982], length 11
0x0000: 4500 003f 9fad 4000 4006 0000 7f00 0001 E..?..@.@.......
0x0010: 7f00 0001 0cea cc3c 2265 761f 00a0 a73e .......<"ev....>
0x0020: 8018 31c3 fe33 0000 0101 080a 3da7 d02e ..1..3......=...
0x0030: 3da7 d02e 0700 0001 0000 0002 0000 00 =..............
^^ ^^ 2个字节的warning numbers, 此处0 warning
^^ ^^2个字节status flag,0x02 00,标示autocommit = ON
^^last inserted id插入自增序列值,此处标示无
^^-----affected rows = 0x00,0行受影响
^^------ ok报文第一个字节是0x00
^^---- sequence id,响应报文的seq id通常从1开始
^^^^ ^^-----------0x07 00 00标示payload length = 7
ref: https://dev.mysql.com/doc/internals/en/packet-OK_Packet.html
1.2 Error报文
1.3 EOF报文
1.4 Result Set 报文
result set报文比较复杂。上面讲的ok/error/eof报文只有一个packet。而 result set报文是由多个packet按照特定顺序组合而成。
COM_QUERY_Response: 按照类型可以分为4种
- a ERR_Packet
- a OK_Packet
- a Protocol::LOCAL_INFILE_Request
- a ProtocolText::Resultset
其中,ProtocolText::Resultset格式定义如下:
- A packet containing a Protocol::LengthEncodedInteger column_count
- column_count * Protocol::ColumnDefinition packets
- If the CLIENT_DEPRECATE_EOF client capability flag is not set, EOF_Packet
- One or more ProtocolText::ResultsetRow packets, each containing column_count values
- ERR_Packet in case of error. Otherwise: If the CLIENT_DEPRECATE_EOF client capability flag is set, OK_Packet; else EOF_Packet.
If the SERVER_MORE_RESULTS_EXISTS flag is set in the last EOF_Packet or (if the CLIENT_DEPRECATE_EOF capability flag is set) OK_Packet, another ProtocolText::Resultset will follow (see Multi-resultset).
详情请见:
https://dev.mysql.com/doc/internals/en/com-query-response.html#packet-Protocol::ColumnDefinition
举例:https://dev.mysql.com/doc/internals/en/protocoltext-resultset.html
2. 参考
1,http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/
2,https://dev.mysql.com/doc/internals/en/com-query-response.html#packet-Protocol::ColumnDefinition