52.7. Форматы сообщений#

52.7. Форматы сообщений

52.7. Форматы сообщений #

Этот раздел описывает подробный формат каждого сообщения. Каждое сообщение помечено, чтобы указать, что оно может быть отправлено клиентом (F), сервером (B) или и клиентом, и сервером (F & B). Обратите внимание, что хотя каждое сообщение включает количество байт в начале, формат сообщения определен таким образом, что конец сообщения можно найти без ссылки на количество байт. Это помогает проверке корректности. (Сообщение CopyData является исключением, потому что оно является частью потоковых данных; содержимое каждого отдельного сообщения CopyData не может быть интерпретировано самостоятельно).

AuthenticationOk (B) #
Byte1('R')

Определяет сообщение как запрос аутентификации.

Int32(8)

Длина содержимого сообщения в байтах, включая само сообщение.

Int32(0)

Указывает, что аутентификация прошла успешно.

AuthenticationKerberosV5 (B) #
Byte1('R')

Определяет сообщение как запрос аутентификации.

Int32(8)

Длина содержимого сообщения в байтах, включая само сообщение.

Int32(2)

Указывает, что требуется аутентификация Kerberos V5.

AuthenticationCleartextPassword (B) #
Byte1('R')

Определяет сообщение как запрос аутентификации.

Int32(8)

Длина содержимого сообщения в байтах, включая само сообщение.

Int32(3)

Указывает, что требуется пароль в открытом виде.

AuthenticationMD5Password (B) #
Byte1('R')

Определяет сообщение как запрос аутентификации.

Int32(12)

Длина содержимого сообщения в байтах, включая само сообщение.

Int32(5)

Указывает, что требуется пароль, зашифрованный с использованием алгоритма MD5.

Byte4

Соль, используемая при шифровании пароля.

AuthenticationGSS (B) #
Byte1('R')

Определяет сообщение как запрос аутентификации.

Int32(8)

Длина содержимого сообщения в байтах, включая само сообщение.

Int32(7)

Указывает, что требуется аутентификация GSSAPI.

AuthenticationGSSContinue (B) #
Byte1('R')

Определяет сообщение как запрос аутентификации.

Int32

Длина содержимого сообщения в байтах, включая само сообщение.

Int32(8)

Указывает, что это сообщение содержит данные GSSAPI или SSPI.

Byten

Данные аутентификации GSSAPI или SSPI.

AuthenticationSSPI (B) #
Byte1('R')

Определяет сообщение как запрос аутентификации.

Int32(8)

Длина содержимого сообщения в байтах, включая само сообщение.

Int32(9)

Указывает, что требуется аутентификация SSPI.

AuthenticationSASL (B) #
Byte1('R')

Определяет сообщение как запрос аутентификации.

Int32

Длина содержимого сообщения в байтах, включая само сообщение.

Int32(10)

Указывает, что требуется аутентификация SASL.

Тело сообщения представляет собой список механизмов аутентификации SASL в порядке предпочтения сервера. После последнего имени механизма аутентификации требуется нулевой байт в качестве завершителя. Для каждого механизма имеется следующее:

String

Имя механизма аутентификации SASL.

AuthenticationSASLContinue (B) #
Byte1('R')

Определяет сообщение как запрос аутентификации.

Int32

Длина содержимого сообщения в байтах, включая само сообщение.

Int32(11)

Указывает, что это сообщение содержит вызов SASL.

Byten

Данные SASL, специфичные для используемого механизма SASL.

AuthenticationSASLFinal (B) #
Byte1('R')

Определяет сообщение как запрос аутентификации.

Int32

Длина содержимого сообщения в байтах, включая само сообщение.

Int32(12)

Указывает, что аутентификация SASL завершена.

Byten

Результат SASL "дополнительные данные", специфичные для используемого механизма SASL.

BackendKeyData (B) #
Byte1('K')

Определяет сообщение как данные ключа отмены. Фронтенд должен сохранить эти значения, если он хочет иметь возможность отправлять сообщения CancelRequest позже.

Int32(12)

Длина содержимого сообщения в байтах, включая само сообщение.

Int32

Идентификатор процесса этого бэкенда.

Int32

Секретный ключ этого бэкенда.

Bind (F) #
Byte1('B')

Идентифицирует сообщение как команду Bind.

Int32

Длина содержимого сообщения в байтах, включая само сообщение.

