详解 Ymodem 协议

Ymodem 协议概述

Ymodem 是 Xmodem 协议的扩展版本,由 Chuck Forsberg 在 1980 年代提出,主要用于文件传输。它在 Xmodem-1K 的基础上增加了批处理传输、文件名和文件大小支持,并采用 CRC-16 校验提升可靠性。Ymodem 协议分为两种变体:标准 Ymodem(基于 Xmodem-1K)和 Ymodem-g(无校验的流模式)。


Ymodem 帧结构

Ymodem 数据帧基于 Xmodem-1K 的 1024 字节块格式,但扩展了头部信息:

  1. 起始帧(SOH/STX):

    • 首帧为 SOH(128 字节头部)或 STX(1024 字节头部),后续帧通常为 STX。
    • 首帧包含文件名、文件大小(ASCII 格式)及空字节填充。
    • 示例:
      [SOH][00][FF][文件名][文件大小][填充][CRC-Hi][CRC-Lo]
      
  2. 数据帧

    • 帧号从 1 开始递增(模 256),次帧为 0xFF - 帧号。
    • 数据部分为 1024 字节,不足时用 0x1A(Ctrl-Z)填充。
  3. 结束帧(EOT):

    • 发送方发送 EOT(0x04)表示文件传输结束;接收方回复 ACK(0x06)确认。


传输流程

发送方流程

  1. 等待接收方发送 'C'(CRC 模式请求)。
  2. 发送起始帧(含文件名和大小)。
  3. 接收 ACK 后发送数据帧,每帧等待 ACK。
  4. 文件结束时发送 EOT,收到 ACK 后发送下一个文件或结束会话。

接收方流程

  1. 发送 'C' 启动 CRC 模式。
  2. 接收起始帧并解析文件名和大小,回复 ACK。
  3. 接收数据帧并校验,成功则回复 ACK,失败回复 NAK(0x15)重传。
  4. 收到 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,传输失败需完全重传。


典型应用场景

  1. 嵌入式系统固件升级:通过串口或 Bootloader 实现。
  2. 旧式调制解调器通信:支持批处理传输多个文件。

工具示例:

  • Linux 下使用 lrzsz 工具包中的 sz(发送)和 rz(接收)。
  • 终端工具(如 SecureCRT、Minicom)内置 Ymodem 支持。


注意事项

  • 超时处理:默认超时为 10 秒,超时后重传或终止。
  • 文件大小限制:原始协议不支持超过 2GB 的文件。
  • 兼容性:部分实现可能省略文件名传输或使用非标准扩展。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值