跳到主要内容

X、Y、ZMODEM协议

X、Y、ZMODEM协议今天可能比较少见了,在学习Bootloader的时候可能会遇到,最早1977年XMODEM协议被提出,后续陆续发展出了YMODEM协议和ZMODEM协议。

XMODEM协议

XMODEM协议是一种串口通信中广泛用到的异步文件传输协议,诞生于上世纪70年代末。它由工程师Ward Christensen在1977年开发,最初用于个人计算机通过调制解调器(Modem,即“猫”)进行文件交换。

XMODEM协议的核心工作模式是“接收方驱动”的停-等(Stop-and-Wait) 机制,可以理解为一种“一问一答”的对话,他是接收方主动发起的:

  1. 接收方主动发起:当接收方准备好接收文件时,它会先向发送方发送一个特定的启动字符,表明自己“已就位”。

  2. 发送方切块发送:发送方收到启动信号后,会把原始文件切割成一个个固定大小的“数据包(Packet)”,然后一次发送一个包。

  3. 接收方确认与反馈:接收方收到一个数据包后,会立即进行校验。如果校验无误,就回复一个“确认(ACK,Acknowledgment)”信号;如果发现数据在传输过程中出错,就回复一个“否认(NAK,Negative Acknowledgment)”信号。

  4. 发送方继续或重发:发送方收到“确认”后,才会继续发送下一个数据包;若收到“否认”,则会重新发送上一个出错的包。

图示:

发送方(Sender)                    接收方(Receiver)
| |
|<------- 'C' (请求CRC模式) -------|
| |
|---- 包1(SOH, 序号1, 数据, CRC) -->|
| | 校验包1正确
|<---------- ACK(0x06) ------------|
| |
|---- 包2(SOH, 序号2, 数据, CRC) -->|
| | 校验包2正确
|<---------- ACK(0x06) ------------|
| |
|---- 包3(SOH, 序号3, 数据, CRC) -->|
| | 校验包3正确
|<---------- ACK(0x06) ------------|
| |
|---------- EOT(0x04) ------------>| 发送方宣布结束
| | 接收方确认结束
|<---------- ACK(0x06) ------------|
| |

如果某个包出错(例如包2丢失或校验错误):

发送方(Sender)                    接收方(Receiver)
| |
|---- 包2(SOH, 序号2, 数据, CRC) -->|
| | 校验错误
|<---------- NAK(0x15) ------------| 请求重传
| |
|---- 包2(重传, 同上) ------------>|
| | 校验正确
|<---------- ACK(0x06) ------------|

其数据包结构:

+--------+----------+-------------+---------------------+--------+
| 帧头 | 包序号 | 序号反码 | 数据区 | 校验值 |
| (1字节)| (1字节) | (1字节) | (128字节) | (1或2字节)|
+--------+----------+-------------+---------------------+--------+

关键控制字符:

字符十六进制方向含义
SOH0x01发送→接收128字节数据包开始
STX0x02发送→接收1024字节数据包开始
EOT0x04发送→接收文件传输结束
ACK0x06接收→发送确认,请求下一个包
NAK0x15接收→发送否认,请求重传上一个包
CAN0x18双向取消传输(通常连续发送两次)
'C'0x43接收→发送请求使用CRC校验模式

虽然它实现了可靠传输,但相比于后续发展的TCP协议,这个协议确实是比较简陋的,效率不高。

信息

我们先对比一下XMODEM协议和TCP协议的区别:

特性XMODEMTCP
流水线不支持,一次只发一个包滑动窗口,可同时发送多个段
确认方式每个包独立确认累积确认,一个ACK可确认多个段
窗口自适应有(拥塞窗口、接收窗口)
头部开销3~5字节/包20字节/段,但可通过大段传输摊薄
带宽利用极低(高延迟下)高(管道填满)
适用场景低速、简单串口高速、复杂网络

XMODEM之所以效率不高,根源在于XMODEM中,发送方每发送一个包,都要等接收方确认才能继续发送("停-等"流水线模型),这是低效的。TCP则使用了滑动窗口机制,即发送方可以发送多个包,而接收方只需要确认一个包即可,发送方的效率就提高了。(这也能让我们理解为什么TCP高效)

信道利用率 ≈ (数据包发送时间) / (数据包发送时间 + 2×信号往返延迟 + 处理延迟), 当往返延迟(RTT)接近或超过发送一个包的时间时,利用率会跌破50%,甚至更低。

XMODEM使用固定的重传计时器(通常3~10秒),不会根据网络状况动态调整。而TCP拥有慢启动、拥塞避免、快速重传等机制,能充分利用带宽。

算校验和也是,虽然累加和或CRC-16计算本身很快,但每次都要在接收方完成后才能回复ACK,无法边收边处理。

XMODEM协议本质上是一个“一问一答”的对话模型,没有将确认信息与反向数据合并(如TCP的延迟确认),进一步增加了交互次数。

典型握手启动(CRC模式)

接收方启动时不会直接发送NAK(因为NAK会触发累加和模式),而是每隔一段时间发送一次 'C' 字符,直到收到发送方的第一个数据包或超时退出。

时间轴
接收方: 'C' 'C' 'C' ... (每3秒)
|
发送方: 等待第一个'C'后,立即发送包1

YMODEM协议

本文字数:0

预计阅读时间:0 分钟


统计信息加载中...

有问题?请向我提出issue