Asterisk PBX y el Jitter Buffer

Una de las causas que puede afectar la calidad del flujo media de las llamadas (protocolo RTP) es el Jitter. El valor del Jitter expresa la variación en el retardo de cada paquete recibido; un valor alto denota una congestión en la red y por ende una baja calidad del flujo media.

Mientras el flujo de salida es constante y ordenado, el flujo de llegada de los paquetes puede ser inconstante y los paquetes pueden llegar fuera de orden:

image

En la imagen de arriba el flujo constantes de los paquetes enviados (rojo) y el flujo inconstante de la llegada de los paquetes (azul).

Si el Jitter no es muy alto, es el mismo protocolo RTP que intenta compensarlo; si el Jitter es muy alto, habrá perdidas de paquetes y esto se reflejará en la calidad del audio/vídeo de la llamada.

En Asterisk hay la posibilidad de crear y configurar un Jitter Buffer es decir una pequeña memoria donde los paquetes del flujo media se guardan antes de ser reenviados; esto permite corregir tres cosas:

  • la llegada del los paquetes fuera de secuencia
  • compensar en parte la perdida de paquetes
  • restablecer un flujo constante antes del reenvío

La desventaja de utilizar esta funcionalidad, es que aumentará el retraso en la trasmisión del flujo media. En el archivo sip.conf, hay distintos parámetros que permiten configurar el Jitter Buffer:

jbenable = yes
jbforce = no
jbmaxsize = 200
jbresyncthreshold = 1000
jbimpl = adaptive
jbtargetextra = 40
jblog = no

  • jbenable = yes se activa el Jitter Buffer. El valor predefinido es no
  • jbforce = no no se obliga el uso del jitterbuffer del lado que recibe. Con yes se obliga
  • jbmaxsize = 200 el tamaño, en milisegundos, del Jitter Buffer
  • jbresyncthreshold = 1000 salto, en milisegundos, en la marca de tiempo presente en cada paquete RTP; realizado el salto, el Jitter Buffer sera sincronizado nuevamente. Muy útil cuando el flujo media llega fuera de orden de secuencia
  • jbimpl = adaptive este parámetro puede tomar dos valores: fixed y adaptive. Con fixed el tamaño de la “cola” de paquetes es fijo, con adaptive el tamaño aumenta o se reduce según el flujo empeore o mejore respectivamente
  • jbtargetextra = 40  este parámetro afecta la configuración del Jitter Buffer solamente si el parámetro anterior se ha configurado con adaptive. En ese caso se añadirá el valor de este parámetro al valor del parámetro jbmaxsize. Esto puede ser util en escenarios donde el flujo media en general es bueno pero se presentan picos de congestión
  • jblog = no habilita el LOG del Jitter Buffer

¿Cómo funciona el Jitter Buffer en Asterisk?

El Asterisk Jitter Buffer recibe los paquetes del flujo media y si están fuera de secuencia o llegan sin un flujo constante, los ordena y los envía al corazón de Asterisk que se encarga de reenviarlos a su destino.

En el caso del canal PJSIP no hay disponibles los mismos parámetros como en el archivo sip.conf, pues la única opción el utilizar la función:

JITTERBUFFER

Algunos ejemplos:

exten => 1,1,Set(JITTERBUFFER(adaptive)=default)

Se utilizará el modo adaptive con los valores predefinidos.

exten => 1,1,Set(JITTERBUFFER(adaptive)=200,,60)

se utilizará el modo adaptive con 200ms de tamaño y 60ms extra

exten => 1,1,Set(JITTERBUFFER(fixed)=200,1500)

se utilizará el modo fixed con 200ms de tamaño y un “resync threshold” de 1500

same => n,Set(JITTERBUFFER(disabled)=)

para deshabilitar el Jitter Buffer

¿Han utilizado alguna vez esta funcionalidad de Asterisk? ¿Cómo les fue?

Fuentes: AsteriskBlog, CiscoSupport