xmodem 协议

来源:互联网 发布:windows调整字体大小 编辑:程序博客网 时间:2024/05/16 06:45
一.超级终端1K Xmodem文件传输协议


超级终端的1K Xmodem文件传输协议为基于点对点连接的服务与客户端间的通信,提供了一种固定包长度的简单的连续文件传输协议。每一个包都包含1024字节的文件数据,并且都单独的被接收客户端响应。每次只能传输一个文件,并且失败后只能从新开始传输。


超级终端的1K Xmodem 文件传输协议是超级终端Xmodem CRC文件传输协议的扩展,包大小由Xmodem中的128字节增加到1024字节。该协议通过开始字符(包头)STX<0x02>来标识1K Xmodem包的开始。


二.1K Xmodem协议传输流程


超级终端1K Xmodem文件传输协议并不需要向接收客户端发送待发送文件的名称 ,该文件将会被接收方授予一个局部有效的文件名。


要开始文件传输的过程,首先接收方向发送方发送一个轮询字符,来提示发送方客户端已经准备好了。如果接收方支持check-sum (CRC)校验,则轮询字符可以用0x43 (ASCII 字母 C);如果接收方只支持旧的checksum (求总和)校验,则轮询字符可以用0x15 (NACK线控制字符)。


发送方响应接收方的启动字符,开始发送文件数据包,每个包都是1024字节的固定长度。如果最后一个文件数据包不足1024字节,则利用NACK(0x1A)填充到1024字节。接收方通过ACK(正常接收)或者NACK(非正接收)来响应每一个包。


如果发送方收到ACK,则发送下一个包知道文件传输完成;乳沟发送方收到NACK,则重新发送上一个包。


当发送方发送完成后,发送EOT通知接收方文件传输结束;接收方发送ACK来响应;发送方收到ACK后则文件传输完成。


文件数据包的结构:


<STX><包序号><包序号反码><文件数据(1024字节)><校验位>


文件传输流程:


三.控制字符


字符(16进制)


含义


0x02


STX: 包头


0x04


EOT: 结束文件传输


0x06


ACK: 正常响应,如:数据包正确接收


0x15


NACK: 非正常响应


0x18


CAN: 取消文件传输


0x43


C: ASCII字符C


二、XModem校验和协议

1. XModem信息包格式
XModem协议最早由Ward Christensen在20世纪70年代提出并实现的,传输数据单位为信息包,信息包格式如下:

---------------------------------------------------------------------------|     Byte1     |    Byte2    |     Byte3      |Byte4~Byte131|  Byte132   ||-------------------------------------------------------------------------||Start Of Header|Packet Number|~(Packet Number)| Packet Data |  Check Sum |---------------------------------------------------------------------------


2. 校验和的计算
所有的数据字节都将参与和运算,由于校验和只占一个字节,如果累加的和超过255将从零开始继续累加。


3. 字段定义
<SOH> 01H
<EOT> 04H
<ACK> 06H
<NAK> 15H
<CAN> 18H

4. 校验和方式的XModem传输流程
传输流程如图所示:

------------------------------------------------------------------------------|               SENDER                |          |          RECIEVER         ||                                     |  <---    |  NAK                      ||                                     |          |  Time out after 3 second  ||                                     |  <---    |  NAK                      || SOH|0x01|0xFE|Data[0~127]|CheckSum| |  --->    |                           ||                                     |  <---    |  ACK                      || SOH|0x02|0xFD|Data[0~127]|CheckSum| |  --->    |                           ||                                     |  <---    |  NAK                      || SOH|0x02|0xFD|Data[0~127]|CheckSum| |  --->    |                           ||                                     |  <---    |  ACK                      || SOH|0x03|0xFC|Data[0~127]|CheckSum| |  --->    |                           ||                                     |  <---    |  ACK                      || .                                   |          |  .                        || .                                   |          |  .                        || .                                   |          |  .                        ||                                     |  <---    |  ACK                      || EOT                                 |  --->    |                           ||                                     |  <---    |  ACK                      |------------------------------------------------------------------------------

对于发送方仅仅支持校验和的传输方式,接收方应首先发送NAK信号来发起传输,如果发送方没有数据发送过来,需要超时等待3秒之后再发起NAK信号来进行数据传输。对于数据传输正确,接收方需要发送ACK信号来进行确认,如果数据传输有误,则发送NAK信号,发送方在接收到NAK信号之后需要重新发起该次数据传输,如果数据已近传输完成,发送方需要发送EOT信号,来结束数据传输。

