Nmodem(えぬもでむ)は、HN「謎の青年失業家」が1991年に発表したバイナリ転送プロトコルの一種。パソコン通信で使用された。通信状態に応じ最大4096バイトの可変長パケットを使用してデータを転送する、ファイル情報を転送できる、一度に複数のファイルを転送できる、リジューム転送ができるなどの特徴を持つ。
対応したホストが少なかった(謎的電網.exe、絵理香K版がサポート。そのほかソースコードが公開されているホストプログラムに組み込んで運用した例もあった)こと、対応したパソコン通信クライアントソフトが皆無であったことなどの事情により、広く使用されることはなかった。
なお、海外で使用された同名のプロトコル " ⇒NMODEM" は、XMODEM/CRCを拡張した別物である。
目次
1 特徴
2 手順
2.1 基本的な流れ
2.2 エラーが発生した場合
2.3 中断処理
2.4 リジューム転送
2.5 ファイルスキップ
3 各種パケットのフォーマット
3.1 ヘッダパケット
3.2 位置情報パケット
3.3 データパケット
3.4 ヘッダ要求パケット
3.5 ACKパケット
3.6 NAKパケット
3.7 転送ファイルスキップパケット
3.8 転送強制中断パケット
4 関連項目
5 外部リンク
//
特徴
最小128バイト、最大4096バイト単位でデータを転送する。
エラー検出に16ビットのCRC符号を利用する。
転送エラーがあった場合、エラーのあった場所から転送をやり直すことができる。
途中で通信が途切れてしまった場合でも、後に途切れた場所から転送を再開することができる(リジューム転送)。
ファイル名やファイルサイズ、タイムスタンプなどのファイル情報を転送することができる。
一度に複数のファイルを転送することができる(バッチ転送)。
コントロールコードのクォート(置換)処理を行わない。
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パケットに先立って位置情報パケットを送出し、転送開始位置を指定する。