丢包重传方法、装置及电子设备与流程

文档序号:11234365阅读:876来源:国知局
丢包重传方法、装置及电子设备与流程

本发明涉及数据传输技术领域,尤其是涉及一种丢包重传方法、装置及电子设备。



背景技术:

视频通讯,就是把本地摄像头或者其它视频采集设备采集的视频信息,编码压缩之后,通过多种网络系统传输到远端,再解压缩显示的过程。但是,由于网络条件的千差万别,网络系统中不可避免的会出现数据包丢失,即产生丢失数据包,从而影响视频通讯的质量。因此,如何在“有限带宽”的“不稳定”的网络环境中,“快速可靠的”传输数据成为了一个重要的研究方向。

通过丢包重传的方法来解决在“有限”的“不稳定”的网络环境中“稳定”的传输数据的问题在业内已经有了不少的研究。比如最基础的方法,直接使用tcp(transmissioncontrolprotocol,传输控制协议)协议来重传数据,但是由于tcp协议本身的原因,这种方法往往存在拥塞、延时大和恢复慢的问题。因此,在工程实践中,人们大多采用udp(userdatagramprotocol,用户数据报协议)协议来实现丢包重传方法。

现有技术中,在采用udp协议来实现丢包重传方法时,发送重传请求的触发条件固定不变,均以网络回路时间为基准设定触发条件,即各个重传请求的重传等待时间均是按照网络回路时间进行预估,这就相当于延长了重传的等待时间,从而导致视频传输质量差。



技术实现要素:

有鉴于此,本发明的目的在于提供一种丢包重传方法、装置及电子设备,以缩短重传等待时间,进而提高视频传输质量。

第一方面,本发明实施例提供一种丢包重传方法,应用于接收端,包括:接收发送端发送的数据包,并记录所述数据包的接收时间,其中所述数据包分为重传数据包和正常数据包,且所述数据包携带有信息头,所述信息头包括所述数据包的序号;添加所述数据包至缓存链表并根据所述序号进行排序;遍历所述缓存链表中的数据包是否连续;若是,则将当前连续的数据包添加至输出缓存;若否,则当缓存链表中的数据包的个数达到预设值时,确定丢失数据包的序号,并判断所述丢失数据包对应的重传请求次数是否为零;若是,则发送重传请求至发送端,并更新所述重传请求对应的请求时间、所述重传请求次数;若否,则判断当前时刻与当前相应的请求时间的差值是否大于单次重传等待阈值;若是,则发送重传请求至发送端,并更新所述重传请求对应的请求时间、所述重传请求次数;其中,所述重传请求携带有所述丢失数据包的序号的相关信息。

结合第一方面,本发明实施例提供了第一方面的第一种可能的实施方式,其中,所述信息头还包括发送时间、重传标识;所述方法还包括:根据所述信息头中的发送时间和重传标识,计算所述单次重传等待阈值。

结合第一方面的第一种可能的实施方式,本发明实施例提供了第一方面的第二种可能的实施方式,其中,具体按照以下方式计算:在预设时间段内,根据所述重传标识,从所述输出缓存中获取重传次数为1的多个重传数据包的信息头;根据所述信息头中的发送时间,分别计算各个所述重传次数为1的多个重传数据包的单次重传耗时;根据各个所述单次重传耗时,计算单次重传等待阈值。

结合第一方面的第二种可能的实施方式,本发明实施例提供了第一方面的第三种可能的实施方式,其中,所述根据所述信息头中的发送时间,分别计算各个所述重传次数为1的多个重传数据包的单次重传耗时包括:将所述输出缓存中的各个所述数据包按照序号从小到大进行排序;计算所述重传次数为1的多个所述重传数据包的发送时间与所述重传数据包的后一个数据包的发送时间的时间差;将所述时间差作为相应的重传次数为1的重传数据包的单次重传耗时。

结合第一方面,本发明实施例提供了第一方面的第四种可能的实施方式,其中,判断当前时刻与当前相应的请求时间的差值是否大于单次重传等待阈值之前,还包括:判断所述丢失数据包的接收时长是否超过预设延时阈值;若是,则将所述丢失数据包的后一个的数据包添加至输出缓存;其中,接收时长为当前时刻与所述丢失数据包的后一个数据包的接收时刻的时间差值。

