XMODEM
読み:エックスモデム
外語:XMODEM
ファイル転送プロトコルの一つ。ファイル転送に伴う誤り検出・再送を行なうもの。
目次
概要
基本仕様
ブロックの構造
通信手順
拡張仕様
種類
拡張通信手順
亜種
制限
概要
アメリカのWard Christensenにより、1977(昭和52)年に発表したMODEM2を元にして、1979(昭和54)年にXMODEMが開発された。
XMODEMは
PDS
として発表され全仕様が公開されたため普及し、その後
CRC
版など多数の改良プロトコルが作られた。
基本仕様
ブロックの構造
純粋なXMODEMは、データを128
オクテット
ごとのブロック(これをパケットと呼ぶ)に分割し、各ブロック毎にブロック番号とデータと
チェックサム
を送る。
具体的には、ブロックは次の構造となる。
[SOH] [BN] [BNC] [DATA(128オクテット固定)] [CheckSum]
まず、SOHは制御コード0/1であり、つまり0x01である。
BNは0x01から始まり0xffになると0x00にリセットされるカウンターである。
BNCはBNの
1の補数
である。
CheckSumはデータ部分を全て足した値の下8ビットである。
通信手順
まず、受信したい側が、送信側に対して否定的な通知(
NAK
)を投げることから交信は始まる。送信側はそれに対し、SOHを返信する。もし返信が無い場合、数秒の間をあけてからNAKを再送し、SOHの返信を待つ。
送信側は、NAKを受信したら、SOHに続けてチェックサム(またはCRC)までのデータを送信する。
受信側は、チェックサム(またはCRC)までのデータを受信したら、エラーチェックを実行する。正常であれば
ACK
を返信し、さもなくばNAKを返信する。
送信側は、ACKが返れば次のブロックを送信する。NAKが返った場合は、そのブロックを再送する。
送信側は、全てのデータを送信した場合、ACKを受け取ったあと、SOHではなく
EOT
を送信する。
受信側は、EOTを受信したら、ACKを返信し、受信を終了する。
拡張仕様
種類
オリジナルに対し、改良版として、様々なものが作られた。
XMODEM 128/SUM
(オリジナルの別名)
XMODEM 128/CRC
(エラー検出をチェックサムからCRCに変えたもの)
XMODEM 1024/CRC
(128/CRCのデータ長を128バイトから1024バイトに変えたもの)
更に、次の亜種(後述)がある。
Flying-XMODEM
WXMODEM
拡張通信手順
CRC XMODEMでは、最初に送信するNAKの代わりに'C'(4/3、0x43)を送信する。128/CRC、1024/CRCが該当する。
データ長が1024オクテットのXMODEMでは、ブロック開始のSOHの代わりにSTX(0/2、0x02)を使用する。128と1024は混在可能。なお、終了の合図は
EOT
で通常と同様である。1024/CRCが該当する。
なお、CRCは16ビットつまり2オクテットあるが、上位オクテット、下位オクテットの順に送る。つまり
ビッグエンディアン
(
ネットワークバイトオーダー
)である。
亜種
パケット長は元々128オクテットだった。これを1Kiオクテットに拡張したものもあるが、それでもACKの
オーバーヘッド
により効率は良くない。
そこで、エラーチェックを全て廃した
Flying-XMODEM
や、これに
スライディングウィンドウ
&再送機能、コード変換、ブロック同期を付けた
WXMODEM
などといったものも存在する。
但し、XMODEMは単にファイルをブロック単位で送るだけで、それ以上の機能はない。ファイルサイズを送る機能さえないのである。
YMODEM
や
ZMODEM
などは、ファイルサイズ、
ファイル名
、あるいはタイムスタンプ等の情報を伝える機能を持つものがあり、この機能を使えば受信したファイルは厳密に送信したものと同一になる。
制限
全体としてのブロック長は一定である。またファイルサイズを送る機能はない。
しかし、データ長が厳密に128または1024の倍数になるケースは少ないため、多くの場合、最終パケットは「大きさがあまる」ことになり、この場合は末尾に適当なデータ(NUL文字(0x00)やSUB(0x1a; EOF文字))を詰めることになる。
この点が問題になることも多い。
再検索