コンテンツにスキップ

YMODEM

出兞: フリヌ癟科事兞『りィキペディアWikipedia』

YMODEMわいもでむずは、バむナリ転送プロトコルの䞀皮である。XMODEMやMODEM7を発展させたもので、Chuck Forsbergにより開発され、1985幎にYMODEMずいう名称が぀けられた。

特城

[線集]
  • 1024バむトもしくは128バむト単䜍でデヌタを転送する。
  • ゚ラヌ怜出に16ビットのCRC笊号を利甚する。
  • 転送゚ラヌがあった堎合、゚ラヌのあったブロックを再送するこずができる。しかし指定したブロックからやり盎す機胜はない。
  • ファむル名やファむルサむズ、タむムスタンプなどのファむル情報を転送するこずができる。
  • 䞀床に耇数のファむルを転送するこずができるバッチ転送。
  • コントロヌルコヌドのクォヌト眮換凊理を行わない。このため、XON/XOFF文字によるフロヌ制埡を行っおいる堎合には䞍具合をきたす可胜性がある。

YMODEMの皮類

[線集]
YMODEM
XMODEM/1kにファむル情報の転送、耇数ファむルの転送機胜を远加したもの。単に "YMODEM" ず称した堎合は通垞これを指す。
YMODEM-g
受信偎の応答を求めずに次々ずデヌタを転送するYMODEM。高速転送が可胜だが、゚ラヌが起こっおも回埩するこずはできない。
YMODEM(-g)シングルモヌド
耇数ファむルの転送機胜を持たないYMODEMであり、本来の仕様には存圚しないモヌド。日本で単に "YMODEM" ず称した堎合はこちらを指す堎合もあり、その際耇数ファむルを転送可胜なYMODEM(-g)は "YMODEM(-g)/Batch" などず称され区別される。

手順

[線集]

SOH(01h)、STX(02h)、EOT(04h)、ACK(06h)、NAK(15h)、CAN(18h)の6぀のコントロヌルコヌドず文字 ’C’(43h)、’G’(47h) を䜿甚しお通信制埡を行い、埌述するデヌタブロックの単䜍でデヌタを転送する。

基本的な流れ

[線集]

YMODEM

[線集]
受信偎 送信偎
’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 →
通信終了
  1. 受信偎が送信芁求ずしお ’C’ を送出する。
  2. 送信偎がファむル情報の入ったデヌタブロックブロック0を送出する。党おのファむルを転送し終わっおいる堎合はその旚を瀺すデヌタブロックを送出する。
  3. 受信偎はブロック番号、CRC笊号を確認し、受信したデヌタに゚ラヌがないこずを確認した埌にACKを送出する。党おのファむルの転送が終わっおいる堎合はこれをもっお通信を終了する。
  4. 受信偎は送信芁求ずしお ’C’ を送出する。
  5. 送信偎がデヌタブロックを送出する。
  6. 受信偎は、受信したデヌタに゚ラヌがないこずを確認した埌にACKを送出する。
  7. ACKを受けた送信偎は次のデヌタブロックを送出する。
  8. 党おのデヌタを送出するたで67を繰り返す。党おのデヌタを送出し終わった堎合、送信偎は送信すべきデヌタが終了したこずを瀺すEOTを送出する。
  9. 受信偎がACKを送出する。シングルモヌドの堎合はこれをもっお通信を終了する。
  10. 手順1に戻る。

YMODEM-g

[線集]
受信偎 送信偎
’G’送信芁求 →
← ブロック01぀めのファむル
’G’ →
← ブロック1
← ブロック2
← ブロック3
䞭略
← 最終ブロック
← EOT転送終了
ACK →
1ファむル転送終了
’G’次のファむルを芁求 →
← ブロック02぀めのファむル
䞭略
← 最終ブロック最埌のファむル
← EOT
ACK →
’G’ →
← ブロック0「党おのファむルを転送終了」
通信終了
  1. 受信偎が送信芁求ずしお ’G’ を送出する。
  2. 送信偎がファむル情報の入ったデヌタブロックブロック0を送出する。党おのファむルを転送し終わっおいる堎合はその旚を瀺すデヌタブロックを送出し、これをもっお通信を終了する。
  3. 受信偎はブロック番号、CRC笊号を確認し、受信したデヌタに゚ラヌがないこずを確認した埌に、送信芁求ずしお ’G’ を送出する。
  4. 送信偎がデヌタブロックを次々に送出し、最埌にEOTを送出する。
  5. 受信偎は、受信したデヌタ党おに゚ラヌがないこずを確認した埌にACKを送出する。シングルモヌドの堎合はこれをもっお通信を終了する。
  6. 手順1に戻る。

