x-model协议分析和在vivi代码中的实现
2012-08-26 14:59
253 查看
首先介绍xmodel协议:
XMODEM协议是一种使用拨号调制解调器的个人计算机通信中广泛使用的异步文件运输协议。这种协议以128字节块的形式传输数据,并且每个块都使用一个校验和过程来进行错误检测。
如果接收方关于一个块的校验和与它在发送方的校验和相同时,接收方就向发送方发送一个认可字节。然而,这种对每个块都进行认可的策略将导致低性能,特别是具有很长传播延迟的卫星连接的情况时,问题更加严重。
使用循环冗余校验的与XMODEM相应的一种协议称为XMODEM-CRC。还有一种是XMODEM-1K,它以1024字节一块来传输数据。ZMODEM是最有效的一个XMODEM版本,它不需要对每个块都进行认可。事实上,它只是简单地要求对损坏的块进行重发。ZMODEM对按块收费的分组交换网络是非常有用的。不需要认可回送分组在很大程度上减少了通信量。
YMODEM也是一种XMODEM的实现。它包括XMODEM-1K的所有特征,另外在一次单一会话期间为发送一组文件,增加了批处理文件传输模式。
| SOH | 信息包序号 | 信息包序号的反码 | 数据区段 | 算术校验和 |
|_____|________ _|________________|________|__________|
说明:
SOH 帧的开头字节,代表信息包中的第一个字节
信息包序号: 对 256 取模所得到当前包号,第一个信息包的序号为 1
而信息包序号范围 0~255
信息包序号的反码: 当前信息包号的反码
数据区段: 数据区段的长度固定为 128 字节,其内容没有任何限制,可以是
文本数据或二进制数据
算术校验和: 1字节的算术校验和,只对数据区段计算后对 256 取模而得
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
1> 接收方等待一个信息包的到来所具有的超时时限为 10 秒,每个超时后发送 NAK
2> 当收到包时,接收过程中每个字符的超时间隔为 1 秒
3> 为保持“接收方驱动”,发送方在等待一个启动字节时不应该采用超时处理
4> 一旦传输开始,发送方采用单独的 1 分钟超时时限,给接收方充足的时间做发送
ACK ,NAK ,CAN 之前的必须处理
5> 所有的超时及错误事件至少重试 10 次
4。 控制字符
控制字符符合 ASICII 标准定义,长度均为 1 字节
SOH 0x01
EOT 0x04
ACK 0x06
NAK 0x15
CAN 0x18
这是 Xmodem 协议的最基本的一个版本,在其上还有 Xmode-1K 这样的扩展,加大了传输封包的大小(1K),用来提高传输速率;增加了 CRC 校验,用来提高传输的可靠性;区别在于:当启用 Xmodem 时,接收方发送 C 字符。发送方收到 C 字符判定为采用 Xmodem-1K 扩展;否则,当超时后,按照基本的版本传输。
上面就是xmodel协议的内容。
要实现这个协议当然要遵循协议的规范,所以函数的实现也不例外,下面分析在vivi中的实现。
vivi中主要是接受xmodel协议的数据,所以接受方需要向发送方发送NAK
这个函数就是实现刚刚说的想发送方发送NAK信号的函数,同时也是得到字符的函数。我们来分析下这个底层函数,当我们在适当的时间没得到字符时,我们就判断当我们是否第一次发送,也即是one_nak=0;如果是的话就发送NAK;直到接受到数据,当然接收不到数据还有其他的处理,主要就是在接受字符之间的处理。
然后就是得到一条记录的函数了也即是get_record。
该函数通过get_byte()函数得到字符,然后判断字符。保存字符,并返回这一帧的地址。
最后就是集大成者了,即是xmodem_receive(char *dldaddr, size_t len)函数。
该函数就是把接受到的数据存到相应的地址里面,就是参数dldaddr,len这个参数在函数中没有使用,我的个人理解时这个函数可能是要传递实际要传的数据长度。
函数中还带有相应的出错处理。暂时可以不分析,因为我们考虑这个东西时一般按最好的来看的
XMODEM协议是一种使用拨号调制解调器的个人计算机通信中广泛使用的异步文件运输协议。这种协议以128字节块的形式传输数据,并且每个块都使用一个校验和过程来进行错误检测。
如果接收方关于一个块的校验和与它在发送方的校验和相同时,接收方就向发送方发送一个认可字节。然而,这种对每个块都进行认可的策略将导致低性能,特别是具有很长传播延迟的卫星连接的情况时,问题更加严重。
使用循环冗余校验的与XMODEM相应的一种协议称为XMODEM-CRC。还有一种是XMODEM-1K,它以1024字节一块来传输数据。ZMODEM是最有效的一个XMODEM版本,它不需要对每个块都进行认可。事实上,它只是简单地要求对损坏的块进行重发。ZMODEM对按块收费的分组交换网络是非常有用的。不需要认可回送分组在很大程度上减少了通信量。
YMODEM也是一种XMODEM的实现。它包括XMODEM-1K的所有特征,另外在一次单一会话期间为发送一组文件,增加了批处理文件传输模式。
帧格式
| SOH | 信息包序号 | 信息包序号的反码 | 数据区段 | 算术校验和 ||_____|________ _|________________|________|__________|
说明:
SOH 帧的开头字节,代表信息包中的第一个字节
信息包序号: 对 256 取模所得到当前包号,第一个信息包的序号为 1
而信息包序号范围 0~255
信息包序号的反码: 当前信息包号的反码
数据区段: 数据区段的长度固定为 128 字节,其内容没有任何限制,可以是
文本数据或二进制数据
算术校验和: 1字节的算术校验和,只对数据区段计算后对 256 取模而得
2。 传输逻辑
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
3。 超时处理
1> 接收方等待一个信息包的到来所具有的超时时限为 10 秒,每个超时后发送 NAK2> 当收到包时,接收过程中每个字符的超时间隔为 1 秒
3> 为保持“接收方驱动”,发送方在等待一个启动字节时不应该采用超时处理
4> 一旦传输开始,发送方采用单独的 1 分钟超时时限,给接收方充足的时间做发送
ACK ,NAK ,CAN 之前的必须处理
5> 所有的超时及错误事件至少重试 10 次
4。 控制字符
控制字符符合 ASICII 标准定义,长度均为 1 字节
SOH 0x01
EOT 0x04
ACK 0x06
NAK 0x15
CAN 0x18
这是 Xmodem 协议的最基本的一个版本,在其上还有 Xmode-1K 这样的扩展,加大了传输封包的大小(1K),用来提高传输速率;增加了 CRC 校验,用来提高传输的可靠性;区别在于:当启用 Xmodem 时,接收方发送 C 字符。发送方收到 C 字符判定为采用 Xmodem-1K 扩展;否则,当超时后,按照基本的版本传输。
上面就是xmodel协议的内容。
要实现这个协议当然要遵循协议的规范,所以函数的实现也不例外,下面分析在vivi中的实现。
vivi中主要是接受xmodel协议的数据,所以接受方需要向发送方发送NAK
这个函数就是实现刚刚说的想发送方发送NAK信号的函数,同时也是得到字符的函数。我们来分析下这个底层函数,当我们在适当的时间没得到字符时,我们就判断当我们是否第一次发送,也即是one_nak=0;如果是的话就发送NAK;直到接受到数据,当然接收不到数据还有其他的处理,主要就是在接受字符之间的处理。
然后就是得到一条记录的函数了也即是get_record。
该函数通过get_byte()函数得到字符,然后判断字符。保存字符,并返回这一帧的地址。
最后就是集大成者了,即是xmodem_receive(char *dldaddr, size_t len)函数。
该函数就是把接受到的数据存到相应的地址里面,就是参数dldaddr,len这个参数在函数中没有使用,我的个人理解时这个函数可能是要传递实际要传的数据长度。
函数中还带有相应的出错处理。暂时可以不分析,因为我们考虑这个东西时一般按最好的来看的
相关文章推荐
- 直播电视HLS协议分析及实现1---相关开源工程代码
- java在线支付---09,10,11,12_在线支付_分析易宝支付网关的应答协议与处理代码,完成用于处理支付响应的Servlet的初步编写和调试,完成处理支付网关响应结果的Servlet,支付实现
- rtmfp协议分析详解代码实现(二)
- java实现网上在线支付--09,10,11,12_分析易宝支付网关的应答协议与处理代码,完成用于处理支付响应的Servlet的初步编写和调试,完成处理支付网关响应结果的Servlet,支付实现
- MQTT协议的详细分析及各种平台代码实现(参考资料)
- SPFA 原理剖析代码实现分析比较
- 编译原理-词法分析04-NFA & 代码实现
- ODBC + WIN32 API 访问MYSQL 数据库实现简单QQ用户注册和登录 的代码分析
- 数据结构:树tree和二叉树BinaryTree的实现与代码分析
- 主成分分析(PCA)实现代码
- PHP获取客户端真实IP地址的5种情况分析和实现代码
- WebRTC中RTP/RTCP协议实现分析
- Java NIO原理图文分析及代码实现
- 第五篇:朴素贝叶斯分类算法原理分析与代码实现
- Https协议:SSL建立过程分析(也比较清楚,而且有OpenSSL的代码)
- UDT协议实现分析——连接的建立
- Java NIO原理图文分析及代码实现
- android热更新实现原理及代码分析
- 代码分析-DataGrid实现自增列、单选、多选
- [Asp.net 5] DependencyInjection项目代码分析4-微软的实现(5)(IEnumerable<>补充)