55.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

このバックエンドのプロセスIDです。

Int32

このバックエンドの秘密鍵です。

Bind (F) #
Byte1('B')

メッセージがBindコマンドであることを識別します。

Int32

自身を含むメッセージ内容のバイト単位の長さ。

String

宛先ポータルの名前(空文字列にすると無名ポータルを選択します)。

String

入力元のプリペアド文の名前(空文字列にすると無名のプリペアド文を選択します)。

Int16

その後に続くパラメータ書式コードの数(以下ではCで表します)。 これは、パラメータがない、またはパラメータはすべてデフォルトの書式(テキスト)を使うことを示す0、あるいは指定の書式コードがすべてのパラメータに適用されることを示す1にすることができます。 そうでなければ、実際のパラメータの数と同じになります。

Int16[C]

パラメータ書式コードです。 現在はそれぞれが0(テキスト)あるいは1(バイナリ)でなければなりません。

Int16

後続するパラメータ値の数 (ゼロの場合もあります)。 これは問い合わせが必要とするパラメータ数と一致する必要があります。

次に、各パラメータに対して、以下のフィールドのペアが現れます。

Int32

パラメータ値のバイト単位の長さ(これには自身は含まれません)。 ゼロにすることもできます。 特別な場合として、-1はNULLというパラメータ値を示します。 NULLの場合、後続の値用のバイトはありません。

Byten

関連する書式コードで示される書式におけるパラメータの値。 nは上述の長さです。

最後のパラメータの後に、以下のフィールドが現れます。

Int16

後続する結果列書式コードの数 (以下ではRで表します)。 これは、結果列が存在しないことを示す0、あるいはすべての結果列が(もしあれば)デフォルトの書式コード(テキスト)を使用することを示す1にすることができます。 さもなくば、問い合わせの結果列の実際の数と同じになります。

Int16[R]

結果列の書式コード。 現在それぞれは0(テキスト)もしくは1(バイナリ)のいずれかでなければなりません。

BindComplete (B) #
Byte1('2')

メッセージがBind完了指示子であることを識別します。

Int32(4)

自身を含むメッセージ内容のバイト単位の長さ。

CancelRequest (F) #
Int32(16)

自身を含むメッセージ内容のバイト単位の長さ。

Int32(80877102)

取消要求コードです。 この値は、最上位16ビットに1234が、下位16ビットに5678を持つように選択されています。 (混乱を防ぐため、このコードはプロトコルバージョン番号と同一になってはいけません。)

Int32

対象バックエンドのプロセスIDです。

Int32

対象バックエンドの秘密鍵です。

Close (F) #
Byte1('C')

メッセージがCloseコマンドであることを識別します。

Int32

自身を含むメッセージ内容のバイト単位の長さ。

Byte1

プリペアド文を閉ざす時は'S'。 ポータルを閉ざす時は'P'です。

String

閉ざすプリペアド文またはポータルの名前です (空文字列で無名のプリペアド文または無名ポータルを選択します)。

CloseComplete (B) #
Byte1('3')

メッセージがClose完了指示子であることを識別します。

Int32(4)

自身を含むメッセージ内容のバイト単位の長さ。

CommandComplete (B) #
Byte1('C')

メッセージがコマンド完了応答であることを識別します。

Int32

自身を含むメッセージ内容のバイト単位の長さ。

String

コマンドタグです。 これは通常どのSQLコマンドが完了したかを表す単一の単語です。

INSERTコマンドの場合、タグはINSERT oid rowsです。 ここでrowsは挿入された行数です。 かつてoidは、rowsが1、かつ、対象テーブルがOIDを持つ場合、挿入された行のオブジェクトIDでしたが、もはや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は、コピーされた行数です(注意:この行数はPostgreSQL 8.2以降でのみ出力されます)。

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

メッセージがデータのCOPYであることを識別します。

Int32

自身を含むメッセージ内容のバイト単位の長さ。

Byten

COPYデータストリームの一部を形成するデータです。 バックエンドから送信されるメッセージは、常に1つのデータ行に対応します。 しかし、フロントエンドから送信されるメッセージは任意のデータストリームに分割される可能性があります。

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

メッセージがCOPY完了指示子であることを識別します。

Int32(4)

