mysql登录数据包_MySQL通讯协议(2)数据包

MySQL通讯协议(2)数据包

使用MySQL协议发送数据,有两个要求:

将数据分成大小为(2^24−1)字节的数据包

给每个数据块加上一个包头

由于连接的创建和释放都需要耗费资源,所以数据库这种交互频繁,且连接数量不需要特别大的应用场景,一般使用长连接。

使用短连接尚能通过RST判断数据是否读完了,而长连接就不能这么做了,同时由于TCP的特点,数据读写会发生拆包、粘包。所以使用长连接传输数据,必须通过某种方法把要发送的数据告诉接收方。例如HTTP协议head里的CONTENT-LENGTH。也可以通过特殊的符号判断,不过由于消息里可能也会出现这些符号,会发生歧义,所以应用场景受限。还有一种最简单的方法就是每次发送固定长度消息,不够用0填充。

MySQL数据包结构

Type

Name

Description

payload_length

payload的长度,整数类型。不包括包头四个字节

sequence_id

Sequence ID

payload

有效载荷,字符串类型。长度=payload_length

消息包分为两个部分,包头+包体。

包头固定四个字节,前三个字节是整数型的payload长度,第四个是整数型的消息序列号。

包体就是这个包的有效载荷,长度由前三字节指定,内容根据具体场景各不相同。

例如,一个消息为03 00 00 01 01 02 03 04。先读取前四个字节,发现这个消息包体有3个字节,这个消息序号是0,消息内容是01 02 03,后面的04是下一个包的数据。

包体长度

由于包体长度是由三个字节记录的,三个字节能表示的最大值为FF FF FF,即1<24-1=2^24-1=16777215=15.999...M。所以,一个MySQL消息包体不能超过16MB。如果超过16MB,就分多次发送。

消息序号

消息号用来标记每个消息的顺序,会自动增长,并循环。

通用响应包

对于大多数请求,服务端有一些通用的响应包结构。

OK_Packet

命令成功完成后的响消息。

Type

Name

Description

header

[00] 或 [fe]

affected_rows

affected rows 影响行数

last_insert_id

last insert-id 最后插住数据id

if capabilities & CLIENT_PROTOCOL_41 {

warnings

警告数量

} else if capabilities & CLIENT_TRANSACTIONS {

}

info

容易理解的状态信息

}

} else {

info

容易理解的状态信息

}

header:表明这是一个OK还是EOF响应。

capabilities :在创建连接阶段,客户端和服务端交换的字段,用于表示支持哪些特性。

CLIENT_PROTOCOL_41:4.1+版本的客户端使用的协议。

ERR_Packet

Type

Name

Description

header

[ff]

error_code

错误码

if capabilities & CLIENT_PROTOCOL_41 {

sql_state_marker

# marker of the SQL State

sql_state

SQL State

}

error_message

容易理解的错误信息

文章来源: www.oschina.net,作者:丁富贵,版权归原作者所有,如需转载,请联系作者。

原文链接:https://my.oschina.net/u/1013857/blog/3216743

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值