基于选择重传ARQ传输协议的数据重传机制方案设计
原文链接: http://blog.csdn.net/pinghegood/article/details/7841281
1.背景
最近在项目中,由于使用TD网络传输数据,数据掉包严重,软件组老大叫我来处理掉包问题。于是我就想起了在计算机网络中讲数据链路层协议时的“选择重传ARQ”协议(见《计算机网络》第四版 AndrewS.Tanenbaum的p187)来解决丢包问题。我不是一个好学生,所以具体细节忘了一些,遂找出那本书,把那一小节迅速浏览了一遍便想起了其具体工作流程。但是这个协议还不能直接应用于项目,因为发送方是搭载一颗arm芯片的传感器,arm的处理能力很弱,所以如此复杂的协议肯定是用不了。
2.具体设计
在本项目中,某个功能模块需要传感器采集5次数据,然后通过TD网络上传到PC端进行处理。每次数据作为一个大包,每个大包有128个小包。该模块需要一个大包数据收全才能使用。但是由于TD网络不稳定,所以在传输过程中,总是有小包丢失,导致这次数据就不能用。而这些传感器分布在离PC端几公里到几百公里的广阔范围内,传感器采集一次数据的时延很大(估计要1分钟左右),所以为提升系统性能,数据重传显得尤为重要。
如前所述,发送方为处理能力很弱的传感器。现成的复杂的协议不能使用,所以只能参考已有的重传方案设计新的方案。
综合以上因素,我们设计了被我称为“完成补包停等协议”的补包协议。具体过程如下图所示:

如上图所示,左边是数据重传的交换图,右边是接收方维护的两个数组:一个用来存放接收到的数据包;另一个是每个包对应的标志位,1表示还没接收,0表示已经接收。
2.1初始化
初始时,当接收方主动请求数据时,初始化相关变量:分配接收数据队列(128个空间),以及重置标志bit数组(unsigned char bit[16]),初始值为0xFF(表示所有的都还没有接收)。
如注释A所示,设置针对重传标志bit数组的定时器,延时时间根据上层给定的值确定。
2.2接收数据
当接收方接收到一个包后(如 B,C,D,E,X),它需要做以下三件事情:
(1)将该包放入数据队列的相应位置;
(2)将重传标志bit数组的相应位置0;
(3)取消上一个定时器,根据测得的时延重新对重传标志bit数组设置定时器。定时器管理使用Jacobson算法(TCP定时器管理也使用的该算法)。首先,给出一个到达连接目标端的往返时间的当前最佳估计值,用RTT表示。如果在定时器过期之前数据回来了,则测量一下这次数据传输所花的时间,用M代替。

这里
是一个平滑因子,它决定了老的RTT值所占的权重。典型情况下
。
如上图所示:当第2包丢失后,第3包正常到达,此时接收第3包,而对丢失的第2包不做任何处理。如果第2包延迟到达(如图中D所示),也正常接收以便减少重传包的数量。当接收完一个大包的最后一个小包或者定时器超时之后将会把重传标志bit数组发送给发送方(如图中F所示),如果此时重传标志bit数组全为0则取消相应的定时器。发送方在接收到bit数组之后,通过检测相应的位来决定重传包,如果全为0表示该大包的所有小包都正常接收了(即作为正常接收的确认消息),可以发送下一个大包的数据。其对应下发消息结构体如下所示:
- typeedof //数据重传
- {
- short type; //类型
- int etype; //子类型
- int times; //第几次采样数据(0...n需要初始化,没有采集的包就跳过并向上反馈第K包没有采集)
- char m_byteRetrancount[16] //高位...低位:1...128,全部为0表示接收完毕,可以发送下一包
- char reserve2;//预留一字节;
- }
2.3 流程图
根据以上描述,这个收包以及补包过程的流程如下所示:

