一、基础定义
- 定位
- 点对点文件传输协议,基于 XMODEM 改进(Chuck Forsberg, 1980s)。
- 应用场景:串口通信(RS-232)、嵌入式固件更新、早期 BBS 系统。
- 核心改进
- ✅ 批处理传输(多文件)
- ✅ 支持文件名 + 文件大小(信息包头部)
- ✅ 数据块扩容至 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 模式 |
五、错误处理机制
- 重传触发条件
- 接收方回复
NAK
(校验失败/包序号错误)
- 发送方超时未收到
ACK/NAK
(默认 3-10 秒)
- 终止条件
- 连续重传失败(默认 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