В протоколе клиент / сервер MySQL как разделяются сжатые пакеты? - PullRequest
0 голосов
/ 07 июля 2019

Документация по протоколу клиент / сервер MySQL скажем:

Примечание

отправка пакета MySQL размером 2 * 1010От * 24 -5 до 2 24 -1 посредством сжатия приводит как минимум к одному дополнительному сжатому пакету.Если несжатый пакет MySQL подобен

fe ff ff 03 ... -- length = 2^24-2, sequence id = 3

, сжатие приведет к увеличению длины полезной нагрузки до сжатия в заголовке сжатого пакета:

length of mysql packet payload:       2^24-2
length of mysql packet header:        4
length of payload before compression: 2^24+2

, которые нельзя представить в одном сжатом пакете.Вместо этого необходимо отправить два или более пакета.

Я не понимаю, как пакет разбивается.

Сжат ли весь MySQL, а затем отделен?Если да, то как он разбивается, и какую длину поля полезной нагрузки перед сжатием следует установить на

Или пакет MySQL разбивается на куски максимального размера 2 24? -1, а затем отправляются в виде отдельных сжатых пакетов с длиной полезной нагрузки перед сжатием , установленной на ff ff ff во всех, кроме последнего?Кажется, это наиболее вероятный вариант, но я не могу найти какую-либо документацию по этой детали.

Наконец, если это последнее, должен ли максимальный размер пакета предварительного сжатия быть установлен на 2 24 -5, чтобы предотвратить сценарий, подобный следующему:

Payload size: 0x100fffe (0xffffff + 0xffff)

MySQL Packets:
#1: length of payload = ff ff ff (size = 0x1000003)
#2: length of payload = ff ff 00 (size = 0x10003)

Compressed packets:
  MySQL Packet #1:
    #1: length of payload before compression = ff ff ff
    #2: length of payload before compression = 04 00 00
  MySQL Packet #2:
    #1: length of payload before compression = ff ff 00

Здесь 3 пакета сжимаются и отправляются, а не только 2, если пакеты были разделены с максимальным размером 2 24 -5 на уровне пакета MySQL.

...