3.总结
本重传方案实际上是“停等协议”和“选择重传ARQ”的混合体,在安全性方面还有很多不足之处,需要结合实际情况进一步完善。
* 学了这么多年的计算机网络,终于能用于实际项目中了,当初在学习这门课的时候还以为他就是一门扫盲课,在实际项目中永远也不会用到呢。现在想想当初的想法真幼稚,不过幸亏当初还是好好学了这门课,不然碰到这种问题就不知道从何下手了。
基于选择重传ARQ传输协议的数据重传机制方案设计的更多相关文章
- ude—基于udp的全双工可靠传输协议
ude是一款基于udp的可靠传输协议,专门用于在数据传输方面对实时性要求较高的应用领域. tcp协议虽然能保证数据的可靠传输,但它有以下几个缺点:1.tcp的数据确认机制会导致发送方重复发送一些 ...
- SMTP 简单邮件传输协议
SMTP 锁定 本词条由“科普中国”百科科学词条编写与应用工作项目 审核 . SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传 ...
- 视频流传输协议RTP/RTCP/RTSP/HTTP的区别 (转)
用一句简单的话总结:RTSP发起/终结流媒体.RTP传输流媒体数据 .RTCP对RTP进行控制,同步.之所以以前对这几个有点分不清,是因为CTC标准里没有对RTCP进行要求,因此在标准RTSP的代码中 ...
- 流媒体传输协议(rtp/rtcp/rtsp/rtmp/mms/hls)转
常用的流媒体协议主要有HTTP渐进下载和基于RTSP/RTP的实时流媒体协议两类.在流式传输的实现方案中,一般采用HTTP/TCP来传输控制信息,而用RTP/UDP来传输实时多媒体数据. 1 实时传输 ...
- 【RL-TCPnet网络教程】第33章 SMTP简单邮件传输协议基础知识
第33章 SMTP简单邮件传输协议基础知识 本章节为大家讲解SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)的基础知识,方便后面章节的实战操作. (本 ...
- FastSocket学习笔记~制定自已的传输协议~续~制定基于FastSocket的协议
FastSocket这个东西上次我已经说过,它使用简单,功能强大,扩展灵活,目前在新浪的生产环境中已经被广泛使用,所以它的性能,安全等各方面我们绝对可以信赖,今天我们来说一个话题,和上一讲有关,这次我 ...
- FTPS (FTP over SSL) vs. SFTP (SSH 文件传输协议): 我们如何做出选择
第一个RFC的FTP协议发布通过网络使用FTP协议(由RFC 959或更高版本)的文件传输始于1980年,FTP提供上传,下载和删除文件,创建和删除目录,读取目录内容的功能.虽然FTP是非常受欢迎的, ...
- 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:8.自定义传输协议
欢迎阅读我的开源项目<迷你微信>服务器)与<迷你微信>客户端 前言 在上一篇中,我们讲到了<迷你微信>服务器)的主体架构,还讲到了如何在现有功能上进行拓展,但是拓展 ...
- androidclient和站点数据交互的实现(基于Http协议获取数据方法)
androidclient一般不直接訪问站点数据库,而是像浏览器一样发送get或者post请求.然后站点返回client能理解的数据格式,client解析这些数据.显示在界面上.经常使用的数据格式是x ...
随机推荐
- 48. Remove Duplicates from Sorted List && Remove Duplicates from Sorted List II
Remove Duplicates from Sorted List Given a sorted linked list, delete all duplicates such that each ...
- Django base view
class django.views.generic.base.View 它是基类的基类,其它View基类都是从这继承的. 官例: from django.http import HttpRespon ...
- 华为OJ题目:扑克牌大小
题目描述: 扑克牌游戏大家应该都比较熟悉了,一副牌由54张组成,含3~A.2各4张,小王1张,大王1张.牌面从小到大用如下字符和字符串表示(其中,小写joker表示小王,大写JOKER表示大王):3 ...
- Apache 配置HTTPS协议搭载SSL配置
在设置Apache + SSL之前, 需要做: 安装Apache, 请参见: Windows环境下Apache的安装与虚拟目录的配置, 下载安装Apache时请下载带有ssl版本的Apache ...
- System.getProperty()方法获取大全
System.out.println("java版本号:" + System.getProperty("java.version")); // java版本号 ...
- 【转】提高VR渲染速度的关键
提高VR渲染速度的关键,这个教程比以往的教程都要重要很多,如果你是刚刚步入学习和上升阶段那么这将是你必须要看的东西,他会让你迅速提升技能达到比你死看书本好很多的效果,不多说上教程 VR的基本渲染方 ...
- Extract QQ from iPhone and analyze it
QQ is one of the most popular chat App in the world. Now let me show you how to extract QQ from iPho ...
- NHibernate系列文章十二:Load/Get方法
摘要 NHibernate提供两个方法按主键值查找对象:Load/Get. 1. Load/Get方法的区别 Load: Load方法可以对查询进行优化. Load方法实际得到一proxy对象,并不立 ...
- jQuery 根据JSON数据动态生成表格
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- 【EF学习笔记12】----------解释查询和本地查询 区分 Enumerable 和 Queryable
简单介绍:Enumerable 和 Queryable 他们都是静态类,位于命名控件 System.Linq下,分别为IEnumerable<T>和IQueryable<T>提 ...