第二方面,本发明实施例还提供一种丢包重传方法,应用于发送端,包括:监听是否接收到重传请求,所述重传请求携带有丢失数据包的序号的相关信息;若否,获取待传送的正常数据包;添加信息头至所述正常数据包,然后发送所述正常数据包至接收端,同时,将所述正常数据包存储至数据缓存区;若是,则读取并解析所述重传请求,并根据所述重传请求从数据缓存区提取所述丢失数据包,将所述丢失数据包标记为重传数据包;更新所述重传数据包的信息头,然后发送所述重传数据包至接收端;其中所述信息头包括序号、发送时间、重传标识;所述重传标识用于区分重传数据包和正常数据包。

结合第二方面,本发明实施例提供了第二方面的第一种可能的实施方式,其中,发送所述正常数据包至接收端之前,还包括:对所述正常数据包进行vbv码流控制;发送所述重传数据包至接收端之前,还包括:对所述重传数据包进行vbv码流控制。

第三方面,本发明实施例提供一种丢包重传装置,应用于接收端,包括:接收模块,用于接收发送端发送的数据包,并记录所述数据包的接收时间,其中所述数据包分为重传数据包和正常数据包,且所述数据包携带信息头,所述信息头包括所述数据包的序号;存储排序模块,用于添加所述数据包至缓存链表并根据所述序号进行排序;第一判断模块,用于遍历所述缓存链表中的数据包是否连续;缓存添加模块,用于当所述缓存链表中的数据包连续时,将当前连续的数据包添加至输出缓存;第二判断模块,用于当所述缓存链表中的数据包不连续,且缓存链表中的数据包的个数达到预设值时,确定丢失数据包的序号,并判断所述丢失数据包对应的重传请求次数是否为零;第三判断模块,用于当所述重传请求次数为非零时,判断当前时刻与当前相应的请求时间的差值是否大于单次重传等待阈值;请求发送模块,用于当所述重传请求次数为零时,或者当当前时刻与当前相应的请求时间的差值大于单次重传等待阈值时,发送重传请求至发送端,并更新所述重传请求对应的请求时间、所述重传请求次数;其中,所述重传请求携带有所述丢失数据包的序号的相关信息。

第四方面,本发明实施例还提供一种丢包重传装置,应用于发送端,包括:监听模块,用于监听是否接收到重传请求,所述重传请求携带有丢失数据包的序号的相关信息;获取模块,用于当未接收到所述重传请求时,获取待传送的正常数据包;正常发送模块,用于添加信息头至所述正常数据包,然后发送所述正常数据包至接收端,同时,将所述正常数据包存储至数据缓存区;提取模块,用于当接收到所述重传请求时,读取并解析所述重传请求,并根据所述重传请求从数据缓存区提取所述丢失数据包,将所述丢失数据包标记为重传数据包;重传发送模块,用于更新所述重传数据包的信息头,然后发送所述重传数据包至接收端;其中所述信息头包括序号、发送时间、重传标识,所述重传标识用于区分重传数据包和正常数据包。

第五方面,本发明实施例还提供一种电子设备,存储器、处理器,所述存储器上存储有可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述第一方面所述的方法的步骤或者上述第二方面所述的方法的步骤。

本发明实施例带来了以下有益效果:

本发明提供的实施例中,通过区分每个丢失数据包的第一次重传请求和后续其它的重传请求,设定不同的触发条件。发送第一次重传请求的触发条件为检测到缓存链表中的数据包不连续且缓存链表中的数据包的个数达到预设值;发送后续其它的重传请求的触发条件为当前时刻与当前请求时间的差值大于单次重传等待阈值,由于第一次重传请求的等待时间远远小于后续其它的重传请求的等待时间,因此,本发明实施例提供的丢包重传方法、装置及电子设备,缩短了重传等待时间,进而提高了视频传输质量。

本发明的其他特征和优点将在随后的说明书中阐述,并且,部分地从说明书中变得显而易见,或者通过实施本发明而了解。本发明的目的和其他优点在说明书、权利要求书以及附图中所特别指出的结构来实现和获得。

为使本发明的上述目的、特征和优点能更明显易懂,下文特举较佳实施例,并配合所附附图,作详细说明如下。

附图说明

为了更清楚地说明本发明具体实施方式或现有技术中的技术方案,下面将对具体实施方式或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施方式,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为本发明实施例提供的丢包重传方法的第一种流程示意图;

图2为本发明实施例提供的丢包重传方法的第二种流程示意图;

图3为本发明实施例提供的发送端与接收端单次重传的交互图;

图4为本发明实施例提供的发送端与接收端多次重传的交互图;

图5为本发明实施例提供的发送端的原理图;