自身を含むメッセージ内容のバイト単位の長さ。

CopyFail (F) #
Byte1('f')

メッセージがCOPY失敗指示子であることを識別します。

Int32

自身を含むメッセージ内容のバイト単位の長さ。

String

失敗の原因を報告するエラーメッセージです。

CopyInResponse (B) #
Byte1('G')

メッセージがStart Copy Inの応答であることを識別します。 フロントエンドはここで必ずコピーインデータを送信しなければなりません (まだ準備ができていない場合はCopyFailメッセージを送信してください)。

Int32

自身を含むメッセージ内容のバイト単位の長さ。

Int8

0はCOPY全体の書式がテキスト(行は改行で区切られ、列は区切り文字などで区切られます)であることを示します。 1はコピー全体の書式がバイナリ(DataRowの書式同様)であることを示します。 詳細についてはCOPYを参照してください。

Int16

コピーされるデータ内の列数です (以下ではNと表されます)。

Int16[N]

各列で使用される書式コードです。 現在それぞれは0(テキスト)または1(バイナリ)でなければなりません。 コピー全体の書式がテキストの場合、すべてが0でなければなりません。

CopyOutResponse (B) #
Byte1('H')

メッセージがStart Copy Outの応答であることを識別します。 このメッセージの後にコピーアウトデータが続きます。

Int32

自身を含むメッセージ内容のバイト単位の長さ。

Int8

0はCOPY全体の書式がテキスト(行は改行で区切られ、列は区切り文字などで区切られます)であることを示します。 1はコピー全体の書式がバイナリ(DataRowの書式同様)であることを示します。 詳細についてはCOPYを参照してください。

Int16

コピーされるデータ内の列数です (以下ではNと表されます)。

Int16[N]

各列で使用される書式コードです。 現在それぞれは0(テキスト)または1(バイナリ)でなければなりません。 コピー全体の書式がテキストの場合、すべてが0でなければなりません。

CopyBothResponse (B) #
Byte1('W')

メッセージがStart Copy Bothの応答であることを識別します。 このメッセージはストリーミングレプリケーションのみで使用されます。

Int32

自身を含むメッセージ内容のバイト単位の長さ。

Int8

0はCOPY全体の書式がテキスト(行は改行で区切られ、列は区切り文字などで区切られます)であることを示します。 1はコピー全体の書式がバイナリ(DataRowの書式同様)であることを示します。 詳細についてはCOPYを参照してください。

Int16

コピーされるデータ内の列数です (以下ではNと表されます)。

Int16[N]

各列で使用される書式コードです。 現在それぞれは0(テキスト)または1(バイナリ)でなければなりません。 コピー全体の書式がテキストの場合、すべてが0でなければなりません。

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

自身を含むメッセージ内容のバイト単位の長さ。

このメッセージの本体には、ゼロバイトを終端として後続する、1つ以上の識別されるフィールドが含まれます。 フィールドは任意の順番で現れる可能性があります。 各フィールドには以下があります。

Byte1

フィールド種類を識別するコードです。 ゼロならば、メッセージの終端であり、後続する文字列がないことを表します。 55.8に、現時点でフィールド種類として定義されているものを列挙します。 将来もっと多くのフィールド種類が追加される可能性がありますので、フロントエンドは、認知できない種類のフィールドに対して何もせずに無視すべきです。

String

フィールド値です。

Execute (F) #
Byte1('E')

メッセージがExecuteコマンドであることを識別します。

Int32

自身を含むメッセージ内容のバイト単位の長さ。

String

実行するポータルの名前です。 (空文字列で無名ポータルを選択します)。

Int32

ポータルが行を返す問い合わせの場合、返される行数の最大値です (他の問い合わせでは無視されます)。 ゼロは無制限を表します。

Flush (F) #
Byte1('H')

メッセージがFlushコマンドであることを識別します。

Int32(4)

自身を含むメッセージ内容のバイト単位の長さ。

FunctionCall (F) #
Byte1('F')

メッセージが関数呼び出しであることを識別します。

Int32

自身を含むメッセージ内容のバイト単位の長さ。

Int32

呼び出す関数のオブジェクトIDを指定します。

Int16