String

Имя целевого портала (пустая строка выбирает безымянный портал).

String

Имя подготовленного оператора источника (пустая строка выбирает безымянный подготовленный оператор).

Int16

Количество кодов формата параметров, следующих (обозначено как C ниже). Это может быть ноль, чтобы указать, что параметров нет или что все параметры используют формат по умолчанию (текст); или один, в этом случае указанный код формата применяется ко всем параметрам; или он может быть равен фактическому количеству параметров.

Int16[C]

Коды формата параметров. Каждый из них должен быть либо нулевым (текстовым), либо единичным (бинарным).

Int16

Количество значений параметров, которые следуют (возможно, ноль). Это должно соответствовать количеству параметров, необходимых для запроса.

Далее, для каждого параметра появляется следующая пара полей:

Int32

Длина значения параметра в байтах (этот счетчик не включает само значение). Может быть равна нулю. В особом случае значение -1 указывает на NULL значение параметра. В случае NULL значения, за ним не следуют байты значения.

Byten

Значение параметра в формате, указанном соответствующим кодом формата. n - это вышеуказанная длина.

После последнего параметра появляются следующие поля:

Int16

Количество кодов формата столбцов результата, которые следуют (обозначено R ниже). Это может быть ноль, чтобы указать, что нет столбцов результата или что все столбцы результата должны использовать формат по умолчанию (текст); или один, в этом случае указанный код формата применяется ко всем столбцам результата (если они есть); или он может быть равен фактическому количеству столбцов результата запроса.

Int16[R]

Форматы кодов столбцов результата. Каждый из них должен быть в настоящее время нулевым (текстовым) или единичным (бинарным).

BindComplete (B) #
Byte1('2')

Идентифицирует сообщение как индикатор завершения привязки.

Int32(4)

Длина содержимого сообщения в байтах, включая само сообщение.

CancelRequest (F) #
Int32(16)

Длина содержимого сообщения в байтах, включая само сообщение.

Int32(80877102)

Код запроса на отмену. Значение выбирается таким образом, чтобы в старших 16 битах содержалось значение 1234, а в младших 16 битах - значение 5678. (Для избежания путаницы этот код не должен совпадать с номером версии протокола).

Int32

Идентификатор процесса целевого бэкенда.

Int32

Секретный ключ для целевого бэкенда.

Close (F) #
Byte1('C')

Идентифицирует сообщение как команду Close.

Int32

Длина содержимого сообщения в байтах, включая само сообщение.

Byte1

'S' для закрытия подготовленного оператора; или 'P' для закрытия портала.

String

Имя подготовленного оператора или портала для закрытия (пустая строка выбирает безымянный подготовленный оператор или портал).

CloseComplete (B) #
Byte1('3')

Идентифицирует сообщение как индикатор завершения закрытия.

Int32(4)

Длина содержимого сообщения в байтах, включая само сообщение.

CommandComplete (B) #
Byte1('C')

Идентифицирует сообщение как ответ на выполнение команды.

Int32

Длина содержимого сообщения в байтах, включая само сообщение.

String

Тег команды. Обычно это одно слово, которое определяет, какая SQL-команда была выполнена.

Для команды INSERT тег выглядит так: INSERT oid rows, где rows - это количество вставленных строк. Раньше oid использовался для идентификатора объекта вставленной строки, если rows было равно 1 и целевая таблица имела OID, но системные столбцы OID больше не поддерживаются, поэтому oid всегда равно 0.

Для команды DELETE тег выглядит следующим образом: DELETE rows, где rows - это количество удаленных строк.

Для команды UPDATE тег выглядит следующим образом: UPDATE rows, где rows - это количество обновленных строк.

Для команды MERGE, тегом является MERGE rows, где rows - это количество строк, вставленных, обновленных или удаленных.

Для команды SELECT или CREATE TABLE AS тегом является SELECT rows, где rows - это количество извлеченных строк.

Для команды MOVE тегом является MOVE rows, где rows - это количество строк, на которое изменилось положение курсора.

Для команды FETCH тегом является FETCH rows, где rows - это количество строк, которые были извлечены из курсора.

Для команды COPY тег выглядит так: COPY rows, где rows - это количество скопированных строк. (Примечание: количество строк отображается только в Tantor BE версии 8.2 и выше).

CopyData (F & B) #
Byte1('d')