图6为本发明实施例提供的丢包重传方法的第三种流程示意图;

图7为本发明实施例提供的重传响应过程的流程示意图;

图8为本发明实施例提供的接收端的原理图;

图9为本发明实施例提供的接收端的数据处理图;

图10为本发明实施例提供的接收端的函数处理图;

图11为本发明实施例提供的push_in_queue函数的具体实现流程图;

图12为本发明实施例提供的inter_transite函数的具体实现流程图;

图13为本发明实施例提供的out_queue函数的具体实现流程图;

图14为本发明实施例提供的丢包重传装置的第一种结构示意图;

图15为本发明实施例提供的丢包重传装置的第二种结构示意图;

图16为本发明实施例提供的电子设备的结构示意图。

具体实施方式

为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合附图对本发明的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

目前在采用udp协议来实现丢包重传方法时,发送重传请求的触发条件固定不变,均以网络回路时间为基准设定触发条件,即各个重传请求的重传等待时间均是按照网络回路时间进行预估,这就相当于延长了重传的等待时间,从而导致视频传输质量差,基于此,本发明实施例提供的一种丢包重传方法、装置及电子设备,可以区分每个丢失数据包的第一次重传请求和后续其它的重传请求,设定不同的触发条件,缩短了重传等待时间,进而提高了视频传输质量。

为便于对本实施例进行理解,首先对本发明实施例所公开的一种丢包重传方法进行详细介绍。

实施例一:

本发明提供的实施例中,首先定义了两种数据结构:

(1)信息头(retrans_header)

具体地,该信息头包括数据包的序号(sequence_number,以16位无符号整数表示)、重传标识(retrains_flag,以1比特位标识)、发送时间(ts,以16位比特位串表示),另外还包括校验标识(magic_check,15位比特位串表示)。其中,数据包分为重传数据包和正常数据包,重传数据包为已经发送过一次或者多次,而重传的数据包,正常数据包为第一次发送的数据包。重传标识用于接收端区分接收到的数据包是否为重传数据包或者正常数据包,发送时间用来标记发送端发送相应数据包的时间,单位为毫秒ms,校验标识用于接收端校验接收到的信息是否为待接收的数据包。

在发送端发送数据包的同时,需要将上述信息头添加至该数据包。为了避免在添加或者删除数据包的过程中,复制数据包中的其他数据信息,将信息头附在每个数据包的尾部。

(2)重传请求

该重传请求应当携带有丢失数据包的序号的相关信息,该相关信息可以为丢失数据包的序号,也可以为丢失数据包相邻的数据包的序号。重传请求以下可简称为nack(negativeacknowledgement,未收到确认)包。

接收端检测到存在丢失数据包时,发送nack包至发送端。在一个实施例中,可以但不限于设置发送端的端口号为接收端的端口号加一。nack包定义如下:

具体地,该nack包中包括校验标识(magic_check与上述信息头中的定义相同)、丢失数据包前一个数据包的发送时间(prev_ts,以16位比特位串表示)及序号(prev_seq,以16位比特位串表示)、丢失数据包后一个数据包的发送时间(next_ts,以16位比特位串表示)和序号(next_seq,以16位比特位串表示)。

需要说明的是,上述对nack包及信息头的定义应被解释为仅仅是示例性的,而不是作为限制。下面将定义的nack包及信息头应用于以下描述的方法中。

图1示出了本发明实施例提供的丢包重传方法的第一种流程示意图。如图1所示,该丢包重传方法应用于发送端,包括:

步骤s101,监听是否接收到重传请求。

实时监听是否接收到重传请求,实现重传优先,可以尽早的实现重传,以减少重传等待时间。若发送端没有监听到重传请求,则依次执行步骤s102、步骤s103;若发送端监听到重传请求,则依次执行步骤s104、步骤s105。

步骤s102,获取待传送的正常数据包。

步骤s103,添加信息头至该正常数据包,然后发送该正常数据包至接收端,同时,将该正常数据包存储至数据缓存区。

具体地,将添加信息头的正常数据包发送至接收端,以便接收端根据信息头进行相应的操作。同时将该正常数据包存储至数据缓存区,以备后续收到重发请求后进行重发操作。

步骤s104,读取该重传请求,并根据该重传请求从数据缓存区提取丢失数据包,将该丢失数据包标记为重传数据包。

具体地,根据重传请求中的丢失数据包的序号的相关信息,确定丢失数据包的序号,然后根据该序号从数据缓存区中提取丢失数据包。