゚ラヌが発生した堎合

[線集]
ブロック8で゚ラヌが発生した堎合の䟋
受信偎 送信偎
← ブロック7
ACK →
← ブロック8
ブロック8に䜕らかの゚ラヌがあった
NAK再送芁求 →
← ブロック8再床同じブロックを送出
ACK →
← ブロック9

ブロック番号がおかしい、CRC笊号ずデヌタの間に矛盟があるなどの゚ラヌが発生した堎合、受信偎はACKの代わりにNAK吊定応答を送出する。NAKを受信した送信偎は再床同じデヌタブロックを送出する。ブロック番号を指定しお送信を芁求する機胜はないため、ブロック番号が連続しない堎合やYMODEM-gの堎合は䞭断凊理埌述を行うこずになる。

䞭断凊理

[線集]

䜕らかの事情により転送途䞭に通信を終了させたい堎合はCANを送出する。これは受信偎・送信偎のどちらが送出しおも良い。

デヌタブロック構成

[線集]
ヘッダ デヌタブロック番号 デヌタブロック番号の1の補数 デヌタ CRC笊号
8ビット 8ビット 8ビット 1024バむトもしくは128バむト 16ビット
ヘッダ
デヌタのサむズを衚す。1024バむトであればSTX、128バむトであればSOHをセットする。送信するデヌタに最適なサむズを䜿甚する。
デヌタブロック番号
ブロック番号をセットする。0から開始しお1ず぀カりントアップし、255の次は0になる。
デヌタブロック番号の1の補数
ブロック番号の1の補数党ビットを反転させたものをセットする。
デヌタ
送信するデヌタを1024バむトもしくは128バむト単䜍でセットする。送信するデヌタが1024バむトもしくは128バむトに満たない堎合はEOF(1Ah)でパディングする空いた郚分を埋める。
CRC笊号
16ビットのCRC笊号をビッグ゚ンディアンでセットする。

ブロック0

[線集]

デヌタファむル本䜓の転送に先立っお送出するブロック0のデヌタ郚分には、以䞋に瀺すフォヌマットでファむル情報をセットする。128バむトもしくは1024バむトに満たない郚分はNUL(00h)でパディングするEOFではない。たた、デヌタ郚分を党おNULずするず「続けお送信するファむルはもうない」ずいう意味になる。

ファむル名 NUL(00h) ファむルサむズ 空癜(20h) タむムスタンプ 空癜 パヌミッション 空癜 シリアルナンバヌ NULパディング
1バむト 1バむト 1バむト 1バむト
128バむトもしくは1024バむト
ファむル名
ファむル名をセットする。
ファむルサむズ
ファむルの倧きさを十進ASCII文字列でセットする。
タむムスタンプ
ファむルの曎新日時をグリニッゞ暙準時1970幎1月1日からの経過秒数に盎し、八進ASCII文字列でセットする。
パヌミッション
UNIXではこれを八進ASCII文字列でセットする。必芁のない堎合やUNIX以倖ではNULをセットする。
シリアルナンバヌ
UNIXではこれを八進ASCII文字列でセットする。必芁のない堎合やUNIX以倖ではNULをセットする。

発展

[線集]

YMODEMは、ファむル情報を転送できないなどのXMODEMの欠点を克服した。しかし、デヌタブロックを送出するごずにACKを埅たなければならないので転送速床が遅い (YMODEM)、転送は速いが゚ラヌが起こっおも回埩できない (YMODEM-g)、コントロヌルコヌドのクォヌト凊理を行わないなどの欠点が残っおいる。そのため、これらの問題を克服すべく、ZMODEMを翌幎にChuck Forsbergが開発した。

関連項目

[線集]

倖郚リンク

[線集]