YMODEM(わいもでむ)とは、バイナリ転送プロトコルの一種である。XMODEMやMODEM7を発展させたもので、Chuck Forsbergにより開発され、1985年にYMODEMという名称がつけられた。
SOH(01h)、STX(02h)、EOT(04h)、ACK(06h)、NAK(15h)、CAN(18h)の6つのコントロールコードと文字 ’C’(43h)、’G’(47h) を使用して通信制御を行い、後述するデータブロックの単位でデータを転送する。
| 受信側 | 送信側 | |
|---|---|---|
| ’C’(送信要求) | → | |
| ← | ブロック0(1つめのファイル) | |
| ACK(肯定応答) | → | |
| ’C’(送信要求) | → | |
| ← | ブロック1 | |
| ACK | → | |
| ← | ブロック2 | |
| ACK | → | |
| (中略) | ||
| ← | 最終ブロック | |
| ACK | → | |
| ← | EOT(転送終了) | |
| NAK | → | |
| ← | EOT | |
| ACK | → | |
| (1ファイル転送終了) | ||
| ’C’(次のファイルを要求) | → | |
| ← | ブロック0(2つめのファイル) | |
| (中略) | ||
| ← | 最終ブロック(最後のファイル) | |
| ACK | → | |
| ← | EOT | |
| NAK | → | |
| ← | EOT | |
| ACK | → | |
| ’C’ | → | |
| ← | ブロック0(「全てのファイルを転送終了」) | |
| ACK | → | |
| (通信終了) | ||
| 受信側 | 送信側 | |
|---|---|---|
| ’G’(送信要求) | → | |
| ← | ブロック0(1つめのファイル) | |
| ’G’ | → | |
| ← | ブロック1 | |
| ← | ブロック2 | |
| ← | ブロック3 | |
| (中略) | ||
| ← | 最終ブロック | |
| ← | EOT(転送終了) | |
| ACK | → | |
| (1ファイル転送終了) | ||
| ’G’(次のファイルを要求) | → | |
| ← | ブロック0(2つめのファイル) | |
| (中略) | ||
| ← | 最終ブロック(最後のファイル) | |
| ← | EOT | |
| ACK | → | |
| ’G’ | → | |
| ← | ブロック0(「全てのファイルを転送終了」) | |
| (通信終了) | ||
| 受信側 | 送信側 | |
|---|---|---|
| ← | ブロック7 | |
| ACK | → | |
| ← | ブロック8 | |
| (ブロック8に何らかのエラーがあった) | ||
| NAK(再送要求) | → | |
| ← | ブロック8(再度同じブロックを送出) | |
| ACK | → | |
| ← | ブロック9 | |
ブロック番号がおかしい、CRC符号とデータの間に矛盾があるなどのエラーが発生した場合、受信側はACKの代わりにNAK(否定応答)を送出する。NAKを受信した送信側は再度同じデータブロックを送出する。ブロック番号を指定して送信を要求する機能はないため、ブロック番号が連続しない場合やYMODEM-gの場合は中断処理(後述)を行うことになる。
何らかの事情により転送途中に通信を終了させたい場合はCANを送出する。これは受信側・送信側のどちらが送出しても良い。
| ヘッダ | データブロック番号 | データブロック番号の1の補数 | データ | CRC符号 |
|---|---|---|---|---|
| 8ビット | 8ビット | 8ビット | 1024バイトもしくは128バイト | 16ビット |
データファイル本体の転送に先立って送出するブロック0のデータ部分には、以下に示すフォーマットでファイル情報をセットする。128バイトもしくは1024バイトに満たない部分はNUL(00h)でパディングする(EOFではない)。また、データ部分を全てNULとすると「続けて送信するファイルはもうない」という意味になる。
| ファイル名 | NUL(00h) | ファイルサイズ | 空白(20h) | タイムスタンプ | 空白 | パーミッション | 空白 | シリアルナンバー | NUL(パディング) |
| 1バイト | 1バイト | 1バイト | 1バイト | ||||||
| 128バイトもしくは1024バイト | |||||||||
YMODEMは、ファイル情報を転送できないなどのXMODEMの欠点を克服した。しかし、データブロックを送出するごとにACKを待たなければならないので転送速度が遅い (YMODEM)、転送は速いがエラーが起こっても回復できない (YMODEM-g)、コントロールコードのクォート処理を行わないなどの欠点が残っている。そのため、これらの問題を克服すべく、ZMODEMを翌年にChuck Forsbergが開発した。
未登録
IPFS未登録
📡 0ピア
N=1
CRITICAL
PQS D36