步骤s105,更新该重传数据包的信息头,然后发送该重传数据包发至发送端。

具体地,根据当前时刻,更新该重传数据包的发送时间。

图2示出了本发明实施例提供的丢包重传方法的第二种流程示意图。如图2所示,该丢包重传方法应用于接收端,包括:

步骤s201,接收发送端发送的数据包,并记录该数据包的接收时间,其中数据包分为重传数据包和正常数据包,且该数据包携带有信息头。

步骤s202,添加该数据包至缓存链表并根据序号进行排序。

具体地,接收端解析数据包的信息头,根据信息头中的序号,对缓存链表中的各个数据包进行排序。

步骤s203,遍历该缓存链表中的数据包是否连续。

当缓存链表中的数据包连续时,执行步骤s204;当缓存链表中的数据包不连续时,执行步骤s205及其它后续步骤。

步骤s204,将当前连续的数据包添加至输出缓存。

具体地,加入输出缓存以便于后续数据包直接输出。

步骤s205,当缓存链表中的数据包的个数达到预设值时,确定丢失数据包的序号,并判断该丢失数据包对应的重传请求次数是否为零。

在本发明提供的实施例中,检测到当前数据包不连续时,需要等待缓存链表中的个数达到预设值,即设定了乱序程度。如设定预设值为10,缓存链表中现有5个数据包,这5个数据包的序号依次为1、2、4、5、6,遍历到4号数据包时,发现数据包不连续,若此时判断出缓存链表中数据包的个数没有达到预设值,则需要等待直至缓存链表中数据包的个数达到预设值。待达到预设值后,遍历到4号数据包时,若仍检测到数据包为不连续,则确定3号数据包丢失,3号数据包为丢失数据包。

另外,判断该丢失数据包对应的重传请求次数是否为零,当该重传请求次数为零,则执行步骤s207;若该重传请求次数不为零,则依次执行步骤s206、s207。

步骤s206,判断当前时刻与当前相应的请求时间的差值是否大于单次重传等待阈值。

具体地,单次重传等待时间可以用户根据网络回路时间进行估计得出,也可以通过相应计算得出。在上述差值大于单次重传等待阈值后,则确认单次重传超时,执行步骤s207,这样可以防止由于重传请求过于频繁而造成网络拥塞、恶化的现象。

步骤s207,发送重传请求至发送端,并更新该重传请求对应的请求时间、重传请求次数。

具体地,针对同一丢失数据包,每发送一次重传请求,则对一个的重传请求次数加1,同时根据发送重传请求的时间,更新请求时间。

在本发明实施例提供的丢包重传方法中,通过区分每个丢失数据包的第一次重传请求和后续其它的重传请求,设定不同的触发条件。发送第一次重传请求的触发条件为检测到缓存链表中的数据包不连续且缓存链表中的数据包的个数达到预设值;发送后续其它的重传请求的触发条件为当前时刻与当前请求时间的差值大于单次重传等待阈值,由于第一次重传请求的等待时间远远小于后续其它的重传请求的等待时间,因此,本发明实施例提供的丢包重传方法,缩短了重传等待时间,进而提高了视频传输质量。

进一步地,考虑到传输过程中,如果没有流量控制,在丢包率增大到一定程度,由于重传的数据包较多,使得网络拥塞、恶化。因此在本实施例中,发送端在发送数据包(包括重传数据包和正常数据包)至接收端之前,需要对该数据包进行码流控制,如可以采用但不限于vbv(videobufferverifier,视频缓存检验器)进行码流控制,从而用户只需要提供网络的实际带宽即可,避免了一些技术中由于流量控制造成的多次重传请求,简化了用户的使用。

图3示出了本发明实施例提供的发送端与接收端单次重传的交互图。如图3所示,单次重传的交互步骤如下:

(a1)发送端在正常数据包(以udp数据包为例)的尾部附加信息头后,进行码流控制,然后发送该正常数据包至接收端,同时将该正常数据包存储至数据缓存区。

(b1)接收端接收到数据包后,解析数据包的信息头,判断数据包是否连续,若不连续且不满足乱序程度要求时,则发送nack包至发送端。

(c1)发送端接收到nack包后,解析nack包,从数据缓存区提取对应的丢失数据包作为重传数据包,更新该重传数据包的信息头,进行码流控制,然后再次发送至接收端。

(d1)接收端接收到重传数据包,把该重传数据包排序后插入合适的位置。