Идентифицирует сообщение как данные COPY.

Int32

Длина содержимого сообщения в байтах, включая само сообщение.

Byten

Данные, которые являются частью потоковых данных COPY. Сообщения, отправленные с бэкенда, всегда соответствуют отдельным строкам данных, но сообщения, отправленные фронтендами, могут произвольно разделять потоковые данные.

CopyDone (F & B) #
Byte1('c')

Идентифицирует сообщение как индикатор COPY-завершения.

Int32(4)

Длина содержимого сообщения в байтах, включая само сообщение.

CopyFail (F) #
Byte1('f')

Идентифицирует сообщение как индикатор COPY-ошибки.

Int32

Длина содержимого сообщения в байтах, включая само сообщение.

String

Сообщение об ошибке, которое будет использоваться в качестве причины сбоя.

CopyInResponse (B) #
Byte1('G')

Определяет сообщение как ответ на начало копирования. Фронтенд теперь должен отправить данные для копирования (если не готов к этому, отправьте сообщение CopyFail).

Int32

Длина содержимого сообщения в байтах, включая само сообщение.

Int8

0 указывает на то, что общий формат COPY является текстовым (строки разделены новыми строками, столбцы разделены разделительными символами и т. д.). 1 указывает на то, что общий формат копирования является двоичным (аналогично формату DataRow). См. COPY для получения дополнительной информации.

Int16

Количество столбцов в данных, которые будут скопированы (обозначено N ниже).

Int16[N]

Форматные коды, которые будут использоваться для каждого столбца. Каждый из них должен быть нулем (текстовый) или единицей (бинарный). Все они должны быть нулями, если общий формат копирования является текстовым.

CopyOutResponse (B) #
Byte1('H')

Определяет сообщение как ответ Start Copy Out. Это сообщение будет сопровождаться данными copy-out.

Int32

Длина содержимого сообщения в байтах, включая само сообщение.

Int8

0 указывает, что общий формат COPY является текстовым (строки разделены новыми строками, столбцы разделены символами-разделителями и т. д.). 1 указывает, что общий формат копирования является двоичным (аналогично формату DataRow). См. COPY для получения дополнительной информации.

Int16

Количество столбцов в данных, которые будут скопированы (обозначено N ниже).

Int16[N]

Форматные коды, которые будут использоваться для каждого столбца. Каждый из них должен быть нулем (текстовый) или единицей (бинарный). Все они должны быть нулями, если общий формат копирования является текстовым.

CopyBothResponse (B) #
Byte1('W')

Определяет сообщение как ответ Start Copy Both. Это сообщение используется только для потоковой репликации.

Int32

Длина содержимого сообщения в байтах, включая само сообщение.

Int8

0 указывает, что общий формат COPY является текстовым (строки разделены новыми строками, столбцы разделены символами-разделителями и т. д.). 1 указывает, что общий формат копирования является двоичным (аналогично формату DataRow). См. COPY для получения дополнительной информации.

Int16

Количество столбцов в данных, которые будут скопированы (обозначено N ниже).

Int16[N]

Форматные коды, которые будут использоваться для каждого столбца. Каждый из них должен быть нулем (текстовый) или единицей (бинарный). Все они должны быть нулями, если общий формат копирования является текстовым.

DataRow (B) #
Byte1('D')

Идентифицирует сообщение как строку данных.

Int32

Длина содержимого сообщения в байтах, включая само сообщение.

Int16

Количество значений столбцов, которые следуют (возможно, ноль).

Следующая пара полей появляется для каждого столбца:

Int32

Длина значения столбца в байтах (этот счетчик не включает само значение). Может быть равна нулю. В особом случае значение -1 указывает на NULL значение столбца. В случае NULL значения нет последующих байтов значения.

Byten

Значение столбца в формате, указанном соответствующим кодом формата. n - это вышеуказанная длина.

Describe (F) #
Byte1('D')

Определяет сообщение как команду Describe.

Int32

Длина содержимого сообщения в байтах, включая само сообщение.

Byte1

'S' для описания подготовленного оператора; или 'P' для описания портала.

String

Имя подготовленного оператора или портала для описания (пустая строка выбирает безымянный подготовленный оператор или портал).

EmptyQueryResponse (B) #
Byte1('I')

Определяет сообщение как ответ на пустую строку запроса. (Это заменяет CommandComplete).

Int32(4)

