KERMIT,XMODEM,YMODEM,ZMODEM传输协议小结[转]
(2012-11-29 17:52:16)
标签:
kermitxmodemymodemzmodem |
分类: 其他 |
Kermit协议
报文格式:
1.MARK,起始标记START_CHAR,为 0x01(CTRIL-A);
2.LEN,报文剩余部分的长度,取值范围0~94,报文最大长度96,长度不包含换行符或者制表符;
3.SEQ,数据包编号,取模64,;
4.TYPE,k_state数据包类型
D |
数据报文 |
Y |
ACK报文(不能转换编码) |
N |
NAK,未收到 |
S |
发送初始化报文 |
B |
传输结束 |
F |
文件头部 |
Z |
文件结束 |
E |
Error |
Q,T |
保留 |
5.DATA,0~31,127这33个控制字符需要进行转换,前面加’#’,0~31之间加上64,127减去64处理。加过前缀的序列不要分散在不同的包。前缀字符也包含在计数之内。除S,I,A报文及其响应,都不能进行编码。
6.CHECK,假如S是整个报文字符的算术和,只是校验0~5位的和。
这是基本的默认块校验,所有的kermit都必须可以实施。
kermit报文发送过程
1.发送方首先发送一个初始化报文S(以0x01起始),确定报文长度,超时时间等;-->
<--接收方返回一个确认报文Y,在报文数据段存放自己的参数
2.发送方发送文件头报文F,在数据段包含文件名-->(如果发送多个文件,重复此步骤即可)
<--返回ACK,数据段可以不包含数据
3.开始发送文件内容,数据报文D,不在可打印ascii码范围内的,需要被提前替换成等价的可打印字符,每个数据报文都会收到ACK。
4.文件数据发送结束后,发送方发送文件尾报文Z,收方接收后确认。
5.没有文件需要发送时,发送传输结束报文B,并接收ACK,然后关闭连接,物理连接依然保留
每个报文都有编号,0~63之间。
XMODEM
简单通用,传输信息单位是“包=128B”,传输速度慢,适合电话线路质量差的情况下使用。
Xmodem是最广泛使用的文件传输协议之一。原始的Xmodem协议使用128字节的数据包和一个简单的“校验和”的错误检测方法。随后的版本XMODEM-CRC,使用了更安全的循环冗余校验(CRC)错误检测方法。
Xmodem协议始终首先尝试使用CRC。如果发送者不响应CRC的请求,接收器转移到校验和模式,并继续其请求传输。
1.Xmodem协议是什么?
XMODEM协议是一种串口通信中 广泛用到的异步文件传输协议。分为标准Xmodem和1k-Xmodem两种,前者以128字节块的形式传输数据,后者字节块为1k即1024字节,并且每个块都使用一个校验和过程来进行错误检测。在校验过程中如果接收方关于一个块的校验和与它在发送方的校验和相同时,接收方就向发送方发送一个确认字节
(ACK)。由于Xmodem需要对每个块都进行认可,这将导致性能有所下降,特别是延时比较长的场合,这种协议显得效率更低。
2.Xmodem协议相关控制字符
3
2-1
SOH |
信息包序号 |
信息包序号的补码 |
数据区段 |
校验和 |
4.1k-Xmodem(每个数据包含有1024字节数据)帧格式
2-2
STX |
信息包序号 |
信息包序号的补码 |
数据区段 |
校验和 |
5.数据包说明
6.如何启动传输?
7.传输过程
发送方发了第一包后就等待接收方的确认字节ACK,收到接收方传来的ACK确认,就认为数据包被接收方正确接收,并且接收方要求发送方继续发送下一个包;
如果发送方收到接收方传来的NAK(这里,NAK用来告诉发送方重传,不是用来启动传输)字节,则表示接收方请求重发刚才的数据包;如果发送方收到接收方传来的CAN字节,则表示接收方请求无条件停止传输。
8.如何结束传输?
9.特殊处理
接收方首先应确认数据包序号的完整性,通过对数据包序号取补,然后和数据包序号的补码异或,结果为0表示正确,结果不为0则发送NAK请求重传。
10.校验和的说明
YMODEM
由XMODEM演变来,效率可靠性高,包=128*8B;一次传输可发送或接受几个文件。
XMODEM1K本质上是XMODEM CRC1K(1024字节)的数据包。在某些系统中,它也可以被称为YMODEM。有些通信软件程序,著名的Procomm的1.x版本中,也将XMODEM-1K 称为YMODEM,但在Procomm的2.0版本中不再称XMODEM-1K为 YMODEM。
YMODEM -G:YMODEM-G是一种YMODEM的变种。它被设计成用于支持错误控制的调制解调器。该协议不提供软件纠错或恢复,但预计调制解调器提供的服务。这是一个流媒体协议,在一个连续的数据流上发送和接收1K的数据包,直显式停止。每块被发送后,它不会等待肯定的确认,而是快速连续地发送块。如果任何块传输失败,本次传输将会失败退出。
文件传输过程的开启:
(1)开启是由接收方开启传输,它发一个大写字母C开启传输。然后进入等待(SOH)状态,如果没有回应,就会超时退出。
(2)发送方开始时处于等待过程中,等待C。收到C以后,发送(SOH)数据包开始信号,发送序号(00),补码(FF),“文件名”,“空格”“文件大小”“除去序号外,补满128字节”,CRC校验两个字节。进入等待(ACK)状态。
(3)接收方收到以后,CRC校验满足,则发送ACK。发送方接收到ACK,又进入等待“文件传输开启”信号,即重新进入等待“C”的状态。
(4)前面接收方只是收到了一个文件名,限制正式开启文件传输,Ymodem支持128字节和1024字节一个数据包。128字节以(SOH)开始,1024字节以(STX)开始。
接收方又发出一个“C”信号,开始准备接收文件。进入等待“SOH”或者“STX”状态。
(5)发送接收到“C”以后,发送数据包,(SOH)(01序号)(FE补码)(128位数据)(CRC校验),等待接收方“ACK”。
(6)文件发送完以后,发送方发出一个“EOT”信号,接收方也以“ACK”回应。
然后接收方会再次发出“C”开启另一次传输,若接着发送方会发出一个“全0数据包”,接收方“ACK”以后,本次通信正式结束。
(7)当然YMODEM相对于XMODEM改进的地方就在于传输再次开启以后,又可以发送另外一个文件,即一次传输允许发送多个文件。
所用到的符号
#define MODEM_SOH 0x01 //数据块起始字符
#define MODEM_STX 0x02 //1028字节开始
#define MODEM_EOT 0x04 //文件传输结束
#define MODEM_ACK 0x06 //确认应答
#define MODEM_NAK 0x15 //出现错误
#define MODEM_CAN 0x18 //取消传输
#define MODEM_C
0x43
CRC计算方法
in_ptr = mblock->buf; //指向要计算CRC的缓冲区开头
cksum = 0; //
for (stat=mblock->len ; stat>0; stat--) //len是所要计算的长度
{
cksum = cksum^(int)(*in_ptr++) << 8; //
for (i=8; i!=0; i--)
{
if (cksum & 0x8000)
cksum = cksum << 1 ^ 0x1021;
else
cksum = cksum << 1;
}
}
ZMODEM
与上两种不同,可以连续的数据流发送数据,效率更高
在具体的环境中,通过多次采用的xmodem的传输可以发现,不管是直接传输,还是按照网上 的说法采用rz sz传输,都很难将文件正确传输到嵌入式设备上。当采用zmodem进行传输的时候却发现传输的效率很高,几乎没有失败。
Zmodem协议有两个显着的特点:它是非常有效的,它提供了类似于YMODEM-G的崩溃恢复机制,Zmodem协议不会等待肯定的确认后,每个块被发送,而是快速连续地发送块。 Zmodem协议传输如果因任何原因被取消或中断,恢复后,先前传送的信息都需要重新发送。
原文:小猫吃柿子的博客——KERMIT,XMODEM,YMODEM,ZMODEM传输协议小结