进一步地,考虑到用户根据网络回路时间估计单次重传等待阈值,需要进行手动设定,进而需要比较大的人工成本,且人工设置存在滞后现象,影响视频传输的质量;又因为不同的网络具有不同的网络回路时间,单次重传等待阈值也应当根据不同的网络回路时间设定不同的数值,从而尽可能的缩短重传等待时间。因此在一个实施例中,可以根据信息头中的发送时间和重传标识,计算单次重传等待阈值。为了保证单次重传等待阈值的准确定,可以在上述步骤(d1)中,计算单次重传等待阈值。具体的计算方法如下:

(d1-1)在预设时间段内,根据重传标识从输出缓存中获取重传次数为1的多个重传数据包的信息头。

(d1-2)根据信息头中的发送时间,分别计算各个重传次数为1的多个重传数据包的单次重传耗时。

其中步骤(d1-2)具体为:将输出缓存中的各个数据包按照序号从小到大进行排序;计算重传次数为1的多个重传数据包的发送时间与该重传数据包的后一个数据包的发送时间的时间差;将该时间差作为相应重传次数为1的重传数据包的单次重传耗时。

(d1-3)根据各个单次重传耗时,计算单次重传等待阈值。

具体地,可以对各个单次重传耗时求平均值,然后用某种估算方法设置单次重传等待阈值。假设预设时间段内,计算的各个单次重传耗时分别为tr1、tr2、……trn,则该多个单次重传耗时的平均值为(tr1+tr2+……trn)/n,其中n表示单次重传耗时的个数;然后通过乘以系数的方法估算单次重传等待阈值,设系数为1.1,则计算出的单次重传等待阈值为:tr=1.1×(tr1+tr2+……trn)/n。

综上所述,通过在信息头中加入发送时间,自动计算当前网络下对应的单次重传等待阈值,而不需要用户根据不同的网络估计然后再进行手动设置,这样,本发明提供的丢包重传方法能够自适应各种不同的网络条件,既节省了人力、又能避免滞后现象,进而提高视频传输质量。

进一步地,在计算单次重传等待阈值的同时,可以根据nack包的发送情况,统计丢包率,以便后续对视频传输的统计分析。

进一步地,图4示出了本发明实施例提供的发送端与接收端多次重传的交互图。如图4所示,以两次为例,交互步骤如下:

(a2)发送端在正常数据包的尾部附加信息头后,进行码流控制,然后发送该正常数据包至接收端,同时将该正常数据包存储至数据缓存区。

(b2)接收端接收到数据包后,解析数据包的信息头,判断数据包是否连续,若不连续且不满足乱序程度要求时,则发送nack包至发送端。

(c2)发送端接收到nack包后,解析nack包,从数据缓存区提取对应的丢失数据包作为重传数据包,更新该重传数据包的信息头,进行码流控制,然后再次发送至接收端。

(d2)接收端在单次重传超时的情况下,再次发送nack包至发送端。

(e2)发送端接收到nack包后,解析nack包,从数据缓存区提取对应的丢失数据包作为重传数据包,更新该重传数据包的信息头,进行码流控制,然后再次发送至接收端。即相当于再次执行步骤(c2)。

(f2)接收端接收到重传数据包,把该重传数据包排序后插入合适的位置。

进一步地,网络情况随时间而变化,有时候网络带宽会变的极低或者彻底中断,此时接收端在没有接收到重传的丢失数据包的情况下,会不断发送nack包,只有缓冲区满的情况下,才会退出重传。由于缓冲区满的时间与实际传输的码率有关,码率不同则缓冲区满的时间不同,且缓冲区一般开得很大,所以在网络恢复正常带宽瞬间,会导致过多的数据包传输,使得整个网络链路的恢复时间变慢,严重影响视频传输质量。因此,上述应用于接收端的丢包重传方法中,判断当前时刻与当前相应的请求时间的差值是否大于单次重传等待阈值之前,还包括:判断丢失数据包的接收时长是否超过预设延时阈值;若是,则将丢失数据包的后一个的数据包添加至输出缓存;其中,接收时长为当前时刻与丢失数据包的后一个数据包的接收时刻的时间差值,预设延时阈值可以由用户根据实际的需要自行设置,这里不作限定。

这样,丢失数据包的接收时长超过预设延时阈值时,不再发送nack包,直接退出重传,即该丢失数据包不再重传,以避免加快网络链路的恢复时间,避免出现网络拥塞现象。

综上所述,通过码流控制和设置预设延时阈值,用户只需要设置用户能忍受的最大延时,就可以完成丢包重传,提高了用户的易用性。

