文件传输协议
————————————————
我们使用串口或者其他通信接口进行文件传输的时候,如果我们不进行相关的协议,那在文件传输的时候,文件很难被识别,而且文件传输错误也很难被发现,所以在进行文件传输时,为使文件能被正确识别和传送,我们需要在两台计算机之间建立统一的传输协议。这个协议包括了文件的识别、传送的起止时间、错误的判断与纠正等内容。
这种文件传输协议可以自定义实现也可以使用标准协议,使用标准协议就可以免去开发上位机过程。
Xmodem、Ymodem和Zmodem协议是最常用的三种文件传输协议。
Xmodem协议是最早的,传输128字节信息块,之后也支持到1k的传输。
Ymodem是Xmodem的增强版协议。具有传输快速稳定的优点,它可以一次传输1024字节的信息块,同时还支持传输多个文件。传输过程中还会携带,文件名,大小,修改时间等信息。
对于同时支持128字节传输和1024字节进行传输的协议,在使用之前需要在软件中进行配置,如果勾选了1024bytes选项,那么在传输过程中,将使用1k的帧格式来进行传输。

XMODEM
————————————————
XMODEM是一种简单的文件传输协议,由 Ward Christensen 于 1977 年开发,用于MODEM.ASM终端程序。它允许用户在双方使用 MODEM 时在计算机之间传输文件。Keith Petersen 做了一个小更新-“quiet mode”,并将此次更新后称为 XMODEM。
XMODEM 与大多数文件传输协议一样,将原始数据分解为一系列“数据包”,并发送给接收方,同时发送附加信息,以便接收方确定该数据包是否被正确接收。如果检测到错误,接收方将请求重新发送数据包。但是如果有一串坏数据包就会导致传输中止。
XMODEM 在早期的BBS市场上非常受欢迎,主要是因为它易于实现。但它的效率也相当低,随着调制解调器速度的提高,这个问题导致开发了许多 XMODEM 的修改版本,以提高性能或解决该协议的其他问题。Chuck Forsberg认为最初的 XMODEM 是“计算机历史上修改最多的程序”。
Chuck Forsberg将常见的问题修改都收集到他的YMODEM协议中,但由于实施不力,导致进一步分裂,后来才由他后来的ZMODEM协议重新统一。ZMODEM 变得非常流行,但在 BBS 市场上未完全取代 XMODEM。
数据包结构
最初的 XMODEM 使用 128 字节数据包,这是CP/M 软盘上使用的基本块大小。数据包以简单的 3 字节标头作为 SOH 前缀,其中包含一个字符、一个 1-255 的“块号”和“反向”块号 - 255 减去块号。发送的第一个块的块编号从 1 开始,而不是从 0 开始。标头后面是 128 字节数据,然后是单字节校验和。校验和是数据包中所有 128 个数据字节的总和,以256为模。因此,完整的数据包长度为 132 字节,包含 128 字节的有效载荷数据,总通道效率约为 97%。
SOH | freamNum ① ~freamNum | data[1] ~ data[n] | pad[128-n] ~ pad[128] ② | CRCH | CRCL |
---|---|---|---|---|---|
01H | 01H | feH | data[1] ~ data[n] | pad[128-n] ~ pad[128] | CRCH |
文件在最后一个块后发送一个EOT字符,以此标记“完成” 。此字符不在数据包中,而是作为单个字节单独发送。由于文件长度不是作为协议的一部分发送的,因此最后一个数据包用可以丢弃的“已知字符”填充。在原始规范中,默认为 SUB 或十进制 26 ,CP/M 将其用作其自身磁盘格式中的文件结束标记。标准建议可以使用任何字符进行填充,但无法在协议本身内对其进行更改 - 如果实现更改了填充字符,则只有使用相同实现的客户端才能正确解释新的填充字符。
会话传输过程、

