XMODEMプロトコルの概要
XMODEMは、
バイナリデータを送信するためのプロトコルであり、128バイト単位でデータを転送します。Ward Christensenが開発し、公開した仕様によって、
パソコン通信におけるデファクトスタンダードとなりました。しかし、その転送効率は良好ではなく、いくつかの設計上の制約が存在します。
特徴
XMODEMの大きな特徴は、そのシンプルな構造です。データは128バイト、または1024バイト単位で送信され、エラー検出には8ビットの
チェックサムまたは16ビットのCRC(
巡回冗長検査)符号を使用します。もし通信中にエラーが発生した場合、エラーがあったデータブロックを再送することで対応します。ただし、途中で再送を開始するブロックを指定することはできません。また、ファイル名やサイズ、タイムスタンプといったファイル情報を伝送する機能はなく、1度に転送できるのは1ファイルのみです。加えて、データブロックのパディングにEOF(End Of File)文字が使用されるため、ファイルが破損する危険性があります。さらに、コントロールコードのクォート処理が行われないため、特定の流れ制御においては不具合を生じる可能性があります。
XMODEMの種類
XMODEMにはいくつかのバリエーションが存在します。主なものは以下の通りです。
- - XMODEM/SUM: 128バイト単位でデータを転送し、エラー検出に8ビットのチェックサムを利用します。
- - XMODEM/CRC: 同様に128バイト単位ですが、エラー検出に16ビットのCRCを使用することで信頼性を向上させています。
- - XMODEM/1k: 1024バイト単位でデータを転送し、エラー検出は16ビットのCRCを用いるため、転送速度も向上しています。
- - Flying-XMODEM: 受信側がデータブロックをすべて受け終わる前にACKを送信することにより転送速度を上げる手法ですが、これにはエラーが発生した際の回復が難しいという性質があります。
手順
XMODEM通信は、特定のコントロールコードを用いることで行われます。基本的な流れは以下の通りです。
1. 受信側が送信要求としてNAK(否定応答)を送信します。XMODEM/CRCやXMODEM/1kの場合は代わりに文字 'C' を送ります。
2. 送信側は最初のデータブロックを送信します。
3. 受信側はブロック番号や
チェックサムを確認した後、ACKを送信します。Flying-XMODEMでは、ACKがデータブロックを全て受信する前に送信されます。
4. 送信側はACKを受け取った後、次のデータブロックを送信します。この流れは、全てのデータが送信されるまで繰り返されます。全データの送信が完了したら、EOT(通信終了)を送信します。
5. 受信側がACKを送信し、通信が終了します。
エラー処理
通信中、ブロック番号や
チェックサムに矛盾が生じた場合、受信側はACKの代わりにNAKを送ります。この場合、送信側は同じデータブロックを再送しますが、ブロック番号を特定して送信することはできません。そのため、エラーが発生するような状況では、Flying-XMODEMを利用している場合は中断処理をします。
中断処理
特定の条件(応答がない場合や、Flying-XMODEMでのエラー発生など)において通信を終了させる必要がある時、CANコードを送信します。この手続きは送信側、受信側どちらでも可能です。
データブロックの構成
各データブロックは以下の要素からなります。
- - ヘッダ: データサイズを示すSOH(128バイト)またはSTX(1024バイト)が含まれます。
- - データブロック番号: 1から始まり、1ずつカウントアップします。
- - データブロック番号の1の補数: 割り算の補数が必要です。
- - データ: 目的のデータが含まれ、必要に応じてEOFでパディングされます。
- - チェックサムまたはCRC符号: エラー検出のための符号です。
発展
XMODEMは、その転送効率の低さから、後にYMODEMやZMODEMといった改良されたプロトコルが開発されるきっかけとなりました。これにより、より高速かつ効率的なデータ転送が可能となったのです。