Ymodem 协议概述
Ymodem 是 Xmodem 协议的扩展版本,由 Chuck Forsberg 在 1980 年代提出,主要用于文件传输。它在 Xmodem-1K 的基础上增加了批处理传输、文件名和文件大小支持,并采用 CRC-16 校验提升可靠性。Ymodem 协议分为两种变体:标准 Ymodem(基于 Xmodem-1K)和 Ymodem-g(无校验的流模式)。
Ymodem 帧结构
Ymodem 数据帧基于 Xmodem-1K 的 1024 字节块格式,但扩展了头部信息:
-
起始帧(SOH/STX):
- 首帧为 SOH(128 字节头部)或 STX(1024 字节头部),后续帧通常为 STX。
- 首帧包含文件名、文件大小(ASCII 格式)及空字节填充。
- 示例:
[SOH][00][FF][文件名][文件大小][填充][CRC-Hi][CRC-Lo]
-
数据帧:
- 帧号从 1 开始递增(模 256),次帧为 0xFF - 帧号。
- 数据部分为 1024 字节,不足时用 0x1A(Ctrl-Z)填充。
-
结束帧(EOT):
- 发送方发送 EOT(0x04)表示文件传输结束;接收方回复 ACK(0x06)确认。
传输流程
发送方流程:
- 等待接收方发送 'C'(CRC 模式请求)。
- 发送起始帧(含文件名和大小)。
- 接收 ACK 后发送数据帧,每帧等待 ACK。
- 文件结束时发送 EOT,收到 ACK 后发送下一个文件或结束会话。
接收方流程:
- 发送 'C' 启动 CRC 模式。
- 接收起始帧并解析文件名和大小,回复 ACK。
- 接收数据帧并校验,成功则回复 ACK,失败回复 NAK(0x15)重传。
- 收到 EOT 后发送 ACK 结束传输。
校验机制
Ymodem 使用 CRC-16 校验(多项式 0x1021),替代 Xmodem 的累加和。校验范围包括帧头、帧号、数据及填充部分。
CRC-16 计算示例(C 语言):
uint16_t crc16(uint8_t *data, size_t len) {
uint16_t crc = 0;
for (size_t i = 0; i < len; i++) {
crc ^= (uint16_t)data[i] << 8;
for (uint8_t j = 0; j < 8; j++)
crc = (crc & 0x8000) ? (crc << 1) ^ 0x1021 : crc << 1;
}
return crc;
}
Ymodem-g 变体
Ymodem-g 去除了每帧的 ACK/NAK 握手,适用于高速可靠链路(如调制解调器错误纠正模式)。接收方仅在文件结束时发送 ACK,传输失败需完全重传。
典型应用场景
- 嵌入式系统固件升级:通过串口或 Bootloader 实现。
- 旧式调制解调器通信:支持批处理传输多个文件。
工具示例:
- Linux 下使用
lrzsz工具包中的sz(发送)和rz(接收)。 - 终端工具(如 SecureCRT、Minicom)内置 Ymodem 支持。
注意事项
- 超时处理:默认超时为 10 秒,超时后重传或终止。
- 文件大小限制:原始协议不支持超过 2GB 的文件。
- 兼容性:部分实现可能省略文件名传输或使用非标准扩展。


被折叠的 条评论
为什么被折叠?



