XMODEM, YMODEM, and ZMODEM

由于平时使用rz/sz较多,r/s好理解,一个send一个receive。但是由不太清楚z是什么意思,故有此文。
sx/rx, sb/rb (b=batch)和sz/rz分别实现了xmodem,ymodem和zmodem文件传输协议。

Xmodem(1977 Ward Christensen )->Ymodem(1985 Chuck Forsberg )->Zmodem(1986 Chuck Forsberg)

先有Xmodem,后逐渐演化成Ymodem,但是Ymodem还是不够快速缺点也多,再后来便发展为Zmodem,也就是我们日常工作中使用相当多的文件传输协议之一。

Xmodem

广泛使用的文件传输协议之一。最初的Xmodem协议使用128字节包和简单的校验和方式做为错误检测。随后改进为Xmodem-CRC,使用更加安全的循环冗余校验(Cyclic Redundancy Check )方式作为错误检测。Xmodem协议总是尝试优先使用CRC,如果发送方未收到使用CRC方式的请求消息,接收方则会切换为校验和方式继续请求传输。

校验和方式

包结构

byte1byte2byte3bytes 4~131=128bytesbyte132
SOH(Start of Header)block no255-(block no)data packetchecksum

打个比方,发一次文件需要分5块(block),那么block no 是从1到5,又假设这5块的数据包分别是d1~d5,那么checksum=sum(d1+d2+d3+d4+d5)/256 , 这里/是取模。

接收方如何知道某一块是不是最后一块?

以上述例子,在第5块发送完成后,紧接着会发送一个EOT(End of Transmission)标记字符,该字符是以单个字节单独发送。

传输过程

checksum

CRC方式

包结构

byte1byte2byte3bytes 4~131=128bytesbytes132~133
SOHblock no255-(block no)data packetCRC-16

CRC方式在原有checksum的基础上,由一个字节更新为两个字节的CRC,相对于checksum更加安全。CRC循环冗余校验也属于校验和的一种,但是在严格意义上不属于而是属于

Xmodem-1K

包结构

byte1byte2byte3bytes 4~1027=1024bytesbytes1028~1029
STXblock no255-(block no)data packetCRC-16

Xmodem-1K本质上是Xmodem-CRC,只是data packet长度增加为1024bytes(1K),然后第1个字节由SOH更新为STX。在其他系统和BBS上它也被成为YmodemXMODEM-1K最初是Chuck Forsberg在其YMODEM协议中对XMODEM进行的众多改进之一。 Forsberg建议,各种改进是可选的,希望软件作者能够实现尽可能多的改进。 相反,他们通常只实现了最低限度的最低要求,导致大量的半兼容实现,并最终从名称“ YMODEM”拆分为“ XMODEM-1K”和各种YMODEM。

Ymodem

Ymodem是Chuck Forsberg对Xmodem的改进,但Ymodem的命名由Xmodem的原始作者Ward Christensen给出。Ymodem本质上是Xmodem-1K,它允许在同一个会话(session)里同时进行多文件传输。 在某些系统上,它被列为Ymodem Batch

包结构

Ymodem在Xmodem基础上发展,沿用了TeLink协议的添加空头块的做法,也就是增加block 0。该block标识即将发送文件的文件名文件大小文件创建时间戳,如下:

byte1byte2byte3bytes 4~131=128bytesbytes132~133
SOH0x000xFF文件名 文件大小 时间戳CRC-16

Ymodem的block n结构(非第0块), data packet既可以是128位也可以是1024位,可以通过命令控制

byte1byte2byte3bytes 4~131=128bytesbytes132~133
SOHblock no255-(block no)data packetCRC-16
byte1byte2byte3bytes 4~1027=1024bytesbytes1028~1029
STXblock no255-(block no)data packetCRC-16

传输过程

Ymodem允许在同一个会话(session)内同时传输多个文件,以下以多文件为例展示传输过程,单个文件类似。

以128位传输

128

以1K传输

1K

Ymodem-g

YMODEM-g是Ymodem的变体,是一种流协议,以连续流的形式发送和接收1K数据包,直到指示需要停止为止。 在发送下一个数据包之前,它不需要等待接收到ACK。 该协议比YMODEM更快,因为没有在数据包之间引入延迟,但是没有纠正错误的能力。 如果任何块传输失败,则取消整个文件的传输。

Zmodem

随着网络速度加快,已有的x/ymodem协议速度已经跟不上时代的步伐。Zmodem应运而生,它采用窗口滑动机制,Zmodem有两个最重要的特征:高效提供崩溃恢复

高效

只要接收方没有发现错误便允许发送方不停的发送数据包,而无需发送方接收接收方ACK标记(因为可能会有延迟或者错误发生)。允许连续发送的数据包数量称之为窗口,在大部分Zmodem的实现协议中采用2~16个包的数量。

崩溃恢复

如果Zmodem传输被取消或者因为某种原因被干扰,该稍候可以恢复传输,并且无需重新发送之前的内容。

参考

http://web.cecs.pdx.edu/~rootd/catdoc/guide/TheGuide_226.html#SEC237
https://en.wikipedia.org/wiki/XMODEM
https://en.wikipedia.org/wiki/YMODEM
https://en.wikipedia.org/wiki/ZMODEM