原文链接: 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表示该大包的所有小包都正常接收了(即作为正常接收的确认消息),可以发送下一个大包的数据。其对应下发消息结构体如下所示:

  1. typeedof //数据重传
  2. {
  3. short  type;   //类型
  4. int  etype;  //子类型
  5. int      times;           //第几次采样数据(0...n需要初始化,没有采集的包就跳过并向上反馈第K包没有采集)
  6. char  m_byteRetrancount[16] //高位...低位:1...128,全部为0表示接收完毕,可以发送下一包
  7. char   reserve2;//预留一字节;
  8. }

2.3 流程图

根据以上描述,这个收包以及补包过程的流程如下所示:

3.总结

本重传方案实际上是“停等协议”和“选择重传ARQ”的混合体,在安全性方面还有很多不足之处,需要结合实际情况进一步完善。

* 学了这么多年的计算机网络,终于能用于实际项目中了,当初在学习这门课的时候还以为他就是一门扫盲课,在实际项目中永远也不会用到呢。现在想想当初的想法真幼稚,不过幸亏当初还是好好学了这门课,不然碰到这种问题就不知道从何下手了。

基于选择重传ARQ传输协议的数据重传机制方案设计的更多相关文章

  1. ude—基于udp的全双工可靠传输协议

    ude是一款基于udp的可靠传输协议,专门用于在数据传输方面对实时性要求较高的应用领域.    tcp协议虽然能保证数据的可靠传输,但它有以下几个缺点:1.tcp的数据确认机制会导致发送方重复发送一些 ...

  2. SMTP 简单邮件传输协议

    SMTP 锁定 本词条由“科普中国”百科科学词条编写与应用工作项目 审核 . SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传 ...

  3. 视频流传输协议RTP/RTCP/RTSP/HTTP的区别 (转)

    用一句简单的话总结:RTSP发起/终结流媒体.RTP传输流媒体数据 .RTCP对RTP进行控制,同步.之所以以前对这几个有点分不清,是因为CTC标准里没有对RTCP进行要求,因此在标准RTSP的代码中 ...

  4. 流媒体传输协议(rtp/rtcp/rtsp/rtmp/mms/hls)转

    常用的流媒体协议主要有HTTP渐进下载和基于RTSP/RTP的实时流媒体协议两类.在流式传输的实现方案中,一般采用HTTP/TCP来传输控制信息,而用RTP/UDP来传输实时多媒体数据. 1 实时传输 ...

  5. 【RL-TCPnet网络教程】第33章 SMTP简单邮件传输协议基础知识

    第33章      SMTP简单邮件传输协议基础知识 本章节为大家讲解SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)的基础知识,方便后面章节的实战操作. (本 ...

  6. FastSocket学习笔记~制定自已的传输协议~续~制定基于FastSocket的协议

    FastSocket这个东西上次我已经说过,它使用简单,功能强大,扩展灵活,目前在新浪的生产环境中已经被广泛使用,所以它的性能,安全等各方面我们绝对可以信赖,今天我们来说一个话题,和上一讲有关,这次我 ...

  7. FTPS (FTP over SSL) vs. SFTP (SSH 文件传输协议): 我们如何做出选择

    第一个RFC的FTP协议发布通过网络使用FTP协议(由RFC 959或更高版本)的文件传输始于1980年,FTP提供上传,下载和删除文件,创建和删除目录,读取目录内容的功能.虽然FTP是非常受欢迎的, ...

  8. 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:8.自定义传输协议

    欢迎阅读我的开源项目<迷你微信>服务器)与<迷你微信>客户端 前言 在上一篇中,我们讲到了<迷你微信>服务器)的主体架构,还讲到了如何在现有功能上进行拓展,但是拓展 ...

  9. androidclient和站点数据交互的实现(基于Http协议获取数据方法)

    androidclient一般不直接訪问站点数据库,而是像浏览器一样发送get或者post请求.然后站点返回client能理解的数据格式,client解析这些数据.显示在界面上.经常使用的数据格式是x ...

随机推荐

  1. elasticsearch知识点

    1.分析:数据转化的过程. 两个转化过程-----传入文档中的数据转化程倒排序索引 -----查询文本转化成可被搜索的词 2.分析器:承担分析(数据转化)的工作 组成:一个分词器(tokenizer) ...

  2. Bootstrap之BootstrapDialog

    Make use of Bootstrap's modal more monkey-friendly. 参考地址:http://nakupanda.github.io/bootstrap3-dialo ...

  3. Codeforces 721D [贪心]

    /* 不要低头,不要放弃,不要气馁,不要慌张. 题意: 给一列数a,可以进行k次操作,每次操作可以选取任意一个数加x或者减x,x是固定的数.求如何才能使得这个数列所有数乘积最小. 思路: 贪心...讨 ...

  4. 1. Longest Palindromic Substring ( 最长回文子串 )

    要求: Given a string S, find the longest palindromic substring in S. (从字符串 S 中最长回文子字符串.) 何为回文字符串? A pa ...

  5. Struts2中的异常处理

    因为在Action的execute方法声明时就抛出了Exception异常,所以我们无需再execute方法中捕捉异常,仅需在struts.xml 中配置异常处理. 为了使用Struts2的异常处理机 ...

  6. 剑指Offer:面试题23——从上往下打印二叉树(java实现)

    问题描述: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 思路: 按照层次遍历的方法,使用队列辅助. 1.将根结点加入队列. 2.循环出队,打印当前元素,若该结点有左子树,则将其加入队列,若 ...

  7. js进度条实现

    1.先设置CSS样式(可自定义) /*#region 进度条 */ .progbar { background-color: #e1e1e1; width:auto; color: #222; hei ...

  8. sql条件中比较性能优化

    第一个比第二个性能高. 查询语句意义: 如果codelist中tablecode配置为0时, t.Table_Code = 'SV_RETURN_BILL'不生效. 如果codelist中tablec ...

  9. iOS 原生态扫描二维码、条形码的功能。

    1.导入AVFoundatin.framework. 2.新建一个viewController,命名为QRScanViewController,用于扫描的界面. h文件如下,设置代理. #import ...

  10. html如何绑定radio控件和label控件

    只要指定label的"for"属性到radio的id就行,或者用label标签包围住radio. 第一种方式: <input type="radio" i ...