为了使分组语音成为标准公共交换电话网(PSTN)电话服务的实际替代方案,接收的分组语音质量必须与基本电话服务的质量相当。这意味着始终保持高质量的语音传输。与其他实时应用一样,Packet Voice具有宽带宽且对延迟敏感。为了使语音传输对接收方来说是可理解的(不是波涛汹涌的),语音数据包不能被丢弃、过度延迟或遭受变化的延迟(也称为抖动)。 本文档介绍有助于解决语音不连续问题的各种服务质量(QoS)注意事项。语音问题不连续的主要原因是丢失和语音数据包延迟。
本文档的读者应了解以下内容:
分组语音(VoIP、帧中继语音(VoFR)或ATM语音(VoATM)的基本配置(根据其要求)。
基本了解语音优先级、分段、不同编解码器及其带宽要求。
本文档中的信息适用于所有思科语音网关软件和硬件版本。
本文档中的信息都是基于特定实验室环境中的设备创建的。本文档中使用的所有设备最初均采用原始(默认)配置。如果您是在真实网络上操作,请确保您在使用任何命令前已经了解其潜在影响。
有关文档规则的详细信息,请参阅 Cisco 技术提示规则。
语音质量波动是由网络中的语音数据包可变延迟或丢失引起的。当语音数据包延迟到达其目的地时,目的地网关会丢失实时信息。在这种情况下,目的网关必须预测丢失数据包的内容可能是什么。该预测导致所接收的语音不具有与所发送的语音相同的特性。这会产生听到的声音听起来很机械。如果语音数据包被延迟超过接收网关的预测能力,网关将实时间隙留空。由于接收端没有东西可以填补这个缺口,因此传输的部分语音会丢失。这会导致语音不稳。许多不稳定的语音问题可通过确保语音数据包不是非常延迟(并且不是可变延迟)来解决。 有时,语音活动检测(VAD)会向语音对话添加前端剪辑。这是导致语音不稳(或剪断)的另一个原因。
本文档中的各个部分介绍如何最大限度地减少语音不平稳的情况。大多数此类措施要求确保在语音网络中引入最小抖动。
在考虑应用任何措施以尽量减少抖动之前,请调配足够的网络带宽来支持实时语音流量。例如,80 kbps G.711 VoIP呼叫(64 kbps负载+ 16 kbps报头)在64 kbps链路上听起来很差,因为至少丢弃了16 kbps的数据包(即20%)。带宽要求因用于压缩的编解码器而异。不同的编解码器有不同的负载和报头要求。VAD的使用也影响带宽需求。如果使用实时协议(RTP)报头压缩(cRTP),可以进一步降低带宽要求。
例如,使用带cRTP的G.729编解码器(默认20字节负载)的语音呼叫所需的带宽如下:
语音负载+压缩(RTP报头+用户数据报协议(UDP)报头+ IP报头)+第2层报头
这相当于:
20字节+压缩(12字节+ 8字节+ 20字节)+ 4字节
这等于:
28个字节,因为报头压缩会将IP RTP报头最大缩减为4个字节。以8 kbps的编解码器速率(每秒50个数据包)获得11.2 kbps。
有关详细信息,请参阅 IP 语音 - 每个呼叫的带宽占用量.
确定语音优先顺序有两个重要组成部分。第一步是对感兴趣的语音流量进行分类和标记。第二个是优先处理标记的有趣语音流量。此处两个小节讨论语音分类、标记和优先排序的各种方法。
为了保证VoIP数据包的带宽,网络设备必须能够识别流经其的所有IP流量中的数据包。网络设备使用IP报头中的源IP地址和目的IP地址,或UDP报头中的源UDP端口号和目的UDP端口号来识别VoIP数据包。这种识别和分组过程称为分类。它是提供任何QoS的基础。
数据包分类可能占用大量处理器。因此,分类需要在尽可能靠近网络边缘的地方进行。因为每一跳仍需要确定数据包应该接受的处理,所以您需要在网络核心中采用一种更简单、更有效的分类方法。通过在IP报头中标记或设置服务类型(ToS)字节来实现这种更简单的分类。ToS字节的三个最高有效位称为IP优先级位。大多数应用和供应商目前都支持设置和识别这三个位。标记不断发展,以便可以使用ToS字节的六个最高有效位,即差分服务代码点(DSCP)。请参阅请求注解(RFC)。
差分服务(DiffServ)是一种新的模式,在该模式下,流量由基于ToS字段具有相对优先级的中间系统处理。DiffServ 标准在 RFC 2474 和 RFC 791 中有所定义,它取代了 RFC 791 中介绍的用于定义数据包优先级的原规范。DiffServ 通过重新分配优先级标记 IP 数据包的位,增加了可定义的优先级别数量。DiffServ体系结构定义了DiffServ字段。它替代IP V4中的ToS字节,以制定有关数据包分类和流量调节功能(如计量、标记、整形和管制)的每跳行为(PHB)决策。除了前面提到的RFC外,RFC 2597还定义了保证转发(AF)类
。这是DSCP字段的细分。有关 DSCP 的详细信息,请参阅通过 DSCP 实施服务质量策略。
ToS字节 — P2 P1 P0 T3 T2 T1 T0 CU
IP 优先级:三位(P2-P0),ToS:四位(T3-T0),CU:1位
DiffServ字段 — DS5 DS4 DS3 DS2 DS1 DS0 ECN ECN
DSCP:六位(DS5-DS0),ECN:两位
XXX00000位0、1、2(DS5、DS4、DS3)是优先位,其中:
111 =网络控制=优先级7
110 =网际网络控制=优先级6
101 =批评家/ECP =优先级5
100 =闪存覆盖=优先级4
011 =闪存=优先级3
010 =立即=优先级2
001 =优先级1
000 =例程=优先级0
000XXX00位3,4,5 (DS2、DS-1,DS-0) 是延迟、吞吐量和可靠性位。
位3 =延迟[D](0 =正常;1 =低)
位4 =吞吐量[T](0 =正常;1 =高)
位5 =可靠性[R](0 =正常;1 =高)
000000XX位6、7:ECN
这两个部分讨论分类和标记的两个方式。
使用Cisco VoIP网关,您通常使用语音拨号对等体对VoIP数据包进行分类并标记IP优先级位。此配置显示如何标记IP优先级位:
dial-peer voice 100 voip destination-pattern 100 session target ipv4:10.10.10.2 ip precedence 5
在上面的示例中,任何与dial-peer voice 100 voip命令匹配的VoIP呼叫都使用IP Precedence 5设置了其所有语音负载数据包。这意味着IP ToS字节的三个最高有效位设置为101。
dial-peer voice 100 voip destination-pattern 100 session target ipv4:10.10.10.2 ip qos dscp ef media ip qos dscp af31 signaling
在上面的示例中,任何与dial-peer voice 100 voip命令匹配的VoIP呼叫都将其所有媒体负载数据包(语音数据包)设置为加速转发(EF)位模式101110。所有信令数据包都设置为AF位模式011010。
注:自Cisco IOS®软件版本12.2(2)T起,就支持ip qos dscp命令。Cisco IOS软件版本12.2T不再提供IP优先级。但是,ip qos dscp命令也实现了相同目的。IP优先级5(101)映射到IP DSCP 101000。有关详细信息,请参阅使用DSCP对QoS的VoIP信令和媒体进行分类。
推荐使用的分类和标记方法是模块化QoS CLI。这是基于模板的配置方法,将分类与策略分开。这允许同时为多个类配置多个QoS功能。使用class-map命令根据各种匹配条件对流量进行分类,并使用policy-map命令确定每个类需要发生的情况。通过发出service-policy命令将策略应用于接口上的传入或传出流量。此配置示例显示如何使用模块化QoS CLI对数据包进行分类和标记:
access-list 100 permit udp any any range 16384 32767 access-list 101 permit tcp any any eq 1720 ! class-map match-all voip match access-group 100 class-map match-all control match access-group 101 ! policy-map mqc class voip set ip precedence 5 class control set ip precedence 5 class class-default set ip precedence 0 ! interface Ethernet0/0 service-policy input mqc
在此配置示例中,任何与访问控制列表(ACL)100匹配的流量都分类为“class voip”,并使用IP Precedence 5进行设置。这意味着IP ToS字节的三个最高有效位设置为101。ACL 100与VoIP使用的常见UDP端口匹配。同样,ACL 101匹配H.323信令流量(传输控制协议(TCP)端口1720)。 所有其他流量都使用IP优先级0进行设置。该策略称为“mqc”。 应用于Ethernet 0/0上的传入流量。
当网络中的每一跳能够分类和识别VoIP数据包(通过端口/地址信息或通过ToS字节)后,这些跳将为每个VoIP数据包提供所需的QoS。此时,请配置特殊技术来提供优先级排队,以确保大型数据包不会干扰语音数据传输。在拥塞可能性较高的较慢的WAN链路上通常需要这种方法。将所有相关流量根据QoS要求放入QoS类别后,通过智能输出排队机制提供带宽保证和优先级服务。VoIP需要优先级队列。
注意: 使用任何有效为VoIP提供高优先级的排队机制。但是,建议使用低延迟队列(LLQ),因为它灵活且易于配置。
LLQ使用模块化QoS CLI配置方法为某些类提供优先级,并为其他类提供保证的最小带宽。在拥塞期间,优先级队列按配置的速率进行管制,以便优先级流量不会用尽所有可用带宽。(如果优先级流量独占带宽,则会阻止满足其他类的带宽保证。) 如果正确调配LLQ,则进入优先级队列的流量绝不能超过配置的速率。
LLQ还允许指定队列深度,以确定在任何特定类队列中有太多等待的数据包时,路由器何时需要丢弃数据包。此外,还使用class-default命令来确定对未按配置的类分类的所有流量的处理。class-default使用fair-queue命令进行配置。这意味着每个未分类的流都会获得大约相等份额的剩余带宽。
本示例展示如何配置LLQ。有关详细信息,请参阅低延迟队列:
access-list 100 permit udp any any range 16384 32000 access-list 101 permit tcp any any eq 1720 access-list 102 permit tcp any any eq 80 access-list 103 permit tcp any any eq 23 ! class-map match-all voip match access-group 100 class-map match-all voip-control natch access-group 101 class-map match-all data1 match access-group 102 class-map match-all data2 match access-group 103 ! policy-map llq class voip priority 32 class voip-control bandwidth 8 class data1 bandwidth 64 class data2 bandwidth 32 class class-default fair-queue ! interface Serial1/0 bandwidth 256 service-policy output llq
在本示例中,任何与ACL 100匹配的流量都分类为“class voip”(表示语音流量)。 它被赋予高达32 kbps的高优先级。ACL 100与VoIP使用的常见UDP端口匹配。Access-list 101匹配H.323信令流量(TCP端口1720)。 Class data1匹配Web流量(TCP端口80,如访问列表102所示)并保证64 kbps。Class data2匹配Telnet流量(如ACL 103中所示的TCP端口23),并保证32 kbps。默认类配置为向未分类流量提供相等份额的剩余带宽。该策略称为“llq”。 它应用于总带宽为256 kbps的Serial1/0上的传出流量。
注意:默认情况下,所有类别的总保证带宽和优先级带宽需要小于接口带宽的75%。通过发出max-reserved bandwidth interface命令修改此百分比。
此表比较了不同的软件排队机制及其各自的优点和限制。
软件排队机制 | 描述 | 好处 | 限制 |
---|---|---|---|
先进先出(FIFO) | 数据包到达和离开队列时顺序完全相同。 | 配置简单,操作快速。 | 无法提供优先级服务或带宽保证。1 |
加权公平队列(WFQ) | 一种散列算法,流入单独的队列,使用权重确定一次处理多少数据包。您可以通过设置IP优先级和DSCP值来定义权重。 | 配置简单。链路的默认值小于2 Mbps。 | 无法提供优先级服务或带宽保证。1 |
自定义队列(CQ) | 流量被分为多个队列和可配置队列限制的队列。队列限制根据平均数据包大小、最大传输单位(MTU)以及要分配的带宽百分比来计算。每个队列的队列限制(以字节数为单位)已出列。因此,它会以统计方式提供分配的带宽。 | 已经存在几年了。它允许为不同队列分配近似带宽。 | 不能优先提供服务。带宽保证是近似的。队列数量有限。配置相对困难。1 |
优先级队列(PQ) | 流量分为高、中、普通和低优先级队列。首先为高优先级流量提供服务,然后为中优先级、普通优先级和低优先级流量提供服务。 | 已经存在几年了。它提供优先服务。 | 优先级较高的流量会耗尽优先级较低的队列带宽。不能保证带宽。2 |
基于类的加权公平队列(CBWFQ) | 模块化QoS CLI用于对流量进行分类。将分类流量放入预留带宽队列或默认未预留队列。调度程序根据权重为队列提供服务,从而保证带宽。 | 类似于LLQ,不同之处在于没有优先级队列。配置简单,能够提供带宽保证。 | 不能优先提供服务。3 |
优先级队列加权公平队列(PQ-WFQ),也称为IP RTP优先级 | 单个接口命令用于向发往指定范围内的偶数个端口号的所有UDP数据包提供优先级服务。 | 简单的一命令配置。为RTP数据包提供优先级服务。 | 所有其他流量使用WFQ处理。实时会议协议(RTCP)流量未排定优先级。没有保证的带宽能力。4 |
LLQ,以前称为优先级队列基于类的加权公平队列(PQCBWFQ) | 带优先级队列的模块化QoS CLI用于对流量进行分类。将分类流量放入优先级队列、预留带宽队列或默认未预留队列。调度程序根据权重为队列提供服务,以便首先发送优先级流量(在拥塞期间达到某个管制限制),并满足带宽保证。 | 配置简单。能够为多类流量提供优先级,并为优先级带宽利用率提供上限。您还可以配置带宽保证类和默认类。 | 尚无提供多个优先级级别的机制,所有优先级流量都通过同一优先级队列发送。在拥塞期间,不同的优先级类别可以有不同的优先级上限带宽界限。但是,应用程序之间共享优先级队列可能会引起抖动。4 |
不适合语音。
需要保证语音带宽。
需要处理延迟。
足够发声。
即使队列以最佳状态工作并优先处理语音流量,也有时优先级队列是空的,并且来自另一类的数据包正在处理中。必须根据已配置的权重为来自保证带宽类的数据包提供服务。如果优先语音数据包在服务这些数据包时到达输出队列,则语音数据包可以在发送之前等待很长时间。当语音数据包必须等待较大的数据包时,它们会经历序列化延迟。
序列化延迟可能为语音数据包引入最糟糕的抖动形式。如果语音数据包必须在速度较慢的链路上等待多达1500字节的数据包,则这会导致巨大的延迟。如果数据包为80字节,则序列化延迟会截然不同,如下例所示:
由于1500字节的数据包= 1500*8/64000 = 187.5毫秒,所以64 kbps链路上的串行延迟。
由于80字节数据包= 80*8/64000 = 10毫秒,导致64 kbps链路上的串行延迟。
因此,如果语音数据包在64 kbps链路上被一个1500字节的数据包堵住,则可能必须等待最多187.5毫秒才能发送。另一方面,另一个语音数据包只需要在目标网关等待10毫秒。这会导致由于数据包间延迟的差异而产生的巨大抖动。在始发网关上,通常每20毫秒发送一次语音数据包。如果端到端延迟预算为150毫秒,并且要求严格的抖动,则超过180毫秒的间隔是无法接受的。
引入分段机制,确保一个传输单元的大小小于10毫秒。序列化延迟超过10毫秒的任何数据包都需要分成10毫秒的数据块。10 ms chunk或fragment是链路上在10 ms内发送的字节数。使用链路速度计算大小,如下例所示:
分段大小=(0.01秒* 64,000 bps)/(8位/字节)= 80字节
通过64 kbps链路发送80字节数据包或分段需要10毫秒。
如果单个物理接口上有多个ATM或帧中继永久虚电路(PVC),请根据可用带宽最低的PVC配置分段值(在所有PVC上)。例如,如果三条PVC的保证带宽为512 kbps、128 kbps和256 kbps,则全部三条PVC的片段大小均为160字节(最低速度为128 kbps,需要160字节的片段大小)。 建议使用以下值来表示不同的链路速度:
Link Speed (kbps) Fragmentation Size (bytes) 56 70 64 80 128 160 256 320 512 640 768 960 1024 1280 1536 1920
注意:如果分段大小大于链路MTU大小,则无需分段。例如,对于具有1500字节MTU的T1链路,分段大小为1920字节。因此,不需要分段。数据包分段大小不得低于VoIP数据包大小。请勿对VoIP数据包进行分段。对这些数据包进行分段会导致许多呼叫建立和质量问题。
目前有三种链路分段和交织机制可用。有关数据包网络中引入的各种延迟的进一步说明,请参阅了解数据包语音网络中的延迟。下表列出了它们的优点和限制:
链路分段和交织(LFI)机制 | 描述 | 好处 | 限制 |
---|---|---|---|
使用WFQ的MTU分段 | 用于更改MTU大小或IP MTU大小的接口级别命令。用于将大型IP数据包分段为指定的MTU大小。LFI使用WFQ在分段之间插入实时数据包。 | 配置简单。 | 片断仅由接收应用程序重组。因此,网络的使用效率低下。只有未设置Do not Fragment(DF)位的IP数据包才能很好地处理分段。占用大量处理器。不推荐. |
多链路点对点协议(MLPPP)LFI | 在点对点串行链路上,必须先配置MLPPP,然后必须以ms为单位设置分段大小。在多链路接口上还必须启用交织。 | 数据包在链路的一端分段,在另一端重组。可将多个链路组合为大型虚拟管道。 | 仅适用于配置为PPP的链路。Cisco IOS软件版本12.1(5)T或更高版本也支持帧中继上的PPP或ATM上的PPP解决方案。 |
帧中继分片 (FRF.12) | 在帧中继PVC上,必须启用frame-relay traffic-shaping命令并在map-class下设置分段大小。 | 数据包在PVC的一端分段,在另一端重组。 | 仅在启用frame-relay traffic-shaping命令的帧中继PVC上可用。 |
正常的语音会话包括几个静默时刻。典型的语音会话包括40%到50%的静音。由于语音呼叫的40%没有语音通过网络,因此部署VAD可以节省一些带宽。使用VAD时,网关会查找语音间隙。它用舒适噪音(背景噪音)替换这些间隙。 因此,节省了带宽量。不过,这其中也存在取舍。编解码器检测到语音活动之前经过很短的时间(以毫秒为单位),之后是静默期。此小时间导致接收语音的前端剪切。为了避免在非常短的暂停期间激活,并补偿剪辑,VAD在语音停止后大约等待200毫秒后停止传输。在重新开始传输时,它包含前5毫秒的语音和当前的语音。如果环境噪声阻止呼叫区分语音和背景噪声,则VAD会自动禁用呼叫自身。但是,如果带宽不是问题,请关闭VAD。
有两个参数决定VAD的功能。以下是music-threshold和voice vad-time命令。
音乐阈值
确定初始阈值,该阈值控制VAD何时需要变为活动状态。这可以通过在语音端口上定义music-threshold threshold_value命令进行控制,如本示例所示。其范围为–70分贝每毫瓦(dBm)至–30 dBm。此设置的默认值为–38 dBm。配置较低的值(接近–70 dBm)会导致VAD在更低的信号强度下激活(音量在被视为静音之前必须下降非常低)。 配置更高的值(接近–30 dBm)会导致VAD变得活跃,即使语音信号强度下降很小。它更频繁地驱动播放以播放舒适噪声数据包。但是,这有时会导致音频的轻微剪辑。
3640-6#configure terminal Enter configuration commands, one per line. End with CNTL/Z. 3640-6(config)#voice-port 3/0/0 3640-6(config-voiceport)#music-threshold ? WORD Enter a number b/w (-70 to -30) 3640-6(config-voiceport)#music-threshold -50 3640-6(config-voiceport)#end 3640-6# 3640-6#show run | be voice-portvoice-port 3/0/0 music-threshold -50
voice vad-time
一旦VAD变为活动状态,背景噪音和舒适噪音的组成部分就通过在全局配置下配置voice vad-time timer_value命令进行控制,如本示例所示。这是静默检测和抑制语音数据包传输的延迟时间(以毫秒为单位)。保持时间的默认值为250毫秒。这意味着在250毫秒内,舒适噪声开始出现。此计时器的范围为250毫秒至65536毫秒。如果为此配置了高值,则舒适噪声会在稍后出现(背景噪声继续播放)。 如果将其配置为65536毫秒,则舒适噪声将关闭。此计时器的值越高,背景噪音和舒适噪音之间的过渡就越平滑。将voice vad-time命令配置为较高级别的缺点是,它无法实现所需的30%到35%的带宽节省。
3640-6# 3640-6# 3640-6#configure terminal Enter configuration commands, one per line. End with CNTL/Z. 3640-6(config)#voice vad-time ? <250-65536> milliseconds 3640-6(config)#voice vad-time 750 3640-6(config)#end 3640-6# 3640-6# 3640-6# 3640-6#show run | be vad-time voice vad-time 750
设置VoIP呼叫的典型场景是通过帧中继链路或PPP链路。以下是这些方案的配置示例。
在本例中(仅包含配置的相关部分),假设帧中继电路速度为256 kbps。PVC 100和PVC 200上的保证承诺信息速率(CIR)分别为64 kbps和192 kbps。PVC 100用于传输数据和语音。PVC 200仅用于传输数据。在任何指定时间最多同时存在四个语音呼叫。根据最低带宽语音PVC(承载语音的PVC)的CIR在两条PVC上配置分段。 根据本文档中的示例,这意味着分段大小是根据PVC 100的CIR(即64 kbps)确定的。 如“序列化延迟”部分的表所示,对于64 kbps链路,需要80字节的分段大小。需要为PVC 200配置相同的分段大小。
有关配置帧中继VoIP的详细信息,请参阅具有服务质量(分段、流量整形、LLQ/IP RTP优先级)的帧中继VoIP。
3660-1#show run Building configuration... ! class-map match-any voip match ip rtp 16384 16383 match ip dscp 26 46 class-map match-all voip-control match access-group 101 ! ! policy-map VoIPoFR class voip priority 48 class voip-control bandwidth 8 class class-default fair-queue ! voice call send-alert voice rtp send-recv ! ! interface Serial4/0:0 bandwidth 256 no ip address encapsulation frame-relay frame-relay traffic-shaping ! interface Serial4/0:0.1 point-to-point bandwidth 64 ip address 10.10.10.10 255.255.255.0 frame-relay ip rtp header-compression frame-relay interface-dlci 100 class voice ! interface Serial4/0:0.2 point-to-point bandwidth 192 ip address 20.20.20.20 255.255.255.0 frame-relay interface-dlci 200 class data ! map-class frame-relay data frame-relay fragment 80 frame-relay adaptive-shaping becn frame-relay cir 256000 frame-relay bc 32000 frame-relay be 0 frame-relay mincir 192000 frame-relay fair-queue ! map-class frame-relay voice frame-relay fragment 80 no frame-relay adaptive-shaping frame-relay cir 64000 frame-relay bc 640 frame-relay be 0 frame-relay mincir 64000 service-policy output VoIPoFR ! ! access-list 101 permit tcp any any eq 1720 ! ! voice-port 3/1/0 ! voice-port 3/1/1 ! ! dial-peer voice 10 voip incoming called-number . destination-pattern 1408....... session target ipv4:10.10.10.11 dtmf-relay h245-signal h245-alphanumeric no vad ! dial-peer voice 20 pots destination-pattern 1234 port 3/1/0 ! dial-peer voice 21 pots destination-pattern 5678 port 3/1/1
在本示例中(仅包含配置的相关部分),假设需要为点对点部分T1控制器(具有12个信道)配置QoS。在任何指定时间最多同时存在四个语音呼叫。配置任务包括使用PPP封装配置此串行接口,使其成为多链路组的一部分,创建多链路接口(属于同一多链路组),以及配置多链路接口上的所有QoS。有关配置基于PPP的VoIP的详细信息,请参阅具有服务质量(LLQ/IP RTP优先级、LFI、cRTP)的PPP链路上的VoIP。
3660-1#show run Building configuration... ! class-map match-any voip match ip rtp 16384 16383 match ip dscp 26 46 class-map match-all voip-control match access-group 101 ! ! policy-map VoIPoPPP class voip priority 48 class voip-control bandwidth 8 class class-default fair-queue ! voice call send-alert voice rtp send-recv ! ! interface Multilink7 bandwidth 768 ip address 10.10.10.10 255.255.255.0 ip tcp header-compression iphc-format service-policy output VoIPoPPP no cdp enable ppp multilink ppp multilink fragment-delay 10 ppp multilink interleave multilink-group 7 ip rtp header-compression iphc-format ! ! interface Serial4/0:0 bandwidth 768 no ip address encapsulation ppp no fair-queue ppp multilink multilink-group 7 ! ! access-list 101 permit tcp any any eq 1720 ! voice-port 3/1/0 ! voice-port 3/1/1 ! ! dial-peer voice 10 voip incoming called-number . destination-pattern 1408....... session target ipv4:10.10.10.11 dtmf-relay h245-signal h245-alphanumeric no vad ! dial-peer voice 20 pots destination-pattern 1234 port 3/1/0 ! dial-peer voice 21 pots destination-pattern 5678 port 3/1/1 !
网络中始终存在一些不受控制的实体,这些实体会导致所接收的语音数据包中的进一步延迟和抖动。通过修改终端网关上的抖动缓冲区,可以解决语音网络中不受控制的抖动。
抖动缓冲区是时间缓冲区。它由终端网关提供,以使播放机制更加有效。以下是播放机制的功能图:
当播放控制收到语音数据包时,它会分析RTP时间戳。如果语音数据包被延迟超过抖动缓冲区的保持容量,则该数据包会被立即丢弃。如果数据包在缓冲能力内,则将其置于抖动缓冲区中。该数据包在抖动缓冲区中的位置取决于为该数据包计算的RTP时间戳。如果没有可用的语音数据包,播放控制会尝试隐藏该数据包(预测丢失的数据包)。 如果启用VAD,则会播放舒适噪音。
播放控制的责任是处理丢失的数据包、重复的数据包、损坏的数据包和乱序数据包的事件。这些事件可通过时间对齐抖动语音数据包、播放舒适噪音(如果配置了VAD)或甚至重新生成要向主机播放的双音多频(DTMF)音来处理。
通过预测隐藏或者通过静默隐藏来实现语音数据包的隐藏。预测隐藏基于上一个数据包和下一个数据包(如果可用)。 它在低比特率编解码器(5 kbps到16 kbps)下运行效果最佳。 高比特率编解码器(32 kbps至64 kbps)的语音数据包丢失可能会导致预测隐藏性能差。当存在低延迟和不频繁的延迟或较少的数据包丢失时,开始预测隐藏。过多的预测隐藏可能导致机器人语音质量。静默隐藏是最糟糕的预测隐藏形式。当没有信息可供预测时,它就会发挥作用。它只是一种背景遮蔽。当存在高延迟和更多数据包丢失时,就会开始此过程。过多的沉默掩盖会导致语音质量不稳定。预测隐藏在30毫秒内是良好的,之后静默隐藏开始发挥作用。
抖动缓冲器被高水位标记和低水位标记所限制。高水位是数据包预期到达以实现按时播放的上限。到达高水位标记之后的数据包被标记为延迟数据包或丢失数据包。低水位是数据包预期到达以实现按时播放的最小时间。到达低水位线之前的数据包被视为早期数据包(仍然可以按时播放)。
如果终端网关继续看到延迟数据包的到达增加,则会增加高水位线。在呼叫过程中,高位标记的值保持不变。此值增加到配置中定义的最大值。终端网关以类似的方式观察接收到的早期数据包的数量。如果这些数据包开始频繁使用网关,则降低低水位标记。此值在呼叫期间保持不变。抖动缓冲区的这种模式称为“自适应模式”,其中终端网关根据流量模式调整其抖动缓冲区。另一种模式是“固定模式”。 在固定模式中,低水位标记和高水位标记有一个初始值。此值基于估计的接收延迟(请参阅本文档的show voice call <port-number>部分)。
有关抖动缓冲区的更多详细信息,请参阅了解数据包语音网络(Cisco IOS平台)中的抖动。
本节介绍如何识别网络中的抖动。
show call active voice brief命令提供有关正在进行的会话的大量信息。此输出显示从以下命令了解的一些要点:
11E4 : 2170927hs.1 +600 pid:10 Answer 1000 active dur 00:08:43 tx:26157/522967 rx:7044/139565 Tele 3/0/0:9: tx:151310/755/0ms g729r8 noise:-62 acom:0 i/0:-56/-48 dBm 11E4 : 2171198hs.1 +329 pid:20 Originate 2000 active dur 00:08:43 tx:7044/139565 rx:26165/523127 IP 30.30.30.29:18682 rtt:51ms pl:148590/290ms lost:0/0/15 delay:65/60/132ms g729r8
从show call active voice brief命令输出中,您可以看到在电话支路(rx:7044)上收到的内容将传输到IP支路(tx:7044)。 转发到电话分支(26157)的IP分支(26165)上收到的数据包也是如此。 IP分支上接收的数据包数与电话分支上传输的数据包数之间的差异会导致延迟数据包无法及时到达。
show call active voice命令(不带“brief”关键字)的此输出指向直接标识抖动的参数的更多详细信息。
GapFillWithSilence=850 ms GapFillWithPrediction=9230 ms GapFillWithInterpolation=0 ms GapFillWithRedundancy=0 ms
show voice call port-number命令提供有用的信息。确保在网关中进行控制台连接,或者如果通过远程登录到网关,请确保在执行级别发出terminal monitor命令。
注意:此命令在AS5x00/AS5x50平台上不可用。
在此输出中,Rx Delay Est(ms)的值是71。这是当前抖动缓冲区值。在该图上推导出了高水位线和低水位线的值。高水位线的平均初始值为70毫秒,而低水位线的平均初始值为60毫秒。设置初始值后,网关会跟踪收到的任何早期数据包或延迟数据包。如输出所示,预测隐藏丢弃接近250 ms,而静默隐藏为30 ms。由于静默隐藏只是预测隐藏的较差情况,因此预测隐藏总是有较高的值。对于每个预测隐藏丢弃,缓冲区溢出丢弃将会增加。
如果看到缓冲丢弃,则不一定意味着您看到高水位线增加。高水位标记是抖动缓冲区的上限。它仅在观察到趋势时才更改。换句话说,延迟数据包应持续流动。这会增加抖动缓冲区。在此处的输出中,存在这种趋势。因此,高水位线将从70毫秒增加到161毫秒。如果此值未更改(并且您仍然看到14个延迟数据包),则表示这些数据包是间歇性延迟数据包,未形成趋势。
从show call active voice命令的输出中查找丢失的数据包。对于每个丢失的数据包,您会看到两个数据包顺序混乱。在Rx Non-Seq Pkts输出中可看到此消息。由于它不是正值,因此可以断定也没有任何丢包。
3640-6# ***DSP VOICE TX STATISTICS*** Tx Vox/Fax Pkts: 195, Tx Sig Pkts: 0, Tx Comfort Pkts: 10 Tx Dur(ms): 192070, Tx Vox Dur(ms): 388, Tx Fax Dur(ms): 0 ***DSP VOICE RX STATISTICS*** Rx Vox/Fax Pkts: 9604, Rx Signal Pkts: 0, Rx Comfort Pkts: 0 Rx Dur(ms): 192070, Rx Vox Dur(ms): 191560, Rx Fax Dur(ms): 0 Rx Non-seq Pkts: 0, Rx Bad Hdr Pkts: 0 Rx Early Pkts: 0, Rx Late Pkts: 14 ***DSP VOICE VP_DELAY STATISTICS*** Clk Offset(ms): 0, Rx Delay Est(ms): 71 Rx Delay Lo Water Mark(ms): 60, Rx Delay Hi Water Mark(ms): 161 ***DSP VOICE VP_ERROR STATISTICS*** Predict Conceal(ms): 250, Interpolate Conceal(ms): 0 Silence Conceal(ms): 30, Retroact Mem Update(ms): 0 Buf Overflow Discard(ms): 500, Talkspurt Endpoint Detect Err: 0 ***DSP LEVELS*** TDM Bus Levels(dBm0): Rx -49.9 from PBX/Phone, Tx -41.7 to PBX/Phone TDM ACOM Levels(dBm0): +2.0, TDM ERL Level(dBm0): +11.1 TDM Bgd Levels(dBm0): -58.9, with activity being voice ***DSP VOICE ERROR STATISTICS*** Rx Pkt Drops(Invalid Header): 0, Tx Pkt Drops(HPI SAM Overflow): 0
观察Tx Comfort Pkts和Rx Comfort Pkts。从示例输出中得出结论,连接到此路由器的电话大多保持安静,因为您有许多Tx Comfort Pkts。同时,您没有Rx Comfort Pkts,这意味着另一端持续说话。
将此处的输出与之前的命令输出进行比较。Rx Late Pkts的数量增加(从14增加到26)。 但是,高水位标记值不会增加。这表示12个数据包偶尔会延迟。缓冲区溢出丢弃增加到910毫秒。然而,由于没有观察到趋势,高水位不会增加。
在此处的输出中,您有一个Rx Early包:3.这意味着数据包比预期提前了很长时间。从此处输出中可以看到,通过将低水位线从60降至51,抖动缓冲区已扩展以适应任何更早的数据包。
3640-6# ***DSP VOICE TX STATISTICS*** Tx Vox/Fax Pkts: 209, Tx Sig Pkts: 0, Tx Comfort Pkts: 11 Tx Dur(ms): 337420, Tx Vox Dur(ms): 416, Tx Fax Dur(ms): 0 ***DSP VOICE RX STATISTICS*** Rx Vox/Fax Pkts: 16843, Rx Signal Pkts: 0, Rx Comfort Pkts: 1 Rx Dur(ms): 337420, Rx Vox Dur(ms): 335920, Rx Fax Dur(ms): 0 Rx Non-seq Pkts: 0, Rx Bad Hdr Pkts: 0 Rx Early Pkts: 3, Rx Late Pkts: 26 ***DSP VOICE VP_DELAY STATISTICS*** Clk Offset(ms): 0, Rx Delay Est(ms): 72 Rx Delay Lo Water Mark(ms): 51, Rx Delay Hi Water Mark(ms): 161 ***DSP VOICE VP_ERROR STATISTICS*** Predict Conceal(ms): 510, Interpolate Conceal(ms): 0 Silence Conceal(ms): 70, Retroact Mem Update(ms): 0 Buf Overflow Discard(ms): 910, Talkspurt Endpoint Detect Err: 0 ***DSP LEVELS*** TDM Bus Levels(dBm0): Rx -51.5 from PBX/Phone, Tx -44.1 to PBX/Phone TDM ACOM Levels(dBm0): +2.0, TDM ERL Level(dBm0): +11.9 TDM Bgd Levels(dBm0): -61.3, with activity being voice ***DSP VOICE ERROR STATISTICS*** Rx Pkt Drops(Invalid Header): 0, Tx Pkt Drops(HPI SAM Overflow): 0
本文档中介绍的QoS准则可解决语音质量波动或恶化的问题。播放延迟缓冲区的配置是网络中实施不当QoS的一种解决方法。仅将此工具用作停止间隙修复工具,或用于排除和缩小网络中引入的抖动问题的工具。
抖动缓冲区是为固定模式或自适应模式配置的。在自适应模式下,网关允许您配置抖动缓冲区的最小值、最大值和标称值。抖动缓冲区期望数据包在标称值范围内到达。标称值必须等于或大于最小值,并等于或小于最大值。缓冲区将扩展至配置的最大值。此值可扩展至1700毫秒。配置高最大值的一个问题是引入端到端延迟。选择最大播放延迟值,使其不会在网络中引入不需要的延迟。以下输出是为自适应模式配置的抖动缓冲区示例:
3640-6# 3640-6#configure terminal Enter configuration commands, one per line. End with CNTL/Z. 3640-6(config)#voice-port 3/0/0 3640-6(config-voiceport)#playout-delay mode adaptive 3640-6(config-voiceport)#playout-delay maximum 400 3640-6(config-voiceport)#playout-delay nominal 70 3640-6(config-voiceport)#playout-delay minimum low 3640-6(config-voiceport)#^Z 3640-6# 3640-6# 3640-6#show run | begin 3/0/0 voice-port 3/0/0 playout-delay maximum 400 playout-delay nominal 70 playout-delay minimum low playout-delay mode adaptive !
在固定模式下,网关会查看已配置的额定ID值。尽管它允许您配置播放延迟的最小值和最大值,但在为固定模式配置时,它会被忽略。当处于固定模式时,高水位标记值或低水位标记值始终保持恒定。它基于标称值和Rx Delay Est(ms)值。因此,在固定模式下,您可以将值配置为200毫秒。但是,如果估计的接收延迟接近100毫秒,即表示呼叫的整个过程中将高水位线和低水位线设置为。
3640-6# 3640-6#configure terminal Enter configuration commands, one per line. End with CNTL/Z. 3640-6(config)#voice-port 3/0/0 3640-6(config-voiceport)#playout-delay mode fixed 3640-6(config-voiceport)#playout-delay nominal 70 3640-6(config-voiceport)#^Z 3640-6# 3640-6# 3640-6#show run | begin 3/0/0 voice-port 3/0/0 playout-delay mode fixed playout-delay nominal 70 !
有关播放延迟配置的详细信息,请参阅IP语音的播放延迟增强功能。
版本 | 发布日期 | 备注 |
---|---|---|
1.0 |
22-Feb-2002 |
初始版本 |