文件每次传输一个数据包。接收方收到数据包后,计算数据包的校验和,并将其与数据包末尾从发送方收到的校验和进行比较。如果两者匹配,接收方会向发送方发送一条ACK消息,然后发送方按顺序发送下一个数据包。如果校验和有问题,接收方会发送一个NAK。如果收到一个NAK,发送方会重新发送数据包,并继续尝试几次(通常是十次),然后中止传输。
如果接收方在 10 秒内未收到有效数据包,但仍因缺少字符而等待数据,也会发送NAK。数据包内EOT还使用了 7 秒超时,以防止在数据包中间断开连接。
还可以以简单的方式检查块编号而检查错误。成功接收数据包后,下一个数据包的编号应大一个。如果它收到相同的块编号,则不认为这是一个错误,这意味着ACK发送者没有收到该数据包,然后重新发送了该数据包。
传输由接收方驱动;在接收方发送NAK初始命令之前,发送方不会发送任何数据。这是用户与远程发送机器交互方式的逻辑结果。由于向远程系统请求文件和发出本地接收命令之间的延迟未知,因此 XMODEM 允许接收方最多等待 90 秒才能开始发出数据包请求。
示例
姓名 | 年龄 | 工作 |
---|---|---|
小可爱 | 18 | 吃可爱多 |
小小勇敢 | 20 | 爬棵勇敢树 |
小小小机智 | 22 | 看一本机智书 |
发送端 —> | <— 接收端 |
---|---|
43 | |
01 01 FE 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 B4 A3 | |
06 | |
01 02 FE 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 B4 A3 | |
06 | |
01 03 FE 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 B4 A3 | |
06 | |
01 04 FE 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 B4 A3 | |
06 | |
01 05 FE 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 B4 A3 | |
06 | |
01 06 FE 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 B4 A3 | |
06 | |
01 07 FE 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 B4 A3 | |
06 | |
01 08 FE 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 B4 A3 | |
06 | |
04 | |
15 | |
04 | |
06 |
问题
尽管 XMODEM 很强大,一名记者在 1982 年用Osborne 1和声耦合器通过质量较差的电话线从巴基斯坦向美国传送了报道,但该协议仍存在几个缺陷。
XMODEM 是为CP/M机器编写的,带有该操作系统的几个标记。值得注意的是,CP/M 上的文件大小是 128 字节的倍数,并且它们的结尾在块内用 EOT 字符标记。这些特性被直接移植到 XMODEM 中。但是,其他操作系统不具备这些特性,并且在 20 世纪 80 年代早期广泛引入MS-DOS导致 XMODEM 必须进行更新才能注意到 EOT 或 EOF 作为文件结尾标记。
XMODEM 的设计理念很简单,不需要了解其他文件传输协议(反正这些协议也相当少见)。由于其简单性,存在一些非常基本的错误,这些错误可能会导致传输失败,甚至更糟的是,导致协议无法检测到错误的文件。这主要是由于使用简单的校验和进行错误校正,如果两个位被反转,则容易导致数据中出现错误,这种情况可能会在短暂的噪声突发中发生。此外,在数据本身未受损的情况下,类似的报头或校验和损坏也可能导致传输失败。
许多作者引入了 XMODEM 的扩展来解决这些问题和其他问题。许多人要求将这些扩展作为新 XMODEM 标准的一部分。然而,Ward Christensen 拒绝这样做,因为正是这些功能的缺乏以及支持它们所需的相关编码导致了 XMODEM 的广泛使用。正如他所解释的那样:
It was a quick hack I threw together, very unplanned (like everything I do), to satisfy a personal need to communicate with some other people. ONLY the fact that it was done in 8/77, and that I put it in the public domain immediately, made it become the standard that it is...
...People who suggest I make SIGNIFICANT changes to the protocol, such as 'full duplex', 'multiple outstanding blocks', 'multiple destinations', etc etc don't understand that the incredible simplicity of the protocol is one of the reasons it survived.
这是我临时拼凑起来的一个小窍门,毫无计划(就像我做的所有事情一样),以满足与其他人交流的个人需求。只是因为它是在 1977 年 8 月完成的,而且我立即把它放到了公共领域,才让它成为了标准……
...那些建议我对协议进行重大修改的人,比如“全双工”、“多个未完成块”、“多个目的地”等等,他们不明白协议的难以置信的简单性是它得以存活的原因之一。
XMODEM 的另一个问题是,它要求传输由用户驱动,而不是自动完成。这意味着用户将在发送方的系统上导航选择他们想要的文件,然后使用命令将该系统置于“准备发送”模式。然后,他们使用终端中的命令从他们的终端触发传输。如果用户想要传输另一个文件,他们必须再次重复此过程。
CRC校验
原始协议中使用的校验和非常简单,数据包中的错误可能被忽略。这导致John Byrns引入了XMODEM-CRC ,它使用 16 位CRC代替 8 位校验和。CRC 不仅对数据包中的数据进行编码,还对其位置进行编码,使其能够注意到校验和可能遗漏的位替换错误。从统计学上讲,这使得检测到长度小于 16 位的错误的几率达到 99.9969%,对于更长的错误位串,检测几率甚至更高。
XMODEM-CRC 的设计目标是向后兼容 XMODEM。为此,接收方发送一个C(大写 C)字符而不是一个NAK来启动传输。如果发送方通过发送数据包进行响应,则假定发送方“知道”XMODEM-CRC,接收方继续发送C一个。如果没有数据包,则接收方假定发送方不知道该协议,并发送一个NAK来启动“传统”XMODEM 传输。
不幸的是,这种向后兼容的尝试有一个缺点。由于初始C字符可能会丢失或损坏,因此不能假设接收方不支持 XMODEM-CRC,因为第一次尝试触发传输失败。因此,接收方尝试使用启动传输三次C,每次尝试之间等待三秒钟。这意味着,如果用户在尝试与任何XMODEM 通信时选择了 XMODEM-CRC(这是预期的),则在传输开始之前可能会有 10 秒的延迟。
为了避免延迟,发送者和接收者通常会将 XMODEM-CRC 与 XMODEM 分开列出,如果发送者没有明确列出,则允许用户选择“基本”XMODEM。对于普通用户来说,XMODEM-CRC 本质上是“第二种协议”,并按此处理。