进一步地,为了防止接收到意外的数据包而造成出错情况,比如接收到了另一个媒体源的数据包,上述应用于接收端的丢包重传方法还包括:计算接收到的当前数据包的序号与上一个数据包的序号的差值;若该差值大于预设阈值,则确定当前数据包不合法,删除该当前数据包。

图5示出了本发明实施例提供的发送端的原理图。如图5所示,该发送端涉及到信息头添加、码流控制、及数据包缓存三个部分,该发送端具体执行步骤包括:

(a3)从输入端pack处接收打包好的数据包,在数据包的尾部添加信息头。此时不需要区分数据包的封装协议(如udp协议、rtp协议)。

(b3)数据包经过vbv码流控制后,可以但不限于通过udp协议发送(在图5中表示为udp_send)至发送端。

(c3)数据包发送的同时,将数据包存入缓存(可以但不限于缓存数组),以备后续重传。

(d3)接收端接收到nack包后,从缓存中查找对应的丢失数据包,经过vbv码流控制后,可以但不限于通过udp协议发送(在图5中表示为udp_recv)至发送端。

进一步地,图6示出了本发明实施例提供的丢包重传方法的第三种流程示意图,该丢包重传方法应用于发送端。如图6所示,实际设计过程的具体步骤如下:

(a4)初始化数据缓存区。

数据缓存区保存的是数据的一些描述信息和实际数据的buffer指针,并不包含实际数据。具体定义如下:

seq对应信息头retrans_header里的sequence_number,为数据包序号;ts对应retrans_header里的ts,为该node的发送时刻,单位为ms;buffer为存储数据的heap_buffer的句柄;used表明该node的数据是否有效;resend表明该数据的重传次数。

为了加快对数据包的查找,数据缓存区为个数为2的整数次幂的数组,每一个数据包在数据缓冲区的位置为seq&(m-1),m表示缓存区数据包的数量。

(b4)检查nack管道是否有nack包。如果有,则提取该nack包,解析nack包,进行重传响应。该重传响应的过程如图7所示。如果没有,则执行步骤(c4)。

(c4)检查码流输入管道(正常数据包的输入端)是否有数据包,即是否接收到正常数据包,若是,短休眠之后,回到步骤(b4),若否,则取出数据包,执行步骤(d4)。

(d4)进行vbv码流控制,生成信息头,并附在正常数据包的尾部,复制该正常数据包后,将该正常数据包发送至接收端。

(e4)将复制的正常数据包存入数据缓存区,同时清理好原来的失效的数据,失效的数据放回码流输入管道,回到步骤(b4)。这里以seq=0x46d2,m=0x400为例进行说明,首先代入seq&(m-1)得到该正常数据包在数据缓冲区的位置site=0x2d2,释放原来site=0x2d2中的数据,将该正常数据包放入site=0x2d2中。

图8示出了本发明实施例提供的接收端的原理图。如图8所示,该接收端设计过程具体包括:

(a5)接收端可以但不限于通过udp协议接收到数据包,加入双向链表(通过seq找到合适位置),并记录该数据包的入队时间(解码本地时间)。

(b5)检查双向链表中不连续的数据包是否满足乱序程度要求,若否,则发送nack包,其中该乱序程度可以通过参数设置。

(c5)从双向链表的队首开始输出连续的数据包或者超过预设延时阈值仍不连续的数据包,然后删除各个数据包的信息头,进行拆包输出至输出端unpack。

图9示出了本发明实施例提供的接收端的数据处理图。在一个实施例中,如图9所示,该接收端包括1个数据输入管道,2个输出管道(nack输出管道和数据输出管道)。为了便于数据处理,该接收端还包括2个双向链表,分别是recvqueue与outqueue。

该数据处理过程通过循环调用push_in_queue、inter_transite、out_queue这三个函数来实现,如图10所示。

其中,push_in_queue的作用是从数据输入管道获取数据包,填入双向链表recvqueue或者outqueue,并按照信息头的序号从小到大进行排序,具体实现过程如图11所示。参见图11,从数据输入管道获取数据包后,申请一个新的queue节点空间,并记录本地时间(作为数据包的接收时间);将数据包的数据指针存入上述queue节点空间;判断该数据包是否为重传数据包。