Длина содержимого сообщения в байтах, включая само сообщение.

ErrorResponse (B) #
Byte1('E')

Идентифицирует сообщение как ошибку.

Int32

Длина содержимого сообщения в байтах, включая само сообщение.

Тело сообщения состоит из одного или нескольких идентифицированных полей, за которыми следует нулевой байт в качестве завершителя. Поля могут появляться в любом порядке. Для каждого поля имеется следующее:

Byte1

Код, идентифицирующий тип поля; если равен нулю, это является завершающим символом сообщения и за ним не следует строка. В настоящее время определенные типы полей перечислены в Раздел 52.8. Поскольку в будущем могут быть добавлены дополнительные типы полей, клиентские приложения должны молча игнорировать поля с неизвестным типом.

String

Содержимое поля.

Execute (F) #
Byte1('E')

Идентифицирует сообщение как команду Execute.

Int32

Длина содержимого сообщения в байтах, включая само сообщение.

String

Имя портала для выполнения (пустая строка выбирает безымянный портал).

Int32

Максимальное количество строк для возврата, если портал содержит запрос, который возвращает строки (в противном случае игнорируется). Ноль обозначает отсутствие ограничений.

Flush (F) #
Byte1('H')

Идентифицирует сообщение как команду Flush.

Int32(4)

Длина содержимого сообщения в байтах, включая само сообщение.

FunctionCall (F) #
Byte1('F')

Идентифицирует сообщение как вызов функции.

Int32

Длина содержимого сообщения в байтах, включая само сообщение.

Int32

Указывает идентификатор объекта функции для вызова.

Int16

Количество кодов формата аргументов, следующих за ними (обозначено как C ниже). Это может быть ноль, чтобы указать, что аргументов нет или что все аргументы используют формат по умолчанию (текст); или один, в этом случае указанный код формата применяется ко всем аргументам; или он может быть равен фактическому количеству аргументов.

Int16[C]

Коды формата аргумента. Каждый из них должен быть либо нулевым (текстовым), либо единичным (бинарным).

Int16

Определяет количество аргументов, передаваемых в функцию.

Далее, для каждого аргумента появляется следующая пара полей:

Int32

Длина значения аргумента, в байтах (этот счетчик не включает само значение). Может быть равна нулю. В особом случае значение -1 указывает на NULL значение аргумента. В случае NULL значения, за ним не следуют байты значения.

Byten

Значение аргумента в формате, указанном связанным кодом формата. n - это вышеуказанная длина.

После последнего аргумента появляется следующее поле:

Int16

Формат кода для результата функции. В настоящее время должен быть нулевым (текстовым) или единичным (бинарным).

FunctionCallResponse (B) #
Byte1('V')

Определяет сообщение как результат вызова функции.

Int32

Длина содержимого сообщения в байтах, включая само сообщение.

Int32

Длина значения результата функции в байтах (этот счетчик не включает само значение). Может быть равна нулю. В особом случае значение -1 указывает на NULL-значение результата функции. В случае NULL-значения нет последующих байтов значения.

Byten

Значение результата функции в формате, указанном соответствующим кодом формата. n - это вышеуказанная длина.

GSSENCRequest (F) #
Int32(8)

Длина содержимого сообщения в байтах, включая само сообщение.

Int32(80877104)

Код запроса на шифрование GSSAPI. Значение выбирается таким образом, чтобы содержать 1234 в старших 16 битах и 5680 в младших 16 битах. (Чтобы избежать путаницы, этот код не должен совпадать с номером версии протокола).

GSSResponse (F) #
Byte1('p')

Определяет сообщение как ответ GSSAPI или SSPI. Обратите внимание, что это также используется для сообщений ответа SASL и пароля. Точный тип сообщения можно определить из контекста.

Int32

Длина содержимого сообщения в байтах, включая само сообщение.

Byten

Специфичные данные сообщения GSSAPI/SSPI.

NegotiateProtocolVersion (B) #
Byte1('v')

Определяет сообщение как сообщение о согласовании версии протокола.

Int32

Длина содержимого сообщения в байтах, включая само сообщение.

Int32

Новейшая вспомогательная версия протокола, поддерживаемая сервером для основной версии протокола, запрошенной клиентом.

Int32

Количество параметров протокола, не распознанных сервером.

Затем, для протокольной опции, не распознанной сервером, имеется следующее:

String

