Ymodem协议
1.1 Ymodem帧格式
YMODEM有两种帧格式,主要区别是信息块长度不一样。
帧头 | 包序号 | 包序号 取反 | 信息块 | 校验 |
SOH/STX | PN | XPN | DATA | CRC |
1byte | 1byte | 1byte | 128/1024byte | 2byte |
1.1.1 Ymodem帧头
帧头表示两种数据帧长度,主要是信息块长度不同。
当帧头为SOH(0x01)时,信息块为128字节; 当帧头为STX(0x02)时,信息块为1024字节。
1.1.2 包序号
数据包序号只有1字节,因此计算范围是0~255;对于数据包大于255的,序号归零重复计算。
1.1.3 帧长度
以SOH(0x01)开始的数据包,信息块是128字节,该类型帧总长度为133字节;
以STX(0x02)开始的数据包,信息块是1024字节,该类型帧总长度为1029字节。
1.1.4 校验
YMODEM采用的是CRC16校验算法,校验值为2字节,传输时CRC高八位在前,低八位在后;
CRC计算数据为信息块数据,不包含帧头、包号、包号反码。
-
- Ymodem起始帧
YMODEM起始帧并不直接传输文件内容,而是先将文件名和文件大小置于数据帧中传输;起始帧是以SOH 133字节长度帧传输,格式如下。
帧头 | 包序号 | 包序号 取反 | 文件名称 | 文件大小 | 填充区 | 校验 |
SOH | 0x00 | 0xFF | filename+0x00 | filesize+0x00 | n字节0x00 | CRC16 |
其中包号为固定为0;
filename为文件名称,文件名称后必须加0x00作为结束;
filesize为文件大小值,文件大小值后必须加0x00作为结束;
余下未满128字节数据区域,则以0x00填充。 可以看出起始帧也是遵守1.1中Ymodem包格式的。
-
- Ymodem数据帧
Ymodem数据帧传输,在信息块填充有效数据。 传输有效数据时主要考虑的是最后一包数据的是处理,SOH帧和STR帧有不同的处理。
(1)对于SOH帧,若余下数据小于128字节,则以0x1A填充,该帧长度仍为133字节。
(2)对于STX帧需考虑几种情况:
1.余下数据等于1024字节,以1029长度帧发送;
2.余下数据小于1024字节,但大于128字节,以133字节帧长度发送,直至小于128个字节
3.余下数据小于128个字节,以133个字节发送,无效数据以0x1A补充
1.4 Ymodem结束帧
YMODEM的结束帧采用SOH 133字节长度帧传输,该帧不携带数据(空包),即数据区、校验都以0x00填充。
帧头 | 包序号 | 包序号 取反 | 信息块 | 校验 |
0x01 | 0x00 | 0xff | 128个0x00 | 0x00 0x00 |
1.5 Ymodem握手信号
握手信号由接收方发起,在发送方开始传输文件前,接收方需发送YMODEM_C
(字符C,ASII码为0x43)命令,发送方收到后,开始传输起始帧。
1.6 Ymodem命令
命令 | 命令码 | 说明 |
SOH | 0x01 | 128字节数据包 |
STX | 0x02 | 1024字节的数据包 |
EOT | 0x04 | 结束传输 |
ACK | 0x06 | 回应 |
NAK | 0x15 | 没回应,需要重传当前数据包 |
CA | 0x18 | 取消传输 |
C | 0x43 | 握手 |
1.7 Ymodem传输流程图
可以看出YMODEM只有起始帧、数据帧、结束帧的帧长度是133或者1029长度的,除此以外都是一个字节,这也提高了YMODEM的传输效率。
。