若该数据包不是重传数据包,则将该数据包插入recvqueue,比较该数据包对应的序号seq与上一次从recvqueue队列移除到outqueue队列的数据包的序号recv_lastseq,若seq大于该recv_lastseq,两者差值小于最大阈值,且与该recvqueue队列中的其他数据包的序号不重复,则按照序号从小到达的顺序插入至该recvqueue队列中;若该seq小于该recv_lastseq,或者两者差值大于等于最大阈值或者与该recvqueue队列中的其他数据包的序号重复,则销毁该数据包对应的queue节点空间。

若该数据包是重传数据包,则将该数据包插入outqueue,比较该数据包对应的序号seq与上一次从outqueue队列移除到数据输出管道的数据包的序号out_lastseq,后续对比操作过程与上述非重传数据包的情况相同,在此不再赘述。

函数inter_transite的作用是,将recvqueue中的节点转到outqueue,具体实现过程如图12所示。参见图12,从recvqueue的队首取出节点,若取出失败,则该inter_transite函数调用结束。若成功,则判断取出的该节点中的数据包与最后一个从recvqueue中移除的节点中的数据包是否连续,若是,则将该节点从recvqueue中删除,添加至outqueue的队尾,并进行相应的链表参数变更(recvqueue中数据包的个数recv_queue_num减1,outqueue中数据包的个数out_queue_num加1),同时记录最后一个从recvqueue中移除的节点信息(如节点中的指针,以便于判断数据包的连续性);若否,则判断recvqueue中数据包的个数是否达到预设值(recv_queue_num>limit(预设值)),若否,则inter_transite函数调用结束,若是,则将该节点从recvqueue中删除,添加至outqueue的队尾,并进行相应的链表参数变更(recvqueue中数据包的个数recv_queue_num减1,outqueue中数据包的个数out_queue_num加1),然后将该节点对应的重传次数加1,发送相应的nack包(此时为第一次发送nack包),同时记录最后一个从recvqueue中移除的节点信息。

函数out_queue的作用是,将outqueue中的连续或者超过预设延时阈值仍不连续的数据包推出队列,具体实现过程如图13所示。参见图13,首先获取按照上述方法计算的单次重传等待阈值,从outqueue的队首取出节点,若取出失败,则遍历out_queue,当检测到不连续则按照前述重传请求的发送方法发送nack包(此时非第一次发送nack包),该out_queue函数调用结束。若成功,则判断取出的该节点中的数据包与数据输出管道中最后进入的数据包是否连续,若是,则输出当前节点中的数据包至数据输出管道;若否,则判断该数据包对应的丢失数据包的接收时长是否超过预设延时阈值,若是,则将输出当前节点中的数据包至数据输出管道,若否,则判断该当前时刻与当前相应的请求时间的差值是否大于单次重传等待阈值,若是,则遍历out_queue,当检测到不连续则按照前述重传请求的发送方法发送nack包(此时非第一次发送nack包),该out_queue函数调用结束。

需要说明的是,上述输出当前节点中的数据包至数据输出管道后,需要将当前节点从out_queue中删除,并销毁节点空间,记录最后一个从outqueue中移除的节点信息(以便于判断数据包的连续性),outqueue中数据包的个数out_queue_num减1,然后回到“从outqueue的队首取出节点”这一步骤。

实施例二:

图14示出了本发明实施例提供的丢包重传装置的第一种结构示意图。该丢包重传装置应用于发送端,包括:

监听模块11,用于监听是否接收到重传请求,该重传请求携带有丢失数据包的序号的相关信息;获取模块12,用于当未接收到重传请求时,获取待传送的正常数据包;正常发送模块13,用于添加信息头至正常数据包,然后发送正常数据包至接收端,同时,将正常数据包存储至数据缓存区;提取模块14,用于当接收到重传请求时,读取并解析该重传请求,并根据该重传请求从数据缓存区提取丢失数据包,将该丢失数据包标记为重传数据包;重传发送模块15,用于更新重传数据包的信息头,然后发送该重传数据包至接收端;其中上述信息头包括序号、发送时间、重传标识,重传标识用于区分重传数据包和正常数据包。

图15示出了本发明实施例提供的丢包重传装置的第二种结构示意图。该丢包重传装置应用于接收端,包括:

