YMODEM 协议是一种高效的文件传输协议,通常用于调制解调器之间的数据传输。YMODEM 协议的产生是为了解决 XMODEM 协议存在的一些问题。相较于 XMODEM,YMODEM 协议在数据传输效率和稳定性上有所改进。

YMODEM 协议的主要特点包括:

  1. 数据包大小:YMODEM 协议支持以 1024 字节(或 1K)的块进行数据传输,这比 XMODEM 协议通常使用的 128 字节块要大得多,从而提高了传输效率。
  2. 错误纠正:YMODEM 协议采用循环冗余校验(CRC16)进行错误检测,并在发现错误时请求重发数据块,以确保数据的正确传输。
  3. 批处理模式:YMODEM 协议支持批处理模式,允许使用单个命令传输多个文件,这在传输大量文件时非常有用。
  4. 文件名传输:在发送文件数据之前,YMODEM 协议会先发送文件名和文件大小等信息,以便接收方能够正确地保存文件。

YMODEM 协议中定义了几种关键字

关键字 说明
SOH 0x01 协议头(128 bytes 类型)
STX 0x02 协议头(1K 类型)
EOT 0x04 传输结束
ACK 0x06 接收响应
NAK 0x15 失败响应
CAN 0x18 取消传输
C 0x43 开启文件传输
CPMEOF 0x1A 数据补齐填充字符(^Z,控制字符 Z)

YMODEM 传输协议

SOH [index] [index2] [128 bytes data] [CRC-hi] [CRC-lo]

STX [index] [index2] [1024 bytes data] [CRC-hi] [CRC-lo]

index 是帧序号,0 ~ 255,传输时递增。

index2 是index取反,也即:index2 = ~index = 255 - index

crc16 校验数据域 [data]

在 YMODEM 协议的基本流程中,发送方会先发送一个起始帧,其中包含文件名和文件大小等信息。接收方在收到起始帧后,会发送一个确认信号(ACK)。然后,发送方开始以 1024 字节的块发送文件数据,每发送一个数据块后都会等待接收方的 ACK 信号。如果接收方成功接收到数据块并通过 CRC 校验,则发送 ACK 信号;否则,发送否定确认信号(NAK)请求重发。当文件传输完成后,发送方会发送一个结束帧(EOT),接收方在收到结束帧后会再次发送 ACK 信号进行确认。

交互序列图

传输时先发送一个 128 字节的文件信息块,将文件名和文件大小发送给设备。

SOH 00 FF [filename] [filesize] [NULL] CRCH CRCL

[filename] 文件名,如文件名 foo.c,它在数据帧中存放格式为:66 6F 6F 2E 63 00

[filesize] 文件大小,例如大小为 400 bytes,它在数据帧的存放格式为:34 30 30 00,即 “400”。(不同的软件可能有所却别)

[NULL] 表示剩下的字节都用 00 填充

传输文件内容时,如果文件数据的最后剩余的数据在 128 ~ 1024 之间,则还是使用 STX 的 1024 字节传输;如果文件大小小于等于 128 字节,则选择 SOH 数据帧用 128 字节来传输数据。若数据不足一帧,用 CPMEOF 来填充。

附:

XMODEM/YMODEM 协议:

http://pauillac.inria.fr/~doligez/zmodem/ymodem.txt

ZMODEM 协议:

http://gallium.inria.fr/~doligez/zmodem/zmodem.txt