一、基础定义

  1. 定位
    • 点对点文件传输协议,基于 XMODEM 改进(Chuck Forsberg, 1980s)。
    • 应用场景:串口通信(RS-232)、嵌入式固件更新、早期 BBS 系统。
  2. 核心改进
    • ✅ 批处理传输(多文件)
    • ✅ 支持文件名 + 文件大小(信息包头部)
    • ✅ 数据块扩容至 1024字节(原 XMODEM 仅 128 字节)
    • ✅ 默认 CRC-16 校验(兼容 XMODEM 的 Checksum)
    • ✅ 更高效错误恢复机制

二、协议流程

1. 初始化协商

接收方指令 含义 发送方响应
'C' (0x43) 要求 CRC-16 + 1024 字节块 发送文件信息包(序号 0)
NAK (0x15) 要求 Checksum + 128 字节块 同上

2. 文件传输流程

sequenceDiagram participant Sender participant Receiver Receiver->>Sender: 'C' 或 NAK(初始化) Sender->>Receiver: [文件信息包](序号 0,含文件名/大小) Receiver-->>Sender: ACK(确认信息包) loop 数据传输 Sender->>Receiver: [数据块](序号 1,2,3...) alt 校验成功 Receiver-->>Sender: ACK else 校验失败/超时 Receiver-->>Sender: NAK Sender->>Receiver: 重传上一包 end end Sender->>Receiver: EOT(文件结束) Receiver-->>Sender: ACK opt 多文件传输 Sender->>Receiver: 下一文件信息包(序号 0) end Sender->>Receiver: [空文件名包](批处理结束) Receiver-->>Sender: ACK

三、数据包结构

1. 文件信息包(序号 0)

字段 长度 说明
起始符 1 Byte SOH (0x01)
包序号 1 Byte 0x00
序号补码 1 Byte 0xFF (~0x00)
数据区 128 Byte 文件名(\x00 结尾)+ 文件大小(ASCII 数字,可选)
校验值 2 Byte CRC-16(低字节在前)

📌 批处理结束信号:数据区为 \x00(空文件名)

2. 数据包

字段 长度 说明
起始符 1 Byte SOH (128B) 或 STX (1024B)
包序号 1 Byte 1, 2, 3...(递增)
序号补码 1 Byte ~包序号
数据区 128/1024 Byte 文件内容(不足则用 SUB(0x1A) 填充)
校验值 1/2 Byte Checksum(1B)或 CRC-16(2B)

四、关键控制字符

字符 十六进制 含义
SOH 0x01 128 字节块起始标志
STX 0x02 1024 字节块起始标志
EOT 0x04 文件传输结束
ACK 0x06 确认成功
NAK 0x15 校验失败/要求重传
CAN 0x18 取消传输(连续发 2+ 次)
'C' 0x43 请求 CRC-16 模式

五、错误处理机制

  1. 重传触发条件
    • 接收方回复 NAK(校验失败/包序号错误)
    • 发送方超时未收到 ACK/NAK(默认 3-10 秒)
  2. 终止条件
    • 连续重传失败(默认 10 次)→ 发送 CAN
    • 用户主动取消 → 发送 CAN

六、变种协议对比

类型 特点 适用场景
YMODEM 标准协议,支持批处理/CRC/1024B 块 通用串口传输
YMODEM-g 流式传输(无等待 ACK),出错即终止 无错信道(如纠错 Modem)
ZMODEM 滑动窗口/崩溃恢复/更高效率(YMODEM 后继者) 现代替代方案

七、与 XMODEM 关键区别

特性 XMODEM YMODEM
多文件传输 ❌ 仅单文件 ✅ 批处理
文件名/大小 ❌ 不支持 ✅ 文件信息包携带
数据块大小 128 Byte 128 Byte 或 1024 Byte
默认校验 Checksum CRC-16
传输效率 较低 提升 3-8 倍(大文件)

:实际应用需注意不同设备的实现差异(如文件大小字段是否必选)。附:常用工具

  • 发送端:sz (Linux), Tera Term
  • 接收端:rz (Linux), SecureCRT