接收模块21,用于接收发送端发送的数据包,并记录该数据包的接收时间,其中该数据包分为重传数据包和正常数据包,且数据包携带信息头,该信息头包括数据包的序号;存储排序模块22,用于添加该数据包至缓存链表并根据上述序号进行排序;第一判断模块23,用于遍历缓存链表中的数据包是否连续;缓存添加模块24,用于当缓存链表中的数据包连续时,将当前连续的数据包添加至输出缓存;第二判断模块25,用于当缓存链表中的数据包不连续,且缓存链表中的数据包的个数达到预设值时,确定丢失数据包的序号,并判断该丢失数据包对应的重传请求次数是否为零;第三判断模块26,用于当重传请求次数为非零时,判断当前时刻与当前相应的请求时间的差值是否大于单次重传等待阈值;请求发送模块27,用于当重传请求次数为零时,或者当当前时刻与当前相应的请求时间的差值大于单次重传等待阈值时,发送重传请求至发送端,并更新重传请求对应的请求时间、重传请求次数;其中,上述重传请求携带有丢失数据包的序号的相关信息。

这样,通过区分每个丢失数据包的第一次重传请求和后续其它的重传请求,设定不同的触发条件。发送第一次重传请求的触发条件为检测到缓存链表中的数据包不连续且缓存链表中的数据包的个数达到预设值;发送后续其它的重传请求的触发条件为当前时刻与当前请求时间的差值大于单次重传等待阈值,由于第一次重传请求的等待时间远远小于后续其它的重传请求的等待时间,因此,本发明实施例提供的丢包重传装置,缩短了重传等待时间,进而提高了视频传输质量。

实施例三:

参见图16,本发明实施例还提供一种电子设备100,包括:处理器40,存储器41,总线42和通信接口43,所述处理器40、通信接口43和存储器41通过总线42连接;处理器40用于执行存储器41中存储的可执行模块,例如计算机程序。

其中,存储器41可能包含高速随机存取存储器(ram,randomaccessmemory),也可能还包括非不稳定的存储器(non-volatilememory),例如至少一个磁盘存储器。通过至少一个通信接口43(可以是有线或者无线)实现该系统网元与至少一个其他网元之间的通信连接,可以使用互联网,广域网,本地网,城域网等。

总线42可以是isa总线、pci总线或eisa总线等。所述总线可以分为地址总线、数据总线、控制总线等。为便于表示,图16中仅用一个双向箭头表示,但并不表示仅有一根总线或一种类型的总线。

其中,存储器41用于存储程序,所述处理器40在接收到执行指令后,执行所述程序,前述本发明实施例任一实施例揭示的流过程定义的装置所执行的方法可以应用于处理器40中,或者由处理器40实现。

处理器40可能是一种集成电路芯片,具有信号的处理能力。在实现过程中,上述方法的各步骤可以通过处理器40中的硬件的集成逻辑电路或者软件形式的指令完成。上述的处理器40可以是通用处理器,包括中央处理器(centralprocessingunit,简称cpu)、网络处理器(networkprocessor,简称np)等;还可以是数字信号处理器(digitalsignalprocessing,简称dsp)、专用集成电路(applicationspecificintegratedcircuit,简称asic)、现成可编程门阵列(field-programmablegatearray,简称fpga)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。可以实现或者执行本发明实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。结合本发明实施例所公开的方法的步骤可以直接体现为硬件译码处理器执行完成,或者用译码处理器中的硬件及软件模块组合执行完成。软件模块可以位于随机存储器,闪存、只读存储器,可编程只读存储器或者电可擦写可编程存储器、寄存器等本领域成熟的存储介质中。该存储介质位于存储器41,处理器40读取存储器41中的信息,结合其硬件完成上述方法的步骤。

本发明实施例提供的丢包重传装置及电子设备,与上述实施例提供的丢包重传方法具有相同的技术特征,所以也能解决相同的技术问题,达到相同的技术效果。

所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的装置和电子设备的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。

本发明实施例所提供的进行丢包重传方法的计算机程序产品,包括存储了处理器可执行的非易失的程序代码的计算机可读存储介质,所述程序代码包括的指令可用于执行前面方法实施例中所述的方法,具体实现可参见方法实施例,在此不再赘述。此外,术语“第一”、“第二”、“第三”仅用于描述目的,而不能理解为指示或暗示相对重要性。

在本申请所提供的几个实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,又例如,多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。

所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个处理器可执行的非易失的计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccessmemory)、磁碟或者光盘等各种可以存储程序代码的介质。

最后应说明的是:以上所述实施例,仅为本发明的具体实施方式,用以说明本发明的技术方案,而非对其限制,本发明的保护范围并不局限于此,尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,其依然可以对前述实施例所记载的技术方案进行修改或可轻易想到变化,或者对其中部分技术特征进行等同替换;而这些修改、变化或者替换,并不使相应技术方案的本质脱离本发明实施例技术方案的精神和范围,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应所述以权利要求的保护范围为准。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1