5. 如何取消数据传输
当接收方发送CAN表示无条件结束本次传输过程,发送方收到CAN后,无需发送EOT来确认,直接停止数据的发送。


二、XModem-CRC16协议

1. XModem-CRC16信息包格式
XModem协议在90年代做过一次修改,将132字节处的校验和改成双字节的CRC16校验,CRC16校验的信息包格式如下:

------------------------------------------------------------------------------|     Byte1     |    Byte2    |     Byte3      |Byte4~Byte131|Byte132~Byte133||----------------------------------------------------------------------------||Start Of Header|Packet Number|~(Packet Number)| Packet Data |   16Bit CRC   |------------------------------------------------------------------------------


2. CRC16的计算

[cpp] view plain copy
  1. int calcrc(char *ptr, int count)  
  2. {  
  3.     int crc;  
  4.     char i;  
  5.   
  6.     crc = 0;  
  7.     while (--count >= 0)  
  8.     {  
  9.         crc = crc ^ (int) *ptr++ << 8;  
  10.         i = 8;  
  11.         do  
  12.         {  
  13.             if (crc & 0x8000)  
  14.                 crc = crc << 1 ^ 0x1021;  
  15.             else  
  16.                 crc = crc << 1;  
  17.         } while (--i);  
  18.     }  
  19.   
  20.     return (crc);  
  21. }  

需要注意的是,在发送方,CRC是高字节在前,低字节在后。


3. CRC16校验的XModem传输流程
传输流程如图所示:
---------------------------------------------------------------------------|               SENDER             |          |           RECIEVER        ||                                  |  <---    |  'C'                      ||                                  |          |  Time out after 3 second  ||                                  |  <---    |  'C'                      || SOH|0x01|0xFE|Data[0~127]|CRC16| |  --->    |                           ||                                  |  <---    |  ACK                      || SOH|0x02|0xFD|Data[0~127]|CRC16| |  --->    |                           ||                                  |  <---    |  NAK                      || SOH|0x02|0xFD|Data[0~127]|CRC16| |  --->    |                           ||                                  |  <---    |  ACK                      || SOH|0x03|0xFC|Data[0~127]|CRC16| |  --->    |                           ||                                  |  <---    |  ACK                      || .                                |          |  .                        || .                                |          |  .                        || .                                |          |  .                        ||                                  |  <---    |  ACK                      || EOT                              |  --->    |                           ||                                  |  <---    |  ACK                      |---------------------------------------------------------------------------

和校验和方式不同的是,当接收方要求发送方以CRC16校验方式发送数据时以'C'来请求,发送方对此做出应答,流程就如上图所示。当发送方仅仅支持校验和方式时,则接收方要发送NAK来请求,要求以校验和方式来发送数据,如果仅仅支持CRC16校验方式,则只能发送'C'来请求。如果两者都支持的话,优先发送'C'来请求,流程如图所示:

------------------------------------------------------------------------------|               SENDER                |          |           RECIEVER        ||                                     |  <---    |  'C'                      ||                                     |          |  Time out after 3 second  ||                                     |  <---    |  NAK                      ||                                     |          |  Time out after 3 second  ||                                     |  <---    |  'C'                      ||                                     |          |  Time out after 3 second  ||                                     |  <---    |  NAK                      || SOH|0x01|0xFE|Data[0~127]|CheckSum| |  --->    |                           ||                                     |  <---    |  ACK                      || SOH|0x02|0xFD|Data[0~127]|CheckSum| |  --->    |                           ||                                     |  <---    |  NAK                      || SOH|0x02|0xFD|Data[0~127]|CheckSum| |  --->    |                           ||                                     |  <---    |  ACK                      || SOH|0x03|0xFC|Data[0~127]|CheckSum| |  --->    |                           ||                                     |  <---    |  ACK                      || .                                   |          |  .                        || .                                   |          |  .                        || .                                   |          |  .                        ||                                     |  <---    |  ACK                      || EOT                                 |  --->    |                           ||                                     |  <---    |  ACK                      |------------------------------------------------------------------------------

最后,如果信息包中的数据如果不足128字节,剩余的部分要以0x1A(Ctrl-Z)来填充。



原创粉丝点击