超级终端的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 | ---------------------------------------------------------------------------
所有的数据字节都将参与和运算,由于校验和只占一个字节,如果累加的和超过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 | ------------------------------------------------------------------------------
需要注意的是,在发送方,CRC是高字节在前,低字节在后。
传输流程如图所示:
--------------------------------------------------------------------------- | 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)来填充。