XMODEM

XMODEM（えっくすもでむ）は、バイナリ転送プロトコルの一種である。128バイト単位で非同期通信を行う。開発者の Ward Christensen がパブリックドメイン扱いで仕様を公開したため、パソコン通信で広く使われた。XMODEMを元に考案されたプロトコルも多く、またXMODEM自身にもいくつかのタイプがある。

 特徴 
構造が簡単。ただし転送効率が悪い。
128バイトもしくは1024バイト単位でデータを転送する。
エラー検出に8ビットのチェックサムもしくは16ビットのCRC符号を利用する。
転送エラーがあった場合、エラーのあったブロックを再送することができる。しかし指定したブロックからやり直す機能はない。
ファイル名やファイルサイズ、タイムスタンプなどのファイル情報を転送する機能はない。
一度に転送できるのは1ファイルのみ（バッチ転送不能）。
ファイルの末尾がEOF文字(1Ah)であった場合にファイルの破損を招く可能性がある。データブロックのパディングにEOF文字を使用するが、ファイルサイズを転送する機能がないので、それがファイルデータの一部なのか「詰め物」なのか判別できないためである。
コントロールコードのクォート（置換）処理を行わない。このため、XON/XOFF文字によるフロー制御を行っている場合には不具合をきたす可能性がある。

 XMODEMの種類 
 XMODEM/SUM 128バイト単位でデータを転送し、エラー検出に8ビットのチェックサムを使用する。単に "XMODEM" といった場合は XMODEM/SUM を指す場合が多い。
 XMODEM/CRC 128バイト単位でデータを転送し、エラー検出に16ビットのCRCを使用することで信頼性の向上を図ったもの。
 XMODEM/1k 1024バイト単位でデータを転送し、エラー検出に16ビットのCRCを使用することで転送速度と信頼性の向上を図ったもの。
 Flying-XMODEM 本来はデータブロックを全て受け取り、エラーがないことを確認した上で送信側に送るACKを、データブロックを受け取り終わる前に先に送ってしまう（フライングする）ことで転送速度の向上を図ったもの。-/SUM、-/CRC、-/1kのいずれに対しても使用される。規約違反であり、性質上エラーがあっても回復することができない。

 手順 
SOH、STX、EOT、ACK、NAK、CANの6つのコントロールコードと文字 ’C’(43h) を使用して通信制御を行い、後述するデータブロックの単位でデータを転送する。

 基本的な流れ 
 受信側  送信側 NAK（送信要求） →   ← ブロック1 ACK（肯定応答） →   ← ブロック2 ACK →  （中略）  ← 最終ブロック ACK →  ← EOT（転送終了） ACK →  （通信終了）

受信側が送信要求としてNAKを送出する。XMODEM/CRCもしくはXMODEM/1kではNAKではなく ’C’ を送出する。
送信側が最初のデータブロックを送出する。
受信側はブロック番号、チェックサムやCRC符号を確認し、受信したデータにエラーがないことを確認した後にACKを送出する。Flying-XMODEMではデータブロックを受け取り終わる前にACKを送出してしまう。
ACKを受けた送信側は次のデータブロックを送出する。全てのデータを送出するまでこれを繰り返す。全てのデータを送出し終わった場合は、送信すべきデータが終了したことを示すEOTを送出する。
受信側がACKを送出し、通信を終了する。

 エラーが発生した場合 
+ ブロック8でエラーが発生した場合の例 受信側  送信側  ← ブロック7 ACK →   ← ブロック8 （ブロック8に何らかのエラーがあった） NAK（再送要求） →   ← ブロック8（再度同じブロックを送出） ACK →   ← ブロック9

ブロック番号がおかしい、チェックサムやCRC符号とデータの間に矛盾があるなどのエラーが発生した場合、受信側はACKの代わりにNAK（否定応答）を送出する。NAKを受信した送信側は再度同じデータブロックを送出する。ブロック番号を指定して送信を要求する機能はないため、ブロック番号が連続しない場合やFlying-XMODEMの場合は中断処理（後述）を行うことになる。

 中断処理 
一定時間待っても相手側からの応答がない、Flying-XMODEM転送中にエラーが発生したなど、何らかの事情により転送途中に通信を終了させたい場合はCANを送出する。これは受信側・送信側のどちらが送出しても良い。

 データブロック構成 
 ヘッダ データブロック番号 データブロック番号の1の補数 データ チェックサムもしくはCRC符号 8ビット 8ビット 8ビット 128バイトもしくは1024バイト 8ビットもしくは16ビット

 ヘッダ データのサイズを表す。128バイトであればSOH、1024バイトであればSTXをセットする。
 データブロック番号 ブロック番号をセットする。1から開始して1ずつカウントアップし、255の次は0になる。
 データブロック番号の1の補数 ブロック番号の1の補数（全ビットを反転させたもの）をセットする。
 データ 送信するデータを128バイトもしくは1024バイト単位でセットする。送信するデータが128バイトもしくは1024バイトに満たない場合はEOFでパディングする（空いた部分を埋める）。
 チェックサムもしくはCRC符号 8ビットのチェックサム、もしくは16ビットのCRC符号をビッグエンディアンでセットする。

 発展 
XMODEMは効率があまり良くないため、これを改良したYMODEM、ZMODEMなどが後に開発された。

 関連項目 
バイナリ転送プロトコル
YMODEM
ZMODEM
B Plus
QuickVAN

カーミット (プロトコル)
バイナリ

えつくすもてむ
Category:ファイル転送プロトコル