ZMODEMプロトコル

ZMODEMプロトコルについて、せっかく中途半端に(笑)理解したので、
自分の憶えのためにここにまとめてみました。
まだ完成していませんのが、徐々に追加します。

ZMODEMの基本

●基本的に、パケット単位で送受信する。パケットは、フレームと本体からなり、パケットの種類によっては、フレームのない「サブパケット」が付随していることがある。

●XON,XOFFが使用できるように、エスケープキャラクタ(ZDLE=18H)を使用する。その他,ZDLEに続く文字は全て特殊な文字(バイト)と考えたほうがよい。

●18H,10H,11H,13H,90H,91H,93Hをエスケープする。オプションで全てのコントロールコードをエスケープする事も可。エスケープはZDLEに続いてエスケープ文字を40HでXORする。また、7FH,FFHは、それぞれZDLEに続いて'l','m'とする。

●ZCAN(=18H)を5つ受信したら、キャンセルとみなす。送信する場合は8つのZCANを送信する。

●CRCは、エスケープする前で計算する。

ヘッダ

●すべてのZMODEMフレームはヘッダーで始まる。

●ヘッダにはバイナリヘッダーとヘキサヘッダー(1バイトの数値を2バイトの16進文字であらわす)があり、バイナリヘッダーには32ビットCRCと16ビットCRCがある。

●受信側はヘキサヘッダーを使用する。送信側は、バイナリーデータサブパケットがないフレームではヘキサヘッダーを使用する。

●ヘッダタイプによっては、いくつかのバイナリーデータサブパケットがヘッダに続く場合がある。1つのパケットのデータは最大1024バイトで、ZDLEでエンコードされる(エンコードする前が最大1024バイト)。

【16ビットCRCバイナリヘッダー】
・ZPAD(='*'),ZDLE,ZBIN(='A')で始まる
・1バイトのフレームタイプ(後述)。これは必要ならZDLEでエンコードする。
・4バイトのパラメータ(必要ならZDLEでエンコードする)
・2バイトの16ビットCRC(必要ならZDLEでエンコードする)
・フレームによっては、バイナリーデータサブパケット(後述)が(場合によっては複数)続く。これにも2バイトの16ビットCRCをつける

【32ビットCRCバイナリーヘッダ】
・ZPAD(='*'),ZDLE,ZBIN(='C')で始まる
・1バイトのフレームタイプ(後述)。これは必要ならZDLEでエンコードする。
・4バイトのパラメータ(必要ならZDLEでエンコードする)
・4バイトの32ビットCRC(必要ならZDLEでエンコードする)
・フレームによっては、バイナリーデータサブパケット(後述)が(場合よっては複数)続く。これにも4バイトの32ビットCRCを付ける

【16ビットヘキサヘッダ】
・ZPAD(='*'),ZPAD,ZDLE,ZBIN(='B')で始まる
・ヘキサ表現の1バイトのフレームタイプ(後述)。結局2バイトになる。
・ヘキサ表現の4バイトのパラメータ。結局8バイトになる。
・ヘキサ表現の2バイトの16ビットCRC。結局4バイトになる。
・CR(0DH),LF(0AH),XON(11H)。ただし,フレームタイプがZACK、ZFINの場合は付けない。

【サブパケット部】
・データ
・ZDLE
・ZCRCx

  • ZCRCE(='h'):このフレームでサブパケットは終了

  • ZCRCG(='i'):次のフレームにサプパケットが続いている

  • ZCRCQ(='j'):次のフレームにサブパケットが続いている。ZACKを要求するが応答待ちは行わない

  • ZCRCW(='k'):次のフレームにサブパケットが続いている。ZACKを待つ

・CRC:16ビットまたは32ビット

パケットの種類

フレームタイプの種類です。

コード シンボル       方向    意味
00h ZRQINIT    送→受  ファイル転送の開始
01h ZRINIT     受→送  状況の通知
02h ZSINIT     送→受  エスケープ処理の通知
03h ZACK       双方向  正常受信応答
04h ZFILE      送→受  ファイル送信開始
05h ZSKIP      受→送  ファイル転送スキップ指示
06h ZNAK       双方向  ヘッダーエラー応答
07h ZABORT     受→送  ユーザーによる中断
08h ZFIN       双方向  ファイル転送終了
09h ZRPOS      受→送  転送ポインタ指示
0Ah ZDATA      送→受  データ転送開始
0Bh ZEOF       送→受  1ファイル転送終了
0Ch ZFERR      双方向  ファイルエラー
0Dh ZCRC       双方向  CRCファイルチェック
0Eh ZCHALLENGE 受→送  セキュリティチェック
0Fh ZCOMPL     受→送  コマンド実行終了
10h ZCAN       (内部使用)
11h ZFREECNT   送→受  受信側残量チェック
12h ZCOMMAND   送→受  コマンド実行

 送信側がZRQINITを送信する事で始まり、ZFINを送信側、受信側の順でお互いに送り合っておわります。そのあと、送信側は'OO'(アルファベットの’O’です)を送ってきますが、無視して構いません。実際、作者の通信ソフトは無視しています。
 それぞれの意味については、主要なもの(というか、Peopleでのやり取りに必要だったもの 汗)について、詳しく解説します。

   

ホームに戻る