mysql protocal 2: 响应报文

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个字节)格式:
字节数量说明
1OK报文,值恒为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种

  1. a ERR_Packet
  2. a OK_Packet
  3. a Protocol::LOCAL_INFILE_Request
  4. 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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值