XMODEM-1K
解决吞吐量问题的另一种方法是增加数据包大小,虽然延迟的基本问题仍然存在。带有 1024 字节数据包的 XMODEM-1K 是最流行的此类解决方案。在这种情况下,在与上述相同的假设下,9600 bit/s 的吞吐量为 81%。
XMODEM-1K 是 XMODEM-CRC 的扩展版本,它通过在数据包开头使用字符 STX 而不是 SOH 来指示发送方的较长块大小。与其他向后兼容的 XMODEM 扩展一样,它旨在使 -1K 传输可以在另一端使用任何 XMODEM 实现启动,并根据需要退出功能。
XMODEM-1K 最初是Chuck Forsberg在他的YMODEM协议中引入的众多 XMODEM 改进之一。Forsberg 建议各种改进都是可选的,希望软件作者尽可能多地实现它们。相反,他们通常只实现了最低限度,导致大量半兼容实现,并最终将名称“YMODEM”拆分为“XMODEM-1K”和各种 YMODEM。因此,XMODEM-1K 实际上是 YMODEM 的后续产品,但无论如何仍然相当常见。
YMODEM
YMODEM 由Chuck Forsberg开发,是XMODEM的扩展,并首次在他的CP/M YAM程序中实现。它最初也被称为 YAM,1985 年由原始 XMODEM 的作者Ward Christensen正式命名为“YMODEM” 。
YMODEM 以三种方式扩展了 XMODEM,结合了其他扩展 XMODEM 变体中的功能。与 XMODEM-CRC 一样,YMODEM用 16 位循环冗余校验(CRC) 取代了 8 位校验和,但将其作为默认校正形式而不是可选形式。它从 TeLink 添加了发送文件名和大小的“块 0”标头,从而允许批量传输(单个会话中的多个文件),并且无需在文件末尾添加填充。最后,YMODEM 允许将块大小从原始的 128 字节数据增加到 1024,就像在XMODEM-1k中一样,这大大提高了MODEM的吞吐量。
平常所说的Ymodem协议是指的Ymodem-1K,除此还有Ymodem-g(没有CRC校验,不常用)。
YModem-1K用1024字节信息块传输取代标准的128字节传输,数据的发送回使用CRC校验,保证数据传输的正确性。它每传输一个信息块数据时,就会等待接收端回应ACK信号,接收到回应后,才会继续传输下一个信息块,保证数据已经全部接收。
升级XMODEM内容
中止
原始 XMODEM 的一个问题是,一旦开始传输,就没有明确的方法可以中止传输。正常的解决方案是,如果用户要求,则向每个后续数据包发送NAK 。由于 XMODEM 协议定义了中止发送的NAK上限为 10个,而发送每个数据包可能需要一秒钟,这意味着发送方会持续发送被忽略的数据,从而产生 10 秒的延迟。
一些扩展实现是添加了在接收数据包末尾发送CAN而不是ACK或NAK来指示中止的功能。不幸的是,线路噪声可能会生成CAN并触发中止。因此,YAM 对此进行了轻微修改,要求两个CAN连续发送,这将立即在发送方端执行“正常中止”。
CRC
XMODEM-CRC 中引入了 CRC 支持。这是对原始协议的一个非常简单的更改;如果收到请求,接收方将尝试通过发送初始C而不是NAK来触发传输。如果远程发送方支持 CRC 选项,它将开始正常发送数据包。YAM 无需任何更改即可支持此选项。
1k
XMODEM-1k 引入了 1024 字节数据包。此版本没有更改接收方的触发字符,因此发送方无法知道接收方是否支持更大的数据包。相反,XMODEM-1k 在连接的两端都作为单独的协议呈现。启动此类连接时,发送方可以选择在数据包中发送 1024 字节或 128 字节,使用标头中的STX字符而不是正常的SOH来指示较大的数据包。通常只有最后几个数据包会使用较小的数据包,以避免发送大量填充。1k 还假设所有连接都使用 CRC。YAM 支持 1k,没有任何变化。
零数据包
为了支持FidoNet邮件的自动传输,MODEM7 引入了在发送第一个数据块之前以纯文本形式发送文件名的功能。这并不可靠,TeLink 通过将文件名以及可选的其他数据(如创建日期和文件长度)放在一个完整的 128 字节数据包中来改进这一点。XMODEM 从数据包 1 开始传输,因此 TeLink 将此数据包作为数据包 0 发送。这种“零数据包”或“块 0”在其他 FidoNet 系统(如 SEAlink 等)中变得很常见。
YAM 支持零数据包格式,但许多第三方 YMODEM 实现都忽略了该格式。当一个实现尝试将零数据包发送到非感知版本时,接收方自然会NAK数据包,因为零数据包是非法的。然后,发送方会将NAK视为传输错误并尝试再次发送数据包,尝试十次才会失败。
由于尚不完全清楚的原因,许多 YMODEM 实现并未实现此功能。由于它们不知道此功能,因此它们发送NAK,触发一系列重新发送尝试,然后失败。这意味着如果用户选择使用兼容的 YMODEM 和不兼容的版本,传输将失败。尽管如此,这种不兼容的版本很常见。
因此,人们常常将 YMODEM 和 YMODEM Batch 列为两个不同的协议。XMODEM-1k 与这些不合规的 YMODEM 非常相似,这进一步造成了混淆,它们非常相似,以至于经常被错误地列为相同BUG。
Ymodem的帧格式
YModem的传输过程中,除了控制字符之外,因为帧长度不一致,格式一共会出现两种:
数据长度为128时,n < 128,格式如下:

数据长度为1024时,n < 1024,格式如下:

①:字段为帧序号,起始帧和结束帧为00h。如果单个文件传输帧个数超出ffh大小时,从新从00h开始,而不是以01h开始,因为起始帧也算在帧计数当中。
②:数据长度不足1024字节时补齐至帧长度,起始帧和结束帧补充00h,数据帧补充1Ah。
③:原理上帧格式由剩余数据长度来决定,如以1024传输时,如果剩余传输长度不足1024时,应发送用1ah补全的STX包。但是根据在CRT中测试,不足1024时则是拆成128字节的SOH包传输的,这样也是被允许的,因为ymodem要求接收端能同时兼容接收STX与SOH的帧。
会话传输过程
文件的传输过程,注意:数据帧n(文件内容末尾)根据剩余字节长度决定帧格式(主要是帧头和长度)
发送端 —> | <— 接收端 |
---|---|
‘C’ | |
标号:多文件续传 | |
起始帧 | |
ACK | |
‘C’ | |
数据帧1 | |
ACK | |
数据帧2 | |
ACK | |
数据帧3 | |
ACK | |
… … | … … |
数据帧n | |
ACK | |
EOT | |
NAK | |
EOT | |
ACK | |
‘C’ | |
如果还有文件待发送,上面应答ACK和'C'后, | |
跳转到上面的多文件续传标号位置 | |
等待发送端回复起始帧, | |
否则发送端回复结束帧,传输结束 | |
结束帧 | |
ACK |
实例
发送端 —> | <— 接收端 |
---|---|
43 | |
02 00 FF 31 31 31 2E 74 78 74 00 31 30 32 34 20 | |
31 34 32 33 35 32 33 34 30 37 30 20 30 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 F0 F0 | |
06 43 | |
02 01 FE 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 | |
31 31 31 BD 44 | |
06 | |
04 | |
15 | |
04 | |
06 43 | |
01 00 FF 32 32 32 2E 74 78 74 00 31 30 32 34 20 | |
31 34 32 33 35 32 33 34 30 36 33 20 30 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 EE D9 | |
06 43 | |
01 01 FE 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 77 E2 | |
06 | |
01 02 FD 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 77 E2 | |
06 | |
01 03 FC 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 77 E2 | |
06 | |
01 04 FB 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 77 E2 | |
06 | |
01 05 FA 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 77 E2 | |
06 | |
01 06 F9 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 77 E2 | |
06 | |
01 07 F8 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 77 E2 | |
06 | |
01 08 F7 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 | |
32 32 32 77 E2 | |
06 | |
04 | |
15 | |
04 | |
06 43 | |
01 00 FF 33 33 33 2E 74 78 74 00 31 30 32 34 20 | |
31 34 32 33 35 32 33 34 31 32 32 20 30 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 9E 90 | |
06 43 | |
01 01 FE 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 36 DD | |
06 | |
01 02 FD 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 36 DD | |
06 | |
01 03 FC 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 36 DD | |
06 | |
01 04 FB 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 36 DD | |
06 | |
01 05 FA 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 36 DD | |
06 | |
01 06 F9 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 36 DD | |
06 | |
01 07 F8 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 36 DD | |
06 | |
01 08 F7 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 | |
33 33 33 36 DD | |
06 | |
04 | |
15 | |
04 | |
06 43 | |
01 00 FF 00 30 20 30 20 30 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | |
00 00 00 A2 7C | |
06 |
Zmodem
ZMODEM是一种内联文件传输协议,由Chuck Forsberg于 1986 年开发,该项目由Telenet资助,旨在改善其X.25网络上的文件传输。除了与旧协议相比性能显著提高外,ZMODEM 还提供可重启传输、发送方自动启动、扩展的 32 位CRC和支持8 位清洁传输的控制字符引用,使其可以在不会传递控制字符的网络上使用。
与为 BBS 开发的大多数传输协议不同,ZMODEM 并非直接基于开创性的XMODEM ,也不与其兼容。为了解决 XMODEM 的一个或多个缺点,开发了许多 XMODEM 变体,并且大多数变体保持向后兼容,并能使用“经典” XMODEM 实现成功完成传输。当然也包括 Forsberg 自己的YMODEM。
ZMODEM 放弃了向后兼容性,转而采用一种彻底改进的协议。它的性能至少与任何高性能的 XMODEM 一样好,在以前根本无法工作的链路(如 X.25)或性能较差的链路(如Telebit调制解调器)上也能正常工作,并且还包含其他协议中很少出现的有用功能。20 世纪 90 年代初,ZMODEM 在 BBS 上变得非常流行,成为与之前的 XMODEM 一样广泛使用的标准。
因为我们后续也不使用Zmodem,所以就不深入讨论了。
参考
https://en.wikipedia.org/wiki/ZMODEM
http://gallium.inria.fr/~doligez/zmodem/zmodem.txt
示例部分引用自:
https://blog.csdn.net/weixin_44058570/article/details/121096393
http://textfiles.com/programming/ymodem.txt
https://en.wikipedia.org/wiki/YMODEM