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を返信し、受信を終了する。

拡張仕様

種類
 オリジナルに対し、改良版として、様々なものが作られた。
 更に、次の亜種(後述)がある。

拡張通信手順
 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は単にファイルをブロック単位で送るだけで、それ以上の機能はない。ファイルサイズを送る機能さえないのである。
 YMODEMZMODEMなどは、ファイルサイズ、ファイル名、あるいはタイムスタンプ等の情報を伝える機能を持つものがあり、この機能を使えば受信したファイルは厳密に送信したものと同一になる。

制限
 全体としてのブロック長は一定である。またファイルサイズを送る機能はない。
 しかし、データ長が厳密に128または1024の倍数になるケースは少ないため、多くの場合、最終パケットは「大きさがあまる」ことになり、この場合は末尾に適当なデータ(NUL文字(0x00)やSUB(0x1a; EOF文字))を詰めることになる。
 この点が問題になることも多い。

再検索