Имя опции.

NoData (B) #
Byte1('n')

Идентифицирует сообщение как индикатор отсутствия данных.

Int32(4)

Длина содержимого сообщения в байтах, включая само сообщение.

NoticeResponse (B) #
Byte1('N')

Идентифицирует сообщение как уведомление.

Int32

Длина содержимого сообщения в байтах, включая само сообщение.

Тело сообщения состоит из одного или нескольких идентифицированных полей, за которыми следует нулевой байт в качестве завершителя. Поля могут появляться в любом порядке. Для каждого поля имеется следующее:

Byte1

Код, идентифицирующий тип поля; если равен нулю, это является завершающим символом сообщения и за ним не следует строка. В настоящее время определенные типы полей перечислены в Раздел 52.8. Поскольку в будущем могут быть добавлены дополнительные типы полей, клиентские приложения должны молча игнорировать поля с неизвестным типом.

String

Содержимое поля.

NotificationResponse (B) #
Byte1('A')

Определяет сообщение как ответ на уведомление.

Int32

Длина содержимого сообщения в байтах, включая само сообщение.

Int32

Идентификатор процесса уведомляющего бэкенд-процесса.

String

Имя канала, на котором было вызвано уведомление.

String

Строка payload, переданная уведомляющим процессом.

ParameterDescription (B) #
Byte1('t')

Определяет сообщение как описание параметра.

Int32

Длина содержимого сообщения в байтах, включая само сообщение.

Int16

Количество параметров, используемых в операторе (может быть нулевым).

Затем, для каждого параметра, имеется следующее:

Int32

Указывает идентификатор объекта типа данных параметра.

ParameterStatus (B) #
Byte1('S')

Определяет сообщение как отчет о статусе параметра времени выполнения.

Int32

Длина содержимого сообщения в байтах, включая само сообщение.

String

Имя отчетного параметра времени выполнения.

String

Текущее значение параметра.

Parse (F) #
Byte1('P')

Идентифицирует сообщение как команду Parse.

Int32

Длина содержимого сообщения в байтах, включая само сообщение.

String

Имя целевого подготовленного оператора (пустая строка выбирает безымянный подготовленный оператор).

String

Строка запроса, которую нужно разобрать.

Int16

Количество указанных типов данных параметров (может быть нулевым). Обратите внимание, что это не указывает на количество параметров, которые могут появиться в строке запроса, а только на количество, для которых фронтенд хочет предварительно указать типы.

Затем, для каждого параметра, имеется следующее:

Int32

Указывает идентификатор объекта типа данных параметра. Помещение нуля здесь эквивалентно неуказанию типа неопределенным.

ParseComplete (B) #
Byte1('1')

Идентифицирует сообщение как индикатор завершения разбора.

Int32(4)

Длина содержимого сообщения в байтах, включая само сообщение.

PasswordMessage (F) #
Byte1('p')

Определяет сообщение как ответ на пароль. Обратите внимание, что это также используется для сообщений ответа GSSAPI, SSPI и SASL. Точный тип сообщения можно определить из контекста.

Int32

Длина содержимого сообщения в байтах, включая само сообщение.

String

Пароль (зашифрованный, если запрошено).

PortalSuspended (B) #
Byte1('s')

Определяет сообщение как индикатор приостановки портала. Обратите внимание, что это появляется только в случае достижения лимита количества строк в сообщении Execute.

Int32(4)

Длина содержимого сообщения в байтах, включая само сообщение.

Query (F) #
Byte1('Q')

Идентифицирует сообщение как простой запрос.

Int32

Длина содержимого сообщения в байтах, включая само сообщение.

String

Сама строка запроса.

ReadyForQuery (B) #
Byte1('Z')

Определяет тип сообщения. ReadyForQuery отправляется каждый раз, когда бэкенд готов к новому циклу запроса.

Int32(5)

Длина содержимого сообщения в байтах, включая само сообщение.

Byte1

Текущий индикатор состояния транзакции в бэкенде. Возможные значения: 'I' если простаивает (не в блоке транзакции); 'T' если в блоке транзакции; или 'E' если в неудавшемся блоке транзакции (запросы будут отклонены до окончания блока).

RowDescription (B) #
Byte1('T')

Определяет сообщение как описание строки.

Int32

Длина содержимого сообщения в байтах, включая само сообщение.

Int16

Определяет количество полей в строке (может быть нулевым).

Затем, для каждого поля, имеется следующее:

String

Имя поля.

Int32

Если поле может быть идентифицировано как столбец конкретной таблицы, то это будет идентификатор объекта этой таблицы; в противном случае - ноль.

Int16

Если поле может быть идентифицировано как столбец конкретной таблицы, то атрибутом является номер столбца; в противном случае - ноль.

Int32

Идентификатор объекта типа данных поля.

Int16

Размер типа данных (см. pg_type.typlen). Обратите внимание, что отрицательные значения обозначают типы переменной ширины.

Int32

Модификатор типа (см. pg_attribute.atttypmod). Значение модификатора зависит от конкретного типа.

Int16

Формат кода, используемый для поля. В настоящее время он может быть нулевым (текстовым) или единичным (бинарным). В RowDescription, возвращаемом из варианта оператора Describe, код формата еще неизвестен и всегда будет нулевым.

SASLInitialResponse (F) #
Byte1('p')

Определяет сообщение как начальный ответ SASL. Обратите внимание, что это также используется для сообщений GSSAPI, SSPI и ответов с паролем. Точный тип сообщения определяется из контекста.

Int32

Длина содержимого сообщения в байтах, включая само сообщение.

String

Имя механизма аутентификации SASL, выбранного клиентом.

Int32

Длина специфичного для механизма SASL "Начального клиентского ответа", который следует за ним, или -1, если нет начального ответа.

Byten

Специфичный для механизма SASL "Начальный ответ".

SASLResponse (F) #
Byte1('p')

Определяет сообщение как ответ SASL. Обратите внимание, что это также используется для сообщений GSSAPI, SSPI и ответов с паролем. Точный тип сообщения можно определить из контекста.

Int32

Длина содержимого сообщения в байтах, включая само сообщение.

Byten

Специфичные для механизма SASL данные сообщения.

SSLRequest (F) #
Int32(8)

Длина содержимого сообщения в байтах, включая само сообщение.

Int32(80877103)

Код запроса SSL. Значение выбирается таким образом, чтобы содержать 1234 в старших 16 битах и 5679 в младших 16 битах. (Чтобы избежать путаницы, этот код не должен совпадать с номером версии протокола).

StartupMessage (F) #
Int32

Длина содержимого сообщения в байтах, включая само сообщение.

Int32(196608)

Номер версии протокола. Старшие 16 бит являются номером основной версии (3 для описанного здесь протокола). Младшие 16 бит являются номером минорной версии (0 для описанного здесь протокола).

Номер версии протокола, за которым следует одна или несколько пар строк с именем и значением параметра. После последней пары имя/значение требуется нулевой байт в качестве завершителя. Параметры могут появляться в любом порядке. user обязателен, остальные являются необязательными. Каждый параметр указывается следующим образом:

String

Имя параметра. В настоящее время распознаваемые имена:

user

Имя пользователя базы данных для подключения. Обязательно; нет значения по умолчанию.

database

База данных, к которой нужно подключиться. По умолчанию используется имя пользователя.

options

Аргументы командной строки для бэкенда. (Это устаревший способ, рекомендуется устанавливать отдельные параметры времени выполнения). Пробелы внутри этой строки считаются разделителями аргументов, если они не экранированы обратной косой чертой (\); для представления литеральной обратной косой черты используйте \\.

replication

Используется для подключения в режиме потоковой репликации, где можно выполнять набор небольших команд репликации вместо SQL-запросов. Значение может быть true, false или database, а по умолчанию - false. См. Раздел 52.4 для получения дополнительной информации.

В дополнение к вышесказанному, могут быть перечислены и другие параметры. Имена параметров, начинающиеся с _pq_., зарезервированы для использования в качестве расширений протокола, в то время как другие параметры рассматриваются как параметры времени выполнения, которые должны быть установлены при запуске сервера. Такие настройки будут применены при запуске сервера (после разбора аргументов командной строки, если они есть) и будут действовать как значения по умолчанию для сессии.

String

Содержимое параметра.

Sync (F) #
Byte1('S')

Идентифицирует сообщение как команду Sync.

Int32(4)

Длина содержимого сообщения в байтах, включая само сообщение.

Terminate (F) #
Byte1('X')

Идентифицирует сообщение как завершение.

Int32(4)

Длина содержимого сообщения в байтах, включая само сообщение.