Nmodem
From Wikipedia, the free encyclopedia
手順
EOT、ACK、NAK、CANの4つのコントロールコードと、’0’~’7’、’n’ の9文字を使用して通信制御を行う。
基本的な流れ
※各パケットのフォーマットは後述する。
| 受信側 | 送信側 | |
|---|---|---|
| ヘッダ要求パケット | → | |
| ← | ヘッダパケット(1つめのファイル) | |
| ACKパケット(使用するパケット長を指定) | → | |
| ← | 位置情報パケット | |
| ← | データパケット(1024バイト) | |
| ← | データパケット(1024バイト) | |
| (中略) | ||
| ← | データパケット(1024バイト) | |
| ← | データパケット(2048バイト;エラーが発生しなければ大きなパケットに切り替える) | |
| ← | データパケット(2048バイト) | |
| (中略) | ||
| ← | 最終データパケット | |
| ← | EOT(転送終了) | |
| 転送ファイルスキップパケット(次のファイルを要求) | → | |
| (1ファイル転送終了) | ||
| ヘッダ要求パケット | → | |
| ← | ヘッダパケット(2つめのファイル) | |
| (中略) | ||
| ← | EOT(最後のファイル) | |
| 転送ファイルスキップパケット | → | |
| (全てのファイルを転送終了) | ||
| ヘッダ要求パケット | → | |
| ← | EOT(「送信すべきファイルはもうない」) | |
| (通信終了) | ||
- 受信側がヘッダ要求パケットを送出する。
- 送信側がファイル情報の入ったヘッダパケットを送出する。全てのファイルを転送し終わっている場合はEOTを送出し、通信を終了する。
- 受信側はヘッダパケットにエラーがないことを確認した後にACKパケットを送出する。
- 送信側が位置情報パケットを送出する。
- 送信側がACKパケットで指示されたパケット長のデータパケットを次々に送出する。
- エラーが発生しない場合、8パケットごとに1段階ずつ大きなデータパケットに切り替えて送出を続ける。ファイル末尾など、残りの転送データがデータパケット長に比して小さな場合は、効率の良い小さなパケットに切り替える。
- 送信側は全てのデータを転送し終わった後、EOTを送出する。
- 受信側は次のファイルを要求するために転送ファイルスキップパケットを送出する。
- 手順1に戻る。
エラーが発生した場合
| 受信側 | 送信側 | |
|---|---|---|
| ← | データパケット(2048バイト) | |
| ← | データパケット(2048バイト) | |
| (途中のデータパケットに何らかのエラーがあった) | ||
| NAKパケット(「xxxxバイト目から再送せよ」) | → | |
| ACKパケット | → | |
| ← | 位置情報パケット(「xxxxバイト目から送るよ」) | |
| ← | データパケット(512バイト;小さなパケットに切り替え) | |
| ← | データパケット(512バイト) | |
- CRC符号とデータの間に矛盾があるなどのエラーが発生した場合、受信側は再送を希望する位置情報を添えたNAKパケットを送出する。
- 受信側は続けてACKパケットを送出し、データの送信を要求する。回線状態が悪い場合には(このパケットで)使用するパケット長を再指定することもできる。
- 送信側が位置情報パケットを送出する。
- 送信側は2段階小さなデータパケットを次々に送出する。8パケット送出してもエラーがない場合は、1段階ずつ大きなパケットに切り替える。
中断処理
何らかの事情により転送途中に通信を終了させたい場合は転送強制中断パケットを送出する。これは受信側・送信側のどちらが送出しても良い。
リジューム転送
| 受信側 | 送信側 | |
|---|---|---|
| ヘッダ要求パケット | → | |
| ← | ヘッダパケット(1つめのファイル) | |
| 位置情報パケット(「xxxxバイト目から転送せよ」) | → | |
| ACKパケット(使用するパケット長を指定) | → | |
| ← | 位置情報パケット(「xxxxバイト目から送るよ」) | |
| ← | データパケット(1024バイト) | |
| ← | データパケット(1024バイト) |
何らかの事情により転送途中に通信が途切れてしまった場合でも、次回接続時に途切れた場所から転送をやり直すことができる。この場合、受信側は通信開始時のACKパケットに先立って位置情報パケットを送出し、転送開始位置を指定する。
ファイルスキップ
| 受信側 | 送信側 | |
|---|---|---|
| ヘッダ要求パケット | → | |
| ← | ヘッダパケット(1つめのファイル) | |
| 転送ファイルスキップパケット(「そのファイルは送信しなくて良い」) | → | |
| ヘッダ要求パケット(次のファイルの情報を要求) | → |
既に同じファイルが手元にあったなどの場合、受信側は転送ファイルスキップパケットを送出することでファイル転送をスキップすることができる。