原文链接: 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. web.config

    参数上传和文件上传大小限制调整,参数上传最大2097151 <system.web> <httpRuntime requestValidationMode="2.0&quo ...

  2. LeetCode 342. Power of Four

    Given an integer (signed 32 bits), write a function to check whether it is a power of 4. Example:Giv ...

  3. 母版页的 page_load事件执行两次

    定义了一个母版页 Admin.master  部分代码如下 <body onload="LoadHight()"> <div> <!--公共的头部开始 ...

  4. VC中GBK与UTF8转化

    void ConvertGBKToUtf8(CString& strGBK) {    int len=MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strG ...

  5. HDU2047

    http://acm.hdu.edu.cn/showproblem.php?pid=2047 对于这道题,我就从后面向前面考虑. 当第n个是o的话,那么n-1 只可以取e或者f,如果n是e或者f的话, ...

  6. WCF大文件传输

    WCF传输文件的时候可以设置每次文件的传输大小,如果是小文件的时候,可以很方便的将文件传递到服务端,但是如果文件比较大的话,就不可取了 遇到大文件的话可以采取分段传输的方式进行文件传输 思路: 1.客 ...

  7. 9,SFDC 管理员篇 - 安全设置

    1, 使用Profile控制权限 (整体层面)     Setup | Manage Users | Profiles 总结下,一个用户只能有一个Profile,但是可以有多个Permission S ...

  8. 为什么C++中空类和空结构体大小为1?(转载)

    原文链接:http://www.spongeliu.com/260.html 对于结构体和空类大小是1这个问题,首先这是一个C++问题,在C语言下空结构体大小为0(当然这是编译器相关的).这里的空类和 ...

  9. uva 1368 DNA Consensus String

    这道题挺简单的,刚开始理解错误,以为是从已有的字符串里面求最短的距离,后面才发现是求一个到所有字符串最小距离的字符串,因为这样的字符串可能有多个,所以最后取最小字典序的字符串. 我的思路就是求每一列每 ...

  10. com.microsoft.sqlserver.jdbc.SQLServerException: 到主机 的 TCP/IP 连接失败。 java.net.ConnectException: Connection refused: connect

      问题描述:最简单的数据库连接报错,到主机  的 TCP/IP 连接失败.(win 7 操作系统) 错误信息: com.microsoft.sqlserver.jdbc.SQLServerExcep ...