背景技术
传统的通讯业务是采用电路交换技术,通话双方通过建立一条固定带宽的电路实现提供业务,这种方式下带宽利用率底,通讯的成本高,而且增值业务的开发、推广比较困难。
目前,许多新开发的多媒体通讯业务采用分组交换技术,承载网络是IP分组交换网络,比如因特网。分组交换的优点是网络利用率高,通讯的成本底,而且由于使用了开放式的架构,新业务的开发、推广比较快速。
当使用IP或其他分组交换网络作为承载网络时,通常使用DSP完成PCM(脉冲编码调制)话音到分组话音的双向转换,一个用户的话音通过DSP的后转换为数据包在分组网络上传输,数据包到达对端后,再由对方的DSP转换为话音,反之亦然。
当用户使用IP网络提供的多媒体通讯业务时,由于IP网络不如电路交换网络确定和可靠,因此会遇到以下问题:
当收到来自于网络的无效数据包的时候,由于端口符合要求,这个数据包也会被打入到DSP中,影响DSP的正常工作,导致语音质量下降或DSP异常。
数据包的来源可能来自网络错误,例如IP或UDP端口错误。
也可能来自恶意的网络攻击,这些包可能由于端口符合要求,也会被打入到DSP中,引起相同的问题。
在私网环境下,由于要维系NAT的内部映射,设备需要定期发送媒体报文,这个报文对于接收方的DSP通道来说,是一种干扰,也会引起相同问题。
原因在于:DSP在同一个时间内只能支持一个语音流,除这个语音流外的所有报文,都会对DSP产生不利的效果,轻则引入延迟和抖动,影响话音质量,重则引起DSP芯片内部的软件异常。
中国专利申请(03125107)公开了一种用RTP数据包的序号进行排序以消除其抖动延时的方法;该专利采用缓冲存储队列从IP网络中接收RTP数据包,数据入队时根据数据包序号确定其在缓冲队列中的存储地址并将该数据包存入其存储地址,同时启动对应的计数器;数据出队时,将缓冲队列中各个存有数据包的存储地址对应的计数器分别加1,再检查缓冲队列中当前存储的所有数据包中,是否有一个数据包满足输出条件:timer(i)+seq(i)=min_seq+n,如果有则再检查最小数据包序号所对应的存储地址中是否有数据包,有则将其中的数据包输出到下一接口,并将其所在存储地址对应的计数器清零。该方法是利用序列号去抖动,不能无效杂包,如果出现无效报文,也被输入到DSP里了。
中国专利申请(03125108)公开了一种用RTP数据包的时戳进行排序以消除其抖动延时的方法。该方法采用缓冲存储队列接收RTP数据包,数据入队时先将第一个正常达到的数据包存入缓冲队列的起始地址,并以其时戳作为基准时戳;对于之后收到的每一个数据包,根据其时戳确定其在缓冲队列中的存储地址,并将其存入相应地址。数据出队时,在缓存预定时间后,以基准时戳作为发送时戳,将对应的第一个正常达到的数据包输出到下一接口;然后以发送时戳加上时戳间隔之和作为新的发送时戳,再检查新发送时戳所对应的存储地址中是否有数据包,有则将其中的数据包输出到下一接口。该方法是利用时间戳去抖动,不能过滤无效包。如果出现无效报文,也被输入到DSP里了。
发明内容
本发明所要解决的技术问题在于提供一种保护VOIP DSP通道的方法,以克服VOIP DSP芯片收包处理中的缺陷,解决话音通道收到无效数据时音质下降和发生异常的问题,从而提高DSP通道工作的可靠性,使VOIP设备具备很强的鲁棒性和抗干扰能力。
为了实现上述目的,本发明提供了一种保护VOIP数字信号处理通道的方法,其中,通过设置多个到所述数字信号处理通道的缓冲存储报文队列,并根据到来的实时传输协议报文序列号和/或时间戳的连续性,过滤所述报文中的无效报文,并将所述过滤后的报文输入到所述数字信号处理通道。
所述的方法,其中,包括如下步骤:
步骤一,设置多个到数字信号处理通道的缓冲存储报文队列,所述队列至少包括正常队列和保护队列;
步骤二,抽取新到来的实时传输协议报文的序列号,根据前后报文序列号和/或时间戳的连续性,判断所述报文是否为可疑报文;如是,则将所述可疑报文存放在所述保护队列中;如否,则将所述报文放入正常队列中;
步骤三,根据后续新报文的序列号判断所述保护队列中的可疑报文是否为无效报文;如是,则丢弃所述可疑报文,清空所述保护队列;如否,则用所述保护队列替换正常队列。
所述的方法,其中,进一步包括将所述正常队列中的报文传给数字信号处理通道的步骤。
所述的方法,其中,进一步包括设置一变量v来记录当前的正常队列中的最后一个报文的序列号。
所述的方法,其中,进一步包括判断所述到来的报文是否为通道打开后的第一个报文,如是,则将所述变量v的初值赋值为所述第一个报文的序列号。
所述的方法,其中,进一步包括当所述新报文被存入正常队列时,不断更新变量v的步骤。
所述的方法,其中,所述步骤二进一步包括:
步骤二一,设定门限值A、B;
步骤二二,判断所述新到来的报文的序列号M与所述变量v当前取值相减的绝对值是否小于所述门限值A,如否,则所述报文为可疑报文,如是,则进一步判断所述序列号为M的新报文的时间戳和所述序列号为v当前取值的旧报文的时间戳是否小于所述门限值B;如是,则所述新报文不是可疑报文,将所述序列号为M的新报文列入正常队列,并更新所述变量v的取值为M,如否,则所述报文为可疑报文。
所述的方法,其中,所述步骤三进一步包括:
步骤三一,设定一门限值C;
步骤三二,记录后续新报文的序列号L;
步骤三三,判断所述L与所述变量v的值相减的绝对值是否小于所述A,如是,则所述存放在保护队列中的报文为无效报文,且所述序列号为L的新报文为有效报文被存入正常队列,更新所述变量v的取值为L;如否,则进一步判断所述L与所述保护队列中最后一个报文的序列号相减的绝对值是否小于所述门限值C;如是,则所述新接收的序列号为L的后续报文也为可疑报文,并将其存放于所述保护队列中,如否,则所述存放在保护队列中的报文为无效报文,清空所述保护队列,并将所述序列号为L的报文作为可疑报文存入保护队列中。
所述的方法,其中,所述步骤三三进一步包括:
步骤三三一,设定一保护队列报文数的门限值D;
步骤三三二,判断存放于所述保护队列中的报文数是否大于或等于所述门限值D,如是,则清空原有的正常队列,用保护队列替换原有的正常队列形成新的正常队列,并进一步更新所述变量v的值为所述新的正常队列中最后一个报文的序列号;如否,则所述v值不变,继续抽取新报文的序列号并转入步骤二二。
所述的方法,其中,所述步骤三三二进一步包括当所述保护队列中的报文数大于或等于所述门限值D时,将所述原有的正常队列作为新的保护队列的步骤。
本发明解决了现有技术中VOIP DSP收包处理中的缺陷,避免了收到无效数据时音质下降和异常问题。当收到的报文是正常的情况下,不影响原来的报文处理流程,不会引入丢包,抖动,和延迟。当收到的报文中有无效报文时,可以过滤掉这些无效报文,避免异常,改善音质,同时不会引入新的丢包,抖动,和延迟。当进行媒体/呼叫切换的时候,会在切换时引入几十毫秒的延迟,可以忽略不计,但是可以避免异常,同时音质得到改善。
本方法可以适用于所有使用RTP作为媒体传输协议的通讯***。不需要现有的呼叫控制协议做修改。
以下结合附图和具体实施例对本发明进行详细描述,但不作为对本发明的限定。
具体实施方式
正常的RTP报文是连续的,偶尔因为乱序和丢包,在一个小范围内部波动,当发生媒体切换(是指正常的话音RTP流的切换)的时候,序列号发生跳变,但是后续的报文应该又是连续的。根据这些特点,可以暂时把可疑的报文临时放在保护队列里,如果后续的报文证明可疑报文是无效报文,则清空临时队列;如果后续的报文证明可疑报文确实是有效报文,则用保护队列替换正常队列,并把数据传给DSP。原来的正常队列作为新的保护队列。本发明的方法可以通过判断报文序列号的连续性或时间戳的连续性,也可以组合使用,通过同时判断序列号和时间戳的连续性来实现。
图1示出了本发明方法的处理流程图,发明所述的方法如下:
1)每个DSP通道分配若干个缓冲存储报文队列,包括正常队列和保护队列。再分配变量来记录进入当前的正常队列的最后一个报文的序列号,假定分配了一个名字为v的变量。
2)当DSP收到一个新RTP报文时(步骤101),判断这个报文是否为这个通道打开后的第一个报文(步骤102),如是,则把这个报文放到正常队列中,即当DSP收到第一个报文的时候,把这个报文放到正常队列中,并用变量v记下这个报文的序列号,假定这个报文的序列号是N,则v=N(步骤103);
3)如否,则提取这个报文的序列号(假定等于M)(步骤104),判断是否M=v+1(步骤105),如果M=v+1,则认为这个RTP报文是一个完全正常而且连续的报文,把这个报文放到正常队列中,并用变量v记下新的序列号,即v=M(步骤106)。
4)判断如果M和v相减的绝对值不大,即M减v的绝对值小于一个门限值A(这个门限值是可以配置的,比如设置为10),而且序号为M、v的报文的时间戳相减的绝对值小于一个门限值B(这个门限值也是可以配置的,比如设置为100毫秒)(步骤107),则认为这个报文尚属正常,可能是由于低层是不可靠传输,发生了乱序或者丢包。把这个报文放到正常队列。用变量v记下新的序列号,即v=M(步骤108)。
5)如果M和v相减的绝对值比较大(即M减v的绝对值大于或等于门限值A),或者序号为M、v的报文的时间戳相减的绝对值大于或等于门限值B,认为这个报文可疑,把这个报文放到保护队列。变量v的值不变化。等待后续的报文决定下一步处理,(步骤109)。
6)当收到后续的RTP报文的时候,提取这个报文的序列号(假定等于L)(步骤110),判断L和变量v相比差别是否不大(即L减v的绝对值小于门限值A)(步骤111),如是,则认为保护队列里面被怀疑的包是无效包,清空保护队列,把序列号为L的报文放到正常队列里面,用变量v记下新的序列号,即v=L(步骤112)。
7)如果L和变量v相比差别大,即L减v的绝对值大于门限值A,则进一步判断序列号为L的报文和保护队列里面的报文相比是否连续,即L减保护队列里面的最后报文的序列号的绝对值是否小于门限值C(步骤113),如否,即新报文与保护队列中的报文相比比较不连续,则认为不但上一个被怀疑的包是无效包,而且新收到的报文也是可疑的,先清空保护队列,再把新收到的序列号为L的报文放到保护队列里(步骤114)。注意门限值C和门限值A可以不相等是单独配置的,比如门限值C可配置为5。
8)如果L和变量v相比差别较大(即L减v的绝对值大于门限值A),但是和保护队列里面的报文相比是比较连续的(L减去保护队列的最后一个报文的序列号的绝对值小于门限值C),把这个序号为L的报文放入保护队列(步骤115)。检查保护队列里面报文的个数,判断是否小于门限值D(步骤116)如果个数小于门限值D(这个门限值也是可以配置的,例如配置为3),则变量v的值不变化,等待下一个报文(步骤118),并回到步骤110,等待后续的报文决定下一步处理。直到保护队列里面报文的个数大于或者等于门限值D,则进入步骤117。
9)这时认为保护队列里面现有的被怀疑的包都是有效包,用保护队列替换原来的正常队列作为新的正常队列,同时清空原来的正常队列,作为新的保护队列来使用。用变量v记下收到的最后一个报文序号的序列号(假定序列号为X),即v=X(步骤117)。
其中,在上面的步骤中门限值A,B,C都是可以配置的。另外,保护队列收到多少个连续的RTP报文的时候升级为正常队列也是可以配置的,也就是说门限值D也是可以配置的。门限值D的数值越大,误切换的可能性越小,但是切换延迟也越大。工程中,可以通过灵活配置这些门限值找到一个最优值,使话音质量,切换延迟,设备鲁棒性等综合性能最优。
举一个应用实例,其它的应用是类似的。其中,图2为应用本发明的方法前RTP报文进入DSP的次序图。图3为应用本发明的方法后RTP报文进入DSP的次序图。
这里以分配了两个队列为例,一个作为正常队列,一个作为保护队列。在这个例子中门限A配置为10,门限B配置为100ms,门限C配置为5,门限D配置为2。
第一步,收到序号为1的包放在正常队列(图3中所示的最初的正常队列31)里面,等待DSP驱动程序把报文输入到DSP中。记录当前序号=1。
第二步,收到序号为2的包放在正常队列里面,等待DSP驱动程序把报文输入到DSP中。记录当前序号=2。
第三步,收到序号为4的包,包的序号虽然不连续,但是相差不大(小于门限A),这时候检查时间戳,发现时间戳也是相差不大(小于门限B),则放在正常队列里面,等待DSP驱动程序把报文输入到DSP中。记录当前序号=4。
第四步,收到序号为1000的包,包的序号完全不连续(大于门限A),说明这个包可疑,由于目前不能够确定这个报文是无效报文还是发生了媒体切换,所以把这个报文放到保护队列,图3中所示的最初的保护队列33。
第五步,收到序号为5的包,包的序号和正常队列的当前序号连续,这时候可以确定保护队列中被怀疑的包是无效包,清空保护队列中的1000号包,把序号为5的包则放在正常队列里面,等待DSP驱动程序把报文输入到DSP中。记录当前序号=5。
第六步,收到序号为6的包放在正常队列里面,等待DSP驱动程序把报文输入到DSP中。记录当前序号=6。
第七步,收到序号为1001的包,包的序号完全不连续(大于门限A),说明这个包可疑,由于目前不能够确定这个报文是无效报文还是发生了媒体切换,所以把这个报文放到保护队列。
第八步,收到序号为1002的包,包的序号和正常队列的当前序号不连续,但是和保护队列里面的1001报文相比是连续(小于门限C),先把这个报文放到保护队列里面,再检查保护队列里面的报文的数量是否达到门限D,由于现在门限D配置为2,所以已经达到门限了,这时候可以确定发生了媒体切换,把保护队列标记为正常队列,为图3中所示的切换后的正常队列32,同时清空原来的正常队列,标记为保护队列来使用。等待DSP驱动程序把1001、1002号报文输入到DSP中。记录当前序号=1002。
第九步,收到序号为1003的包放在正常队列里面,等待DSP驱动程序把报文输入到DSP中。记录当前序号=1003。
第十步,收到序号为10的包,包的序号不连续(大于门限A),说明这个包可疑,由于目前不能够确定这个报文是无效报文还是发生了媒体切换,所以把这个报文放到保护队列,图3中所示的切换后的保护队列34。
第十一步,收到序号为1005的包,包的序号和正常队列的当前序号很接近(小于门限A),这时候可以确定保护队列中被怀疑的包是无效包,清空保护队列中的10号包,把序号为1005的包则放在正常队列里面,等待DSP驱动程序把报文输入到DSP中。记录当前序号=1005。
第十二步,收到序号为1006的包,放在正常队列里面,等待DSP驱动程序把报文输入到DSP中。记录当前序号=1006。
第十三步,收到序号为1007的包,放在正常队列里面,等待DSP驱动程序把报文输入到DSP中。记录当前序号=1007。
第十四步,收到序号为2000的包,包的序号完全不连续(大于门限A),说明这个包可疑,由于目前不能够确定这个报文是无效报文还是发生了媒体切换,所以把这个报文放到保护队列。
第十五步,收到序号为3000的包,包的序号和正常队列不连续(大于门限A),和保护队列里面的包也不连续(大于门限C),说明这个两个包都可疑,不能够确定这个报文是无效报文还是发生了媒体切换,删除保护队列里面的2000号包,把序号为3000的包放到保护队列里面。
第十六步,收到序号为1008的包,包的序号和正常队列的当前序号连续,这时候可以确定保护队列中被怀疑的包是无效包,清空保护队列。把放1008号包在正常队列里面,等待DSP驱动程序把报文输入到DSP中。记录当前序号=1008。
第十七步,收到序号为1009的包,放在正常队列里面,等待DSP驱动程序把报文输入到DSP中。记录当前序号=1009。
经过这个过程,参考图2应用本方法前RTP报文进入DSP的次序图和附图3应用本方法后RTP报文进入DSP的次序图。图2采用的是现有技术的单队列方式,采用此方式,所有的报文直接进入DSP。图3采用双队列方式,分别设置正常队列和保护队列,只有正常队列里面的报文才进入DSP。前后对比可以看出,采用本发明的方法只有正常队列里的报文才进入DSP,原来带有很多干扰的RTP报文,经过处理后,变成一个很有规律的,很“干净”的语音RTP流输入到DSP里,起到对DSP的保护作用。
上面过程中对有效报文的判断条件可以灵活配置,例如:门限A,门限B,门限C,门限D。以上的条件可以适当组合,灵活修改。达到在工程上找到最优值的目的。
当然,本发明还可有其他多种实施例,在不背离本发明精神及其实质的情况下,熟悉本领域的技术人员当可根据本发明作出各种相应的改变和变形,但这些相应的改变和变形都应属于本发明所附的权利要求的保护范围。