後述する引数書式コード数です (以下ではCと表します)。 これは、引数が存在しない、あるいは、すべての引数がデフォルトの書式(テキスト)を使用することを示す0に、指定する書式コードをすべての引数に適用することを示す1にすることができます。 さもなくば、これは実際の引数の数と同じになります。

Int16[C]

引数の書式コードです。 それぞれは、0(テキスト)もしくは1(バイナリ)でなければなりません。

Int16

関数に提供する引数の数を指定します。

次に、各引数に対して以下のフィールドのペアが現れます。

Int32

引数の値のバイト単位の長さです (これには自身は含まれません)。 0とすることもできます。 特別な場合として、-1はNULLという引数の値を示します。 NULLの場合、後続の値用のバイトはありません。

Byten

関連する書式コードで示される書式における引数の値。 nは上述の長さです。

最後の引数の後に、以下のフィールドが現れます。

Int16

関数結果用の書式コードです。 現在、0(テキスト)または1(バイナリ)でなければなりません。

FunctionCallResponse (B) #
Byte1('V')

メッセージが関数呼び出しの結果であることを識別します。

Int32

自身を含むメッセージ内容のバイト単位の長さ。

Int32

関数の結果の値のバイト単位の長さです (これには自身は含まれません)。 ゼロとすることもできます。 特別な場合として、-1はNULLという関数の結果の値を示します。 NULLの場合、後続の値用のバイトはありません。

Byten

関連する書式コードで示される書式における関数の結果の値。 nは上述の長さです。

GSSENCRequest (F) #
Int32(8)

自身を含むメッセージ内容のバイト単位の長さ。

Int32(80877104)

GSSAPI暗号化要求コードです。 この値は、最上位16ビットに1234が、下位16ビットに5680を持つように選択されています。 (混乱を防ぐため、このコードはプロトコルバージョン番号と同一になってはいけません。)

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

自身を含むメッセージ内容のバイト単位の長さ。

このメッセージの本体には、ゼロバイトを終端として後続する、1つ以上の識別されるフィールドが含まれます。 フィールドは任意の順番で現れる可能性があります。 各フィールドには以下があります。

Byte1

フィールド種類を識別するコードです。 ゼロならば、メッセージの終端であり、後続する文字列がないことを表します。 55.8に、現時点でフィールド種類として定義されているものを列挙します。 将来もっと多くのフィールド種類が追加される可能性がありますので、フロントエンドは、認知できない種類のフィールドに対して何もせずに無視すべきです。

String

フィールド値です。

NotificationResponse (B) #
Byte1('A')

メッセージが通知応答であることを識別します。

Int32

自身を含むメッセージ内容のバイト単位の長さ。

Int32

通知元バックエンドのプロセスIDです。

String

通知の発生元となったチャネル名です。

String

通知プロセスから渡されるペイロード文字列です。

ParameterDescription (B) #
Byte1('t')

メッセージがパラメータ記述であることを識別します。

Int32

自身を含むメッセージ内容のバイト単位の長さ。

Int16

文で使用されるパラメータ数です (ゼロとすることができます)。

そして、各パラメータに対して、以下が続きます。

Int32

パラメータのデータ型のオブジェクトIDを指定します。

ParameterStatus (B) #
Byte1('S')

メッセージが実行時パラメータ状態報告であることを識別します。

Int32

自身を含むメッセージ内容のバイト単位の長さ。

String

報告される実行時パラメータの名前です。

String

そのパラメータの現在値です。

Parse (F) #
Byte1('P')

メッセージがParseコマンドであることを識別します。

Int32

自身を含むメッセージ内容のバイト単位の長さ。

String

宛先のプリペアド文の名前です (空文字列で無名のプリペアド文を選択します)。

String

解析される問い合わせ文字列です。

Int16

指定されるパラメータデータ型の数です (ゼロとすることができます)。 これは、問い合わせ文字列内にあるパラメータの数を示すものではないことに注意してください。 フロントエンドが型指定を希望するパラメータの数でしかありません。

そして、各パラメータに対して、以下が続きます。

Int32

パラメータのデータ型のオブジェクトIDを指定します。 ここにゼロを書くことは型指定を行わないことと同じです。

ParseComplete (B) #
Byte1('1')

メッセージがParse完了指示子であることを識別します。

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

