发明内容
本发明的目的是提供一种用户数据报协议报文的处理方法及装置,以解决现有技术中网络丢包、乱序对用户数据报协议音视频流质量造成影响的问题。
为达到上述目的,本发明提出一种用户数据报协议报文的处理方法,包括:
A、在待发送的报文中添加冗余校验块,所述冗余校验块存储所述待发送报文之前多个报文的数据部分的冗余运算的结果;步骤A具体包括:
在待发送的报文中,将报文的数据部分分为n个等长的数据块,同时根据预设的长度或报文的剩余可用长度添加冗余校验块,使所述冗余校验块与所述数据块的长度相等,并存储所述待发送报文之前n个报文中对应数据块的冗余运算的结果;所述冗余运算包括:
利用当前报文及之前n个报文的数据块及冗余校验块构造如下矩阵:
其中,Ai,j,i=1、2、··n+1,j=1、2、··n+1,为第i个报文的第j个块,每个报文的最后一个块为冗余校验块,且如果Ai,j为空,则Ai,j=0;
运用异或算法获取结果:
B、接收端判断当前报文发生丢失后,根据与丢失报文相关联的多个报文的数据部分和/或冗余校验块进行纠错运算,恢复丢失报文的数据部分;步骤B具体包括:
判断当前报文发生丢失后,根据丢失报文之前n-1个和之后n个报文的冗余校验块及对应数据块进行纠错运算,恢复丢失报文的数据部分;所述纠错运算包括:
利用所述丢失报文及之前n-1个和之后n个报文的数据块及冗余校验块构造如下矩阵:
其中,Bi,j,i=1、2、··2n,j=1、2、··n+1,为第i个报文的第j个块,每个报文的最后一个块为冗余校验块,且如果Bi,j为空,则Bi,j=0;
运用异或算法获取结果:
……
步骤A之前还包括:
根据最大传输单元的长度限制,通过检测待发送报文的长度获取报文的剩余可用长度。
步骤A中还包括:
在待发送的报文中添加校验识别码,用于识别所述冗余校验块,并对报文的原始序列进行标识。
步骤B中所述用户数据报协议报文接收端根据所述校验识别码获取报文的原始序列信息,以判断当前报文是否发生丢失。
步骤A具体包括:
在待发送的报文中,根据预设的长度或报文的剩余可用长度添加m个冗余校验块,分别对之前m个报文的数据部分进行冗余备份;所述冗余校验块与所述数据部分的长度相等。
步骤B具体包括:
判断当前报文发生丢失后,根据丢失报文之后第i个报文的第i个冗余校验块,直接恢复丢失报文的数据部分;其中,i=1、2、··m。
本发明还提出一种用户数据报协议报文的封装方法,包括:
在待发送的报文中添加冗余校验块后封装并发送报文,所述冗余校验块存储所述待发送报文之前多个报文的数据部分的冗余运算结果;
所述封装方法具体包括:
在待发送的报文中,将报文的数据部分分为n个等长的数据块,同时根据预设的长度或报文的剩余可用长度添加冗余校验块,使所述冗余校验块与所述数据块的长度相等,并存储所述待发送报文之前n个报文中对应数据块的冗余运算的结果;所述冗余运算包括:
利用当前报文及之前n个报文的数据块及冗余校验块构造如下矩阵:
其中,Ai,j,i=1、2、··n+1,j=1、2、··n+1,为第i个报文的第j个块,每个报文的最后一个块为冗余校验块,且如果Ai,j为空,则Ai,j=0;
运用异或算法获取结果:
所述封装方法之前还包括:
根据最大传输单元的长度限制,通过检测待发送报文的长度获取报文的剩余可用长度。
所述封装方法还包括:
在待发送的报文中添加校验识别码,用于识别所述冗余校验块,并对报文的原始序列进行标识。
所述封装方法具体包括:
在待发送的报文中,根据预设的长度或报文的剩余可用长度添加m个冗余校验块,分别对之前m个报文的数据部分进行冗余备份;所述冗余校验块与所述数据部分的长度相等。
本发明还提出一种用户数据报协议报文的解封装方法,包括:
报文接收端判断当前报文发生丢失后,根据与丢失报文相关联的多个报文的数据部分和/或冗余校验块进行纠错运算,恢复丢失报文的数据部分;
所述解封装方法具体包括:
判断当前报文发生丢失后,根据丢失报文之前n-1个和之后n个报文的冗余校验块及对应数据块进行纠错运算,恢复丢失报文的数据部分;所述纠错运算包括:
利用所述丢失报文及之前n-1个和之后n个报文的数据块及冗余校验块构造如下矩阵:
其中,Bi,j,i=1、2、··2n,j=1、2、··n+1,为第i个报文的第j个块,每个报文的最后一个块为冗余校验块,且如果Bi,j为空,则Bi,j=0;
运用异或算法获取结果:
……
所述判断当前报文发生丢失具体包括:
报文接收端根据接收的报文中的校验识别码获取报文的原始序列信息,以判断当前报文是否发生丢失。
所述解封装方法具体包括:
判断当前报文发生丢失后,根据丢失报文之后第i个报文的第i个冗余校验块,直接恢复丢失报文的数据部分;其中i=1、2··m,m为报文中对之前报文数据块进行冗余备份的冗余校验块的数目。
本发明提出一种用户数据报协议报文的发送装置,包括报文发送模块,还包括报文封装模块;
所述报文封装模块在报文中添加冗余校验块,并在封装完成后由所述报文发送模块向接收端发送报文;所述冗余校验块通过对所述待发送报文之前至少一个报文的数据部分进行冗余运算获得;
所述报文封装模块添加冗余校验块具体包括:
将报文的数据部分分为n个等长的数据块,同时根据预设的长度或报文的剩余可用长度添加冗余校验块,使所述冗余校验块与所述数据块的长度相等;对所述待发送报文之前n个报文的对应数据块进行冗余运算后将结果存储于所述冗余校验块;或
在待发送的报文中,根据预设的长度或报文的剩余可用长度添加m个冗余校验块,所述冗余校验块与数据部分的长度相等;对所述待发送报文之前m个报文的数据部分分别进行冗余备份后将结果存储于所述冗余校验块;
所述对待发送报文之前n个报文的对应数据块进行冗余运算包括:
利用所述待发送报文及之前n个报文的数据块及冗余校验块构造如下矩阵:
其中,Ai,j,i=1、2、··n+1,j=1、2、··n+1,为第i个报文的第j个块,每个报文的最后一个块为冗余校验块,且如果Ai,j为空,则Ai,j=0;
运用异或算法获取结果:
还包括报文长度检测模块;
所述报文长度检测模块对所述待发送的报文长度进行检测,并根据检测结果及最大传输单元的长度限制得到所述报文的剩余可用长度。
所述报文封装模块进一步在待发送的报文中添加校验识别码,用于识别所述冗余校验块,并对报文的原始序列进行标识。
本发明还提出一种用户数据报协议报文的接收装置,包括报文接收模块,还包括报文序列检测模块及报文解析模块;
所述报文序列检测模块,用于对所述报文接收模块接收的报文进行序列检测,以判断报文是否发生丢失;
所述报文解析模块,根据与丢失报文相关联的多个报文的数据部分和/或冗余校验块进行纠错运算,恢复丢失报文的数据部分;
所述报文解析模块进行纠错运算具体包括:
根据丢失报文之前n-1个和之后n个报文的冗余校验块及对应数据块进行纠错运算,恢复丢失报文的数据部分;或
根据丢失报文之后第i个报文的第i个冗余校验块,直接恢复丢失报文的数据部分;其中i=1、2··m,m为报文中对之前报文数据块进行冗余备份的冗余校验块的数目;
所述根据丢失报文之前n-1个和之后n个报文的冗余校验块及对应数据块进行纠错运算包括:
利用所述丢失报文及之前n-1个和之后n个报文的数据块及冗余校验块构造如下矩阵:
其中,Bi,j,i=1、2、··2n,j=1、2、··n+1,为第i个报文的第j个块,每个报文的最后一个块为冗余校验块,且如果Bi,j为空,则Bi,j=0;
运用异或算法获取结果:
……
所述报文序列检测模块根据报文中的校验识别码获取报文的原始序列信息,以判断报文是否发生丢失。
与现有技术相比,本发明具有以下优点:
本发明在不增加网络传输报文数量的情况下,通过在每个用户数据报协议报文中添加一个冗余校验块,当网络传输出现丢包、乱序及误码时,可通过本发明的处理方法及装置恢复出丢失报文中的数据,提高了用户数据报协议报文的数据传输可靠性,从而提高了音视频质量,弥补了网络传输问题对用户数据报协议音视频质量的影响。
具体实施方式
下面以具体实施例结合附图对本发明进一步加以阐述。
本发明一种UDP报文的处理方法,如图2所示,包括以下步骤:
S201、在待发送的报文中添加冗余校验块及校验识别码;其中,冗余校验块存储有待发送报文之前至少一个报文中数据部分的冗余运算的结果,校验识别码用于接收端识别所述冗余校验块,并对报文的原始序列进行标识;
S202、接收端接收到报文后,根据报文中的校验识别码判断当前报文是否发生丢失,若是则转步骤S203;网络传输中可能会出现UDP报文的丢包、乱序及误码,接收端接收到报文后,根据其中的校验识别码获取报文的原始序列信息,当出现丢包或误码时可直接判断该报文丢失;而出现乱序时,可等待一定的时间,如果仍接收不到报文则判断该报文丢失;
S203、根据与丢失报文相关联的至少一个报文的数据部分和/或冗余校验块进行纠错运算,恢复丢失报文的数据部分;其中,纠错运算的算法应视步骤S201中的冗余运算而定,以下具体实施例中将有具体描述。
本发明UDP报文的处理方法适用于封装格式较为固定的音视频数据流。在实施过程中,可以根据稳定的纠错能力需求预先设置冗余校验块的长度;也可以随着纠错能力需求的改变,而根据UDP报文的剩余可用长度调节所添加冗余校验块的长度。下面以三个具体实施例对上述UDP报文的处理方法进行具体描述。
第一实施例以现有技术中较为常见的采用TS(Transport Stream,传输流)流的UDP报文作为冗余纠错的对象。具体实现如下:
(1)、根据TS流的UDP报文长度固定,对数据进行分块,同时利用报文的剩余可用长度添加冗余校验块;
TS流由固定大小的TS包所组成,每个TS包长度为188字节。由于以太网允许的最大IP包长度为1500字节,因此封装在每个UDP报文中的TS包有且仅有7个,总长度为1316字节,加上20字节的IP头和8字节的UDP头,因此UDP报文的总长度为1344字节,具体格式如图3所示。同时可得知,该报文有156个字节的剩余可用长度。
根据剩余156个字节的长度,将报文中的7个TS包分为10块,其中前9块长度为132字节,最后一个块为128字节(1316=132×9+128);同时在每个报文的最后添加长度为4字节的校验识别码和132字节的冗余校验块,此时该报文的总长度为1480字节,仍然没有超出以太网默认的1500字节MTU(MaximumTransmission Unit,最大传输单元)限制,添加冗余校验块后的报文格式如图4所示。
其中,4字节的校验识别码可以使用0x4747xxxx格式(TS流的数据块识别码是0x47),16进制的xxxx是识别UDP报文序列的0-65535循环累加计数器,以保证接收端不需要IP、UDP等字段的序列信息,独立依靠校验识别码,就可以获取出报文的原始序列信息,从而判断出当前是否发生丢包、乱序。
(2)、构造冗余运算矩阵进行冗余运算,并将冗余运算结果存储于冗余校验块中;
以20个连续的UDP报文为例,每个数据包共有11个块,其中前10个为数据块,最后一个块为冗余校验块,构成如下的矩阵A:
其中,Ai,j(i=1、2、··20,j=1、2、··11)表示第i个UDP报文中的第j个块;
再利用异或运算获取第11至20个报文中冗余校验块的结果:
……
由上可知,每个冗余校验块的产生都需要之前10个连续的报文中的部分数据块,也即,每个冗余校验块的数据都与之前10个连续的报文中的部分数据发生关联。
(3)、接收端判断报文发生丢失后,根据特定报文进行纠错运算,恢复丢失报文的数据部分。
由前述可知,接收端可根据报文中的校验识别码获取报文的原始序列信息,进一步判断是否发生丢包、乱序。当网络传输出现丢包、乱序时,接收端在等待一定时间后,若还未收到数据包,则作为报文丢失处理。此时便需要按照以下方法进行纠错运算。
首先以丢失报文之前9个和之后10个连续报文与丢失报文共同构成一个矩阵B:
其中,Bi,j(i=1、2··20,j=1、2··11)表示第i个UDP报文中的第j个块),这里假设丢失的报文为第10个。
则丢失报文的数据部分可由以下公式得到:
……
如果以上的数据块中不存在数据,即数据块为空,则在运算中自动补零,根据按位异或的运算原理,不会影响到运算的结果。
进一步由计算可得,上述第一实施例中,如果要实现本发明的处理方法,则连续的20个报文中可以允许丢失一个报文,则丢包率即为(1/20)×100%=5%。本发明中,UDP报文中封装的TS包块数可以不固定,比如在上述第一实施例中,每个报文封装了7个TS包,而如果需要进一步提高纠错能力,则可以减少每个报文中封装的TS包的个数,用来增加冗余校验块的长度,从而减少进行恢复时所需要的报文的个数。
以封装有6个TS块的UDP报文为例描述本发明UDP报文的处理方法第二实施例。
首先,根据UDP报文的剩余可用长度,对报文数据部分进行分块,同时添加冗余校验块;
UDP报文数据长度为:188×6=1128(字节)
报文剩余可用长度为:1500-(188×6+28+4)=340(字节)
根据剩余340字节的可用长度,可将数据部分分为4块,并同时添加长度为1128/4=282字节的冗余校验块及4字节的校验识别码。添加冗余校验块及校验识别码后的UDP报文格式如图5所示。
之后按类似上述第一实施例的步骤(2)、(3)构造封装矩阵及解封装矩阵。与第一实施例相比,UDP报文中的数据块由10块变为4块,由相同的异或算法可得,恢复丢失报文时所需要的报文个数则由19个变为7个,即连续的8个数据包中可以允许丢一个包,允许的丢包率为12.5%,从而进一步提高了纠错能力。由于构造矩阵的算法与第一实施例相同,因此本实施例于此不加以赘述。
除了TS流的UDP报文外,本发明也同样适用于存在UDP报文特定空闲区域的其他格式数据的承载。第三实施例中UDP报文则以G.729的20ms语音RTP(Real-time Transport Protocol,实时传输协议)打包,报文大小始终是60字节。其中包括语音净荷20字节、RTP头12字节、UDP头8字节及IP头20字节,远小于1500字节限制,存在大量的空闲区域,可以存放冗余校验块,以实现前后报文之间的相互冗余。
此时,不需要进行上述两个实施例的分块、异或运算,直接重复原始数据即可。本实施例以每个报文对之前2个报文进行冗余备份为例,图6为进行冗余校验后的UDP报文格式,如图所示,每个报文除自身的20字节净荷外,还附带了前面两个报文共48字节的净荷。
以下是由10个连续的报文构成的矩阵:
其中,每一列代表了一个UDP报文,数字N表示该报文存储有第N个报文中的净荷,例如第8个报文中,除了本身的净荷外,还冗余了第7个和第6个报文的净荷。因此,这种冗余校验方法允许每三个连续的数据包中,丢两个包,即网络允许的丢包率为66.7%。需要说明的是,按上述方法添加的冗余校验块需要占用大量长度的字节,因此该种冗余校验方法只适用于数据部分较小而剩余可用长度较大的UDP报文。
本发明一种UDP报文的封装方法,如图7所示,包括以下步骤:
S701、在待发送的报文中添加冗余校验块及校验识别码;对于封装格式及纠错能力的需求较为固定的UDP报文,可以预先设置冗余校验块的长度进行添加;而在不同封装格式或纠错能力需求不同的UDP报文中应用本发明的封装方法时,则可以通过检测报文的长度,根据报文的MTU限制获取报文的剩余可用长度,进一步进行冗余校验块的添加;
S702、对待发送报文之前至少一个报文中数据部分进行冗余运算,并将结果存储于冗余校验块。
其中,上述添加冗余校验块的方式及冗余运算的具体算法可以视报文的剩余可用长度而不同。如果报文的剩余长度较小,可以根据预设的长度或报文的剩余可用长度对报文的数据部分进行分块后添加冗余校验块,并使冗余校验块的长度与数据块的长度相等,而此时冗余运算可以采用典型的异或算法;如果报文中存在大量的空闲区域,就不需要进行数据部分的分块,也不需要进行异或运算,只需直接对之前的报文数据部分进行重复备份。
本发明一种UDP报文的解封装方法,如图8所示,包括以下步骤:
S801、判断当前报文是否发生丢失;其中,接收端可以通过报文中的IP、UDP等字段的序列信息判断是否发生丢包或乱序;而在添加有校验识别码的UDP报文中,接收端可以独立依靠校验识别码获取报文的原始序列,进一步判断当前报文是否发生丢失;
S802、根据与丢失报文相关联的至少一个报文的数据部分和/或冗余校验块进行纠错运算,恢复丢失报文的数据部分;其中,具体纠错运算的算法应视UDP报文中冗余校验块的封装方式而定,如果接收到报文中的冗余校验块是通过分块及异或运算获取,则纠错恢复也应该联合丢失报文之前和之后若干个报文的冗余校验块及对应数据块进行异或运算;而如果报文中的冗余校验块是通过对其它报文的直接复制而获得,则纠错恢复也只需从丢失报文之后存储有冗余信息的报文中的冗余校验块直接恢复。
本发明一种UDP报文的发送装置,如图9所示,包括报文长度检测模块91、报文封装模块92及报文发送模块93。
报文长度检测模块91对待发送的报文长度进行检测,并根据检测结果及MTU限制长度得到报文的剩余可用长度。
报文封装模块92根据报文的剩余可用长度在待发送的报文中添加冗余校验块及校验识别码;并在对待发送报文之前至少一个报文的数据部分进行冗余运算后将结果存储于冗余校验块。此外,报文封装模块92还可以通过预先设置冗余校验块的长度进行添加。具体的添加方式可视剩余可用长度而定,如果报文的剩余长度较小,可以根据预设的长度或报文的剩余可用长度对报文的数据部分进行分块后添加冗余校验块,并使冗余校验块的长度与数据块的长度相等,而此时冗余运算可以采用典型的异或算法;如果报文中存在大量的空闲区域,就不需要进行数据部分的分块,也不需要进行异或运算,只需直接对之前的报文数据部分进行重复备份后将结果存储于冗余校验块。
经报文封装模块92对报文封装完成后,由报文发送模块93向接收端发送。
本发明一种UDP报文的接收装置,如图10所示,包括:报文接收模块101、报文序列检测模块102及报文解析模块103。
报文接收模块101接收UDP报文后,由报文序列检测模块102对接收到的报文进行序列检测,以判断报文是否发生丢失。具体的判断方法,报文序列检测模块102可以通过报文中的IP、UDP字段,获取报文的序列信息以判断是否发生丢包或乱序;也可以独立根据报文中添加的校验识别码分辨报文的原始序列,进而判断当前报文是否发生丢失。
报文序列检测模块102判断当前报文发生丢失后,报文解析模块103根据与丢失报文相关联的至少一个报文的数据部分和/或冗余校验块进行纠错运算,恢复丢失报文的数据部分。具体纠错运算的算法应视UDP报文中冗余校验块的封装方式而定,如果接收到报文中的冗余校验块通过分块及异或运算添加,则纠错恢复也应该联合丢失报文之前和之后若干个报文的冗余校验块及对应数据块进行异或运算;而如果报文中的冗余校验块是通过对其它报文的直接复制而获得,则纠错恢复也只需从丢失报文之后存储有冗余信息的报文中的冗余校验块直接恢复。
以上公开的仅为本发明的几个具体实施例,但是,本发明并非局限于此,任何本领域的技术人员能思之的变化都应落入本发明的保护范围。