# 协议的区别
## XModem
XModem的传输数据单位是信息包,XModem传输的信息包格式是:
| 帧头 | 包序号 | 序号取反 | 文件大小 | 校验位 |
| ---- | ------ | -------- | ----------- | --------- |
| SOH | 0x01 | 0xFF | Data[0-127] | Check Sum |
* 一个信息包包含一个标题开始字符SOH、 一个单字节包序号、 一个包序号的补码、128个字节数据和一个单字节的校验和。他把数据划分成128个字符的"小包"进行发送,每发送一个"小包",都要检验是否正确。如果发现错误,就再重新发送,直到整个文件传输完毕。
![]()00
* 接送方发送完NAK以后,就会等待发送方的SOH。一收到SOH字符,接收方就进入等待数据包剩余131个字符的状态。当接收方收到EOT字符后,它发送ACK并推出XModem协议传输。
* 由于每个信息包直邮128字节所以,效率不高,且控制字符没有得到协议保护。
## YModem
* 它是由XModem演变而来的,相对于XModem在效率上和可靠性上有了很大的改进。它信息报中的数据段可以达到1024个,采用CRC校验后,可靠性得到提高。并且它可以在一次传说中发送或接收多个文件。下面是第一个数据包,它包含了文件名和文件长度。
| 帧头 | 包序号 | 序号取反 | 文件名 文件大小 | 填充区 | 校验 |
| :--: | :----: | :------: | :---------------------------: | :----: | ----- |
| SOH | 0x00 | 0xFF | filename+0x00 filesize+0x00 | 0x00 | CRC16 |
* 在数据传输中,我们还有数据包。
| 帧头 | 包序号 | 序号取反 | 数据 | 填充区 | 校验 |
| :-------: | :----: | :------: | :-------------: | :----: | ----- |
| SOH / STX | 0x01 | 0xFF | 128或者1024字节 | 0x00 | CRC16 |
<img src="https://img-blog.csdnimg.cn/20200707233230137.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxOTU5Mjg4,size_16,color_FFFFFF,t_70" style="zoom: 33%;" />
* 在这个协议中,需要先由接收方发送字母C,启动YModem协议进行准备接收文件,然后发送方发送的第一个128字节的数据,包含了传文件的文件名和文件长度。包的序号为0,文件名和文件长度由一个NULL字符(值为0的字符)隔开,文件长度值后面跟随一个空格数据包的其余部分由NULL字符填充。
* 第二个数据包可以发送SOH或者STX,如果是STX开头,表示数据部分长度为1024字节。通过发送较长的数据包,YModem可以充分利用数据连接,减少应答次数。
## ZModem
ZModem并不是从XModem或者YModem演变而来的,他是一个全新的协议,流式协议。它不再以"包"来分割发送数据,而是按照连续的数据流进行处理,并把错误校验码遍布文件的始终。接收方对整个文件做校验,如果发生错误,它只要求将出错的部分重新发送。
ZModem协议将发送器和接收器之间传递的所有信息都包含在帧中。每个帧有两个组件:报头、数据子包、帧以包头开始,并带有至多4个字节的信息。
数据子包可以有选择地跟随一个报头。每个数据子包可以包含至多1024个字节的数据,其后跟随一个CRC值用于校验。
```
[报头类型字节] [帧类型字节] [四个数据字节] [报头CRC] [数据子包] [数据子包结束字符] [CRC]
```
ZModem协议相对于XModem和YModem两种协议效率高、传输速度快。但是,ZModem协议相对于其他文件传输协议过于复杂,实现起来有难度。 |