フィールドが特定のテーブルの列として識別できる場合、テーブルのオブジェクトIDです。 さもなくばゼロです。

Int16

フィールドが特定のテーブルの列として識別できる場合、列の属性番号です。 さもなくばゼロです。

Int32

フィールドのデータ型のオブジェクトIDです。

Int16

データ型の大きさ(pg_type.typlenを参照)です。 負の値が可変長の型を表すことに注意してください。

Int32

型修飾子(pg_attribute.atttypmodを参照)です。 修飾子の意味は型に固有です。

Int16

フィールドに使用される書式コードです。 現在、0(テキスト)または1(バイナリ)のいずれかになります。 RowDescriptionがステートメント用のDescribeから返された場合、書式コードはまだ不明ですので、常に0になります。

SASLInitialResponse (F) #
Byte1('p')

メッセージが最初のSASL応答であることを識別します。 これがGSSAPI、SSPIまたはパスワード応答メッセージでも使用されることに注意してください。 厳密なメッセージ種別は、その状況から推論できます。

Int32

自身を含むメッセージ内容のバイト単位の長さ。

String

クライアントが選択したSASL認証機構の名前。

Int32

それに続くSASLの機構固有の「Initial Client Response(最初のクライアントの応答)」の長さ、またはInitial Responseがなければ-1。

Byten

SASLの機構固有の「Initial Response(最初の応答)」。

SASLResponse (F) #
Byte1('p')

メッセージがSASL応答であることを識別します。 これがGSSAPI、SSPIまたはパスワード応答メッセージでも使用されることに注意してください。 厳密なメッセージ種別は、その状況から推論できます。

Int32

自身を含むメッセージ内容のバイト単位の長さ。

Byten

SASLの機構固有のメッセージデータ

SSLRequest (F) #
Int32(8)

自身を含むメッセージ内容のバイト単位の長さ。

Int32(80877103)

SSL要求コードです。 この値は最上位の16ビットに1234が、最下位の16ビットに5679が含まれるように選択されます。 (混乱を防ぐため、このコードはどのプロトコルのバージョン番号とも同じになってはいけません。)

StartupMessage (F) #
Int32

自身を含むメッセージ内容のバイト単位の長さ。

Int32(196608)

プロトコルのバージョン番号です。 最上位の16ビットはメジャーバージョン番号(ここで説明しているプロトコルでは3)です。 最下位の16ビットはマイナーバージョン番号(ここで説明しているプロトコルでは0)です。

プロトコルのバージョン番号の後には、パラメータ名と値文字列の対が1つ以上続きます。 最後の名前/値の対の後に終端子としてゼロのバイトが必要です。 パラメータは任意の順番に並べることができます。 userが必須、他はオプションです。 各パラメータは以下のように指定します。

String

パラメータ名。現在認識されている名前は:

user

接続するデータベースユーザ名。必須。 デフォルトはありません。

database

接続するデータベースです。 デフォルトはユーザ名です。

options

バックエンド用のコマンドライン引数です。 (これは廃棄予定であり、個々の実行時パラメータを設定する方が好ましいです。) この文字列の中の空白は、バックスラッシュ(\)でエスケープされていなければ、引数を分けるためのものとみなされます。 バックスラッシュそのものを表すためには\\と書いてください。

replication

ストリーミングレプリケーションモードで接続するのに使用され、SQL文の代わりにレプリケーションコマンドの小さな集合を発行することができます。 値はtruefalseまたはdatabaseをとることができ、デフォルトはfalseです。 詳細は55.4を参照してください。

上記に加え、他のパラメータが列挙される可能性があります _pq_.で始まるパラメータ名は、プロトコルの拡張用途のために予約されています。 それ以外は、バックエンド開始時に設定される実行時パラメータとして扱われます。 こうした設定は、バックエンド起動時に(もしあればコマンドライン引数の解析の後に)適用されます。 この値はセッションのデフォルトとして動作します。

String

パラメータの値です。

Sync (F) #
Byte1('S')

メッセージがSyncコマンドであることを識別します。

Int32(4)

自身を含むメッセージ内容のバイト単位の長さ。

Terminate (F) #
Byte1('X')

メッセージが終了であることを識別します。

Int32(4)

自身を含むメッセージ内容のバイト単位の長さ。