MySQL协议分析(结合PyMySQL)
MySQL Packets
当MySQL客户端或者服务端发送数据时,它会首先把数据分割成(2^24-1)bytes的包,然后给每个包加上packet header。
类型 | 名称 | 描述 |
---|---|---|
int<3> | payload_length | 负载长度,除了header的4字节 |
int<1> | sequence_id | 序列ID |
string | payload | 实际负载 |
* 当数据大于16M时,payload_length设为 2^24?1 (ff ff ff)
* 序列ID在0~255循环,在新命令开始的时候重置为0
PyMySQL相关代码:
buff = b'' while True: packet_header = self._read_bytes(4) if DEBUG: dump_packet(packet_header) btrl, btrh, packet_number = struct.unpack('ntinue="" d="" debug:="" dev.mysql="" doc="" en="" expected="" got="" https:="" if="" internals="" max_packet_len:="" number="" packet="" packet_number="" pre="" raise="" recv_data="self._read_bytes(bytes_to_read)" self._next_seq_id="(self._next_seq_id" sending-more-than-16mbyte.html="" sequence="" wrong=""> Replication协议
Binlog网络流客户端首先发送一个COM_BINLOG_DUMP类型的包,如成功,Server响应返回Binlog网络流。包负载如下表:
1 COM_BINLOG_DUMP(0x12) Binlog DUMP请求