返回> 网站首页
[转载]研究Xmodem协议必看的11个问题
yoours2012-12-28 11:25:10
简介一边听听音乐,一边写写文章。
XMODEM协议是一种使用拨号调制解调器的个人计算机通信中广泛使用的异步文件运输协议。这种协议以128字节块的形式传输数据,并且每个块都使用一个校验和过程来进行错误检测。
如果接收方关于一个块的校验和与它在发送方的校验和相同时,接收方就向发送方发送一个认可字节。然而,这种对每个块都进行认可的策略将导致低性能,特别是具有很长传播延迟的卫星连接的情况时,问题更加严重。
使用循环冗余校验的与XMODEM相应的一种协议称为XMODEM-CRC。还有一种是XMODEM-1K,它以1024字节一块来传输数据。 ZMODEM是最有效的一个XMODEM版本,它不需要对每个块都进行认可。事实上,它只是简单地要求对损坏的块进行重发。ZMODEM对按块收费的分组交换网络是非常有用的。不需要认可回送分组在很大程度上减少了通信量。
YMODEM也是一种XMODEM的实现。它包括XMODEM-1K的所有特征,另外在一次单一会话期间为发送一组文件,增加了批处理文件传输模式。
1.Xmodem协议是什么?
XMODEM协议是一种串口通信中广泛用到的异步文件传输协议。分为标准Xmodem和1k-Xmodem两种,前者以128字节块的形式传输数据,后者字节块为1k即1024字节,并且每个块都使用一个校验和过程来进行错误检测。在校验过程中如果接收方关于一个块的校验和与它在发送方的校验和相同时,接收方就向发送方发送一个确认字节(ACK)。由于Xmodem需要对每个块都进行认可,这将导致性能有所下降,特别是延时比较长的场合,这种协议显得效率更低。
除了Xmodem,还有Ymodem,Zmodem协议。他们的协议内容和Xmodem类似,不同的是Ymodem允许批处理文件传输,效率更高;Zmodem则是改进的了Xmodem,它只需要对损坏的块进行重发,其它正确的块不需要发送确认字节。减少了通信量。
2.Xmodem协议相关控制字符
SOH 0x01
STX 0x02
EOT 0x04
ACK 0x06
NAK 0x15
CAN 0x18
CTRLZ 0x1A
3.标准Xmodem协议(每个数据包含有128字节数据)帧格式
________________________________________________
| | | | | |
| SOH | 信息包序号 | 信息包序号的补码 | 数据区段 | 校验和|
|_____|___________|_________________|________|______|
说明:
SOH 帧的开头字节,代表信息包中的第一个字节
信息包序号: 对 256 取模所得到当前包号,第一个信息包的序号为 1
而信息包序号范围 0~255
信息包序号的反码: 当前信息包号的反码
数据区段: 数据区段的长度固定为 128 字节,其内容没有任何限制,可以是
文本数据或二进制数据
算术校验和: 1字节的算术校验和,只对数据区段计算后对 256 取模而得
4.1k-Xmodem(每个数据包含有1024字节数据)帧格式
________________________________________________
| | | | | |
| STX | 信息包序号 | 信息包序号的补码 | 数据区段 | 校验和|
|____|___________|_________________|________|_______|
5.数据包说明
对于标准Xmodem协议来说,如果传送的文件不是128的整数倍,那么最后一个数据包的有效内容肯定小于帧长,不足的部分需要用CTRL-Z(0x1A)来填充。这里可能有人会问,如果我传送的是bootloader工程生成的.bin文件,mcu收到后遇到0x1A字符会怎么处理?其实如果传送的是文本文件,那么接收方对于接收的内容是很容易识别的,因为CTRL-Z不是前128个ascii码,不是通用可见字符,如果是二进制文件,mcu其实也不会把它当作代码来执行。哪怕是excel文件等,由于其内部会有些结构表示各个字段长度等,所以不会读取多余的填充字符。否则Xmodem太弱了。对于1k-Xmodem,同上理。
6.如何启动传输?
传输由接收方启动,方法是向发送方发送"C"或者NAK(注意哦,这里提到的NAK是用来启动传输的。以下我们会看到NAK还可以用来对数据产生重传的机制)。接收方发送NAK信号表示接收方打算用累加和校验;发送字符"C"则表示接收方想打算使用CRC校验(具体校验规则下文Xmodem源码,源码胜于雄辩)。
7.传输过程
当接收方发送的第一个"C"或者NAK到达发送方,发送方认为可以发送第一个数据包,传输已经启动。发送方接着应该将数据以每次128字节的数据加上包头,包号,包号补码,末尾加上校验和,打包成帧格式传送。
发送方发了第一包后就等待接收方的确认字节ACK,收到接收方传来的ACK确认,就认为数据包被接收方正确接收,并且接收方要求发送方继续发送下一个包;如果发送方收到接收方传来的NAK(这里,NAK用来告诉发送方重传,不是用来启动传输)字节,则表示接收方请求重发刚才的数据包;如果发送方收到接收方传来的CAN字节,则表示接收方请求无条件停止传输。
8.如何结束传输?
如果发送方正常传输完全部数据,需要结束传输,正常结束需要发送方发送EOT 字节通知接收方。接收方回以ACK进行确认。当然接收方也可强制停止传输,当接收方发送CAN 字节给发送方,表示接收方想无条件停止传输,发送方收到CAN后,不需要再发送 EOT确认(因为接收方已经不想理它了,呵呵)。
9.特殊处理
虽然数据包是以 SOH 来标志一个信息包的起始的,但在 SOH 位置上如果出现EOT则表示数据传输结束,再也没有数据传过来。
接收方首先应确认数据包序号的完整性,通过对数据包序号取补,然后和数据包序号的补码异或,结果为0表示正确,结果不为0则发送NAK请求重传。
接收方确认数据包序号正确后,然后检查是否期望的序号。如果不是期望得到的数据包序号,说明发生严重错误,应该发送一个 CAN 来中止传输。
如果接收到的数据包的包序号和前一包相同,那么接收方会忽略这个重复包,向发送方发出 ACK ,准备接收下一个包。
接收方确认了信息包序号的完整性和是正确期望的后,只对 128 字节的数据区段进行算术和校验,结果与帧中最后一个字节(算术校验和)比较,相同发送 ACK,不同发送 NAK。
10.校验和的说明
Xmodem协议支持2种校验和,它们是累加和与CRC校验。
当接收方一开始启动传输时发送的是NAK,表示它希望以累加和方式校验。
当接收方一开始启动传输时发送的是字符“C”,表示它希望以CRC方式校验。
可能有人会问,接收方想怎么校验发送方都得配合吗,难道发送方必须都支持累加和校验和CRC校验?事实上Xmodem要求支持CRC的就必须同时支持累加和,如果发送方只支持累加和,而接收方用字符“C”来启动,那么发送方只要不管它,当接收方继续发送“C”,三次后都没收到应答,就自动会改为发送NAK,因为它已经明白发送方可能不支持CRC校验,现在接收方改为累加和校验和发送方通讯。发送方收到NAK就赶紧发送数据包响应。
11. 传输逻辑
1> 收发双方拨号连通后,发送方等待接收方传来 NAK 信号。当第一个 NAK 到达,
发送方解释为 开始发送第一个包
2> 发送方一旦收到第一个 NAK ,启动了传输,发送方就将数据以每次 128 字节
打包成帧格式传送,再等待接收方的确认信号
3> 发送方收到接收方传来的 ACK 信号,解释为信息包被正确接收,并有发送下一
个包的含义
4> 发送方收到接收方传来的 NAK 信号,解释为请求重发同一数据包
5> 发送方收到接收方传来的 CAN 信号,解释为请求无条件停止传输过程
6> 发送方正常传输完全部数据,需要正常结束,发送 EOT 信号通知接收方。接收
方用 ACK 进行确认
7> 接收方发送 CAN 无条件停止传输过程,发送方收到 CAN 后,不发送 EOT 确认
8> 虽然信息包是以 SOH 来标志一个信息包的起始的,但在 SOH 位置上出现的 EOT
则表示数据传输结束,再也没有数据传过来
9> 接收方首先应确认信息包序号的完整性,通过对信息包序号取补,然后和信息包
序号的补码异或,结果为 0 表示正确,结果不为 0 则发送 NAK 请求重传
10> 接收方确认信息包序号正确后,然后检查是否期望的序号。如果不是期望得到的
信息包序号,说明发生严重错误,应该发送一个 CAN 来中止传输
11> 对于10>情况的唯一例外,是收到的包的信息包序号与前一个信息包序号相同,
此种情况,接收方简单忽略这个重复的包,向发送方发出 ACK ,准备接收下一个包
12> 接收方确认了信息包序号的完整性和是正确期望的后,只对 512 字节的数据区段
进行算术和校验,结果与帧中最后一个字节(算术校验和)比较,相同 发送 ACK,
不同发送 NAK
12. 超时处理
1> 接收方等待一个信息包的到来所具有的超时时限为 10 秒,每个超时后发送 NAK
2> 当收到包时,接收过程中每个字符的超时间隔为 1 秒
3> 为保持“接收方驱动”,发送方在等待一个启动字节时不应该采用超时处理
4> 一旦传输开始,发送方采用单独的 1 分钟超时时限,给接收方充足的时间做发送
ACK ,NAK ,CAN 之前的必须处理
5> 所有的超时及错误事件至少重试 10 次
13. 控制字符
控制字符符合 ASICII 标准定义,长度均为 1 字节
SOH 0x01
EOT 0x04
ACK 0x06
NAK 0x15
CAN 0x18
这是 Xmodem 协议的最基本的一个版本,在其上还有 Xmode-1K 这样的扩展,加大了传输封包的大小(1K),用来提高传输速率;增加了 CRC 校验,用来提高传输的可靠性;区别在于:当启用 Xmodem 时,接收方发送 C 字符。发送方收到 C 字符判定为采用 Xmodem-1K 扩展;否则,当超时后,按照基本的版本传输。
扩展大致如此,有这个基础的版本就足够了
文章评论
1369人参与,0条评论