YMODEM 协议是一种高效的文件传输协议,通常用于调制解调器之间的数据传输。YMODEM 协议的产生是为了解决 XMODEM 协议存在的一些问题。相较于 XMODEM,YMODEM 协议在数据传输效率和稳定性上有所改进。
YMODEM 协议的主要特点包括:
- 数据包大小:YMODEM 协议支持以 1024 字节(或 1K)的块进行数据传输,这比 XMODEM 协议通常使用的 128 字节块要大得多,从而提高了传输效率。
- 错误纠正:YMODEM 协议采用循环冗余校验(CRC16)进行错误检测,并在发现错误时请求重发数据块,以确保数据的正确传输。
- 批处理模式:YMODEM 协议支持批处理模式,允许使用单个命令传输多个文件,这在传输大量文件时非常有用。
- 文件名传输:在发送文件数据之前,YMODEM 协议会先发送文件名和文件大小等信息,以便接收方能够正确地保存文件。
YMODEM 协议中定义了几种关键字:
关键字 |
值 |
说明 |
SOH |
0x01 |
协议头(128 bytes 类型) |
STX |
0x02 |
协议头(1K 类型) |
EOT |
0x04 |
传输结束 |
ACK |
0x06 |
接收响应 |
NAK |
0x15 |
失败响应 |
CAN |
0x18 |
取消传输 |
C |
0x43 |
开启文件传输 |
CPMEOF |
0x1A |
数据补齐填充字符(^Z,控制字符 Z) |
YMODEM 传输协议:
SOH [index] [index2] [128 bytes data] [CRC-hi] [CRC-lo]
STX [index] [index2] [1024 bytes data] [CRC-hi] [CRC-lo]
index 是帧序号,0 ~ 255,传输时递增。
index2 是index取反,也即:index2 = ~index = 255 - index
crc16 校验数据域 [data]
在 YMODEM 协议的基本流程中,发送方会先发送一个起始帧,其中包含文件名和文件大小等信息。接收方在收到起始帧后,会发送一个确认信号(ACK)。然后,发送方开始以 1024 字节的块发送文件数据,每发送一个数据块后都会等待接收方的 ACK 信号。如果接收方成功接收到数据块并通过 CRC 校验,则发送 ACK 信号;否则,发送否定确认信号(NAK)请求重发。当文件传输完成后,发送方会发送一个结束帧(EOT),接收方在收到结束帧后会再次发送 ACK 信号进行确认。
交互序列图:
传输时先发送一个 128 字节的文件信息块,将文件名和文件大小发送给设备。
SOH 00 FF [filename] [filesize] [NULL] CRCH CRCL
[filename] 文件名,如文件名 foo.c,它在数据帧中存放格式为:66 6F 6F 2E 63 00
[filesize] 文件大小,例如大小为 400 bytes,它在数据帧的存放格式为:34 30 30 00,即 “400”。(不同的软件可能有所却别)
[NULL] 表示剩下的字节都用 00 填充
传输文件内容时,如果文件数据的最后剩余的数据在 128 ~ 1024 之间,则还是使用 STX 的 1024 字节传输;如果文件大小小于等于 128 字节,则选择 SOH 数据帧用 128 字节来传输数据。若数据不足一帧,用 CPMEOF 来填充。
协议文本原件《X/YMODEM Protocol Reference June 18 1988》:
|