Ymodem协议详解

Ymodem协议是一种基于Xmodem改进的串行通信文件传输协议,诞生于1980年代,由Ward Christiansen或Chuck Forsberg开发(不同资料记载有差异)。它通过优化数据块大小、引入批处理和强校验机制,显著提升了传输效率和可靠性,广泛应用于嵌入式系统固件升级、工业设备配置等场景。

​​一、协议核心特点​​

​​高效传输​​

支持​​1024字节/块​​的数据包(Xmodem仅128字节),减少协议开销,提升吞吐量。

批处理模式可​​连续传输多个文件​​,无需重复握手。

​​强错误检测​​

采用​​16位CRC校验​​(Xmodem为8位校验和),可检测多位错误(如突发错误)。

接收方通过校验数据包序号与补码关系(如01H与FEH互为补码)验证数据完整性。

public class Crc16Ccitt

{

    const ushort poly = 0x1021;

    ushort[] table = new ushort[256];

    ushort initialValue = 0;



    public ushort ComputeChecksum(byte[] bytes)

    {

        ushort crc = this.initialValue;

        for (int i = 0; i < bytes.Length; ++i)

        {

            crc = (ushort)((crc << 8) ^ table[((crc >> 8) ^ (0xff & bytes[i]))]);

        }

        return crc;

    }



    public byte[] ComputeChecksumBytes(byte[] bytes)

    {

        ushort crc = ComputeChecksum(bytes);

        return new byte[] { (byte)(crc >> 8), (byte)(crc & 0x00ff) };

    }



    public Crc16Ccitt(InitialCrcValue initialValue)

    {

        this.initialValue = (ushort)initialValue;

        ushort temp, a;

        for (int i = 0; i < table.Length; ++i)

        {

            temp = 0;

            a = (ushort)(i << 8);

            for (int j = 0; j < 8; ++j)

            {

                if (((temp ^ a) & 0x8000) != 0)

                {

                    temp = (ushort)((temp << 1) ^ poly);

                }

                else

                {

                    temp <<= 1;

                }

                a <<= 1;

            }

            table[i] = temp;

        }

    }

}

​​流控制机制​​

​​ACK/NAK响应机制​​:接收方校验成功后回复ACK(0x06),失败则回复NAK(0x15)触发重传。

超时重传:发送方未收到响应时自动重发数据包。

​​元数据支持​​

起始帧包含​​文件名、文件大小​​(补零至128字节),便于接收方预分配资源。

二、协议通信流程​​

Ymodem传输分为三个阶段,以​​接收方主动发起​​为特点:

​​初始化阶段​​

接收方发送字符'C'(ASCII 0x43)开启传输。

发送方回复​​起始帧​​:

| SOH(0x01) | 00H | FFH | 文件名+文件大小+补零 | 16位CRC校验码 | 

接收方校验后回复ACK,并再次发送'C'进入数据传输。

​​数据传输阶段​​

数据包结构:

| 包头(STX/SOH) | 序号 | 序号补码 | 数据(128/1024B) | CRC校验码 | 

STX(0x02)标识1024字节包,SOH(0x01)标识128字节包(仅用于末尾不足1024B时)。

序号从01H开始递增,补码为FEH、FDH等。

接收方校验序号、补码和CRC,成功则回复ACK,失败则NAK请求重发。

​​结束阶段​​

发送方发送EOT(0x04)结束传输,接收方首次回复NAK二次确认,二次回复ACK。

若无后续文件,发送方发送​​全零结束帧​​:

| SOH | 00H | FFH | 128字节0x00 | CRC校验码 | 

接收方回复ACK后终止会话。

三、关键技术实现​​

​​数据包结构详解​​

帧头:用于表示数据帧的长度,主要是信息块长度不同。

包序号:数据包序号只有1字节,范围是0~255;对于数据包大于255的,序号归零重复计算。

帧长度:以SOH (0x01)开始的数据包,信息块是128字节,总长度为133字节;以STX (0x02)开始的数据包,信息块是1024字节,总长度为1029字节。

校验:Ymodem采用CRC16校验算法,校验值为2字节,传输时CRC高八位在前,低八位在后。

字段长度说明
​Start Header​1字节SOH(128B)或STX(1024B)标识包类型
​Packet Number​1字节数据包序号(从00H起始帧开始,01H为第一包数据)
​Complement​1字节序号的按位取反(如01H对应FEH
​Data​可变文件名(起始帧)或文件数据(数据帧),不足时补0x1A0x00
​CRC-16​2字节校验范围:包头后所有数据(不含包头)

​​错误恢复策略​​

连续收到NAK或超时:重发数据包,超过阈值则终止传输。

序号不连续:接收方发送NAK要求重传缺失包。

四、与其他协议对比​​

特性

Xmodem

Ymodem

Zmodem

数据块大小

128字节

128B/1024B

滑动窗口(动态)

校验方式

8位校验和

16位CRC

32位CRC

批处理

不支持

支持

支持

断点续传

不支持

不支持

支持

适用场景

小文件低速环境

中等文件、可靠性要求

大文件高速环境

总结​​

Ymodem协议凭借其​​1024字节块+批处理+强CRC校验​​的组合,在串行通信时代实现了效率与可靠性的平衡。尽管逐渐被Zmodem和现代协议取代,其在嵌入式领域仍不可替代。开发时需注意其​​无加密、流控简单​​的局限,并合理选择数据块大小以优化传输性能。

内容概要:本文档详细介绍了YMODEM文件传输协议,涵盖了其历史背景、协议定义、最低要求、设计初衷以及与XMODEM协议的区别和改进。YMODEM协议基于XMODEM/CRC协议,增加了批量传输功能,支持文件名、长度、修改日期等元数据的传输,优化了文件传输的可靠性和效率。文档还探讨了YMODEM-g协议,该协议在高延迟纠错环境中提供了更高的吞吐量。此外,文中详细描述了协议的具体实现细节,包括块结构、校验机制(如CRC-16)、错误恢复机制以及编程技巧。 适合人群:具备一定编程基础,特别是对文件传输协议有一定了解的开发人员和技术爱好者。 使用场景及目标:①理解YMODEM协议的工作原理及其相对于XMODEM的改进;②掌握YMODEM协议的具体实现,包括块结构、校验和计算、错误恢复等;③学习如何在不同操作系统和环境下实现YMODEM协议,特别是在高延迟纠错环境中使用YMODEM-g协议。 其他说明:本文档不仅提供了详细的协议描述,还附带了实际应用中的编程技巧和示例代码,有助于开发者更好地理解和实现YMODEM协议。此外,文档还提供了相关资源的获取途径,如TeleGodzilla公告板和Unix UUCP访问方法,方便进一步研究和测试。 英文原版上传不了,有需要的可以去这个地址自己下载 https://gitee.com/miuser00/ymodemwin/blob/master/XMODEM-YMODEM-Protocol-Refrence_881014.pdf
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值