SIPp para pruebas de performance de VoIP

En el último tiempo hemos estado colaborando con las pruebas de performance de la plataforma llamada “Yo Te Escucho”, la cual es una iniciativa desarrollada en forma voluntaria y sin fines de lucro. En este post te queremos contar del proyecto así como de todo lo que aprendimos con la herramienta SIPp para pruebas de performance sobre el protocolo SIP (que básicamente son llamadas VoIP, voz por internet).

El post surge del trabajo, investigación de Mikaella Mateos y Pablo Richieri, dos abstracteros que han estado trabajando en el proyecto liderados por Andrei Guchín (¡gracias a los 3!).



Para esto, en este post recorreremos un poco las básicas de los protocolos involucrados para luego ver cómo usar la herramienta SIPp para simular llamadas concurrentes sobre el sistema. Todo esto claro, desde la experiencia de un proyecto real lo cual lo hace mucho más interesante, y por el contexto colaborativo del proyecto lo está haciendo muy motivante para poder aportar.

Si necesitás conocer más sobre pruebas de performance, leé primero acá.

Colaboración con el proyecto “Yo Te Escucho”

La plataforma “Yo Te Escucho” permite a un usuario realizar llamadas y ser escuchado por una persona capacitada de forma anónima y segura. El objetivo principal es poder brindarles a las personas un canal de comunicación y de escucha empática (no es terapia) para cuando deseen hablar y ser escuchados. La idea se implementó a raíz de la pandemia causada por el COVID-19, pero se pretende que perdure en el tiempo luego de que esta situación termine.

Nuestra colaboración en este proyecto fue realizando pruebas de performance sobre la app mobile, con el objetivo de observar el rendimiento del sistema al tener activas concurrentemente el máximo de llamadas que admite. 

La aplicación es utilizada tanto por los usuarios que realizan las llamadas (‘llamadores”) como por los que están disponibles para contestarlas (“escuchadores”) y utiliza el protocolo SIP para establecer la comunicación. Este protocolo no es soportado por defecto por las herramientas que usualmente utilizamos para pruebas de performance, como JMeter o Gatling, por lo que fue necesario investigar en qué consiste el protocolo SIP, cómo capturarlo y finalmente analizar con qué herramienta automatizar el flujo de establecimiento de la llamada tanto del lado del llamador como del escuchador. Esto lo logramos con la herramienta SIPp. Esta herramienta es la recomendada por 3CX que es el proveedor del servicio VoIP con el que trabajamos.

¿Qué es VoIP?

El protocolo VoIP (Voice Over IP) se utiliza para realizar y transmitir llamadas telefónicas a través de una red IP. Su objetivo es dividir en paquetes los flujos de audio para transportarlos.

La mayoría de estas llamadas, utilizan el protocolo SIP (Session Initiation Protocol), ya sea mediante el uso de teléfonos físicos, como también de softphones.

Los teléfonos SIP físicos se parecen mucho a los teléfonos tradicionales, sin embargo están desarrollados para ser utilizados en redes IP.

Aastra Mitel 6867i Gigabit IP Phone (50006817)

Los softphones por otro lado, son aplicaciones de software que se utilizan en la computadora, tableta o smartphone y se comportan exactamente como un teléfono IP normal, permitiendo llevar a cabo llamadas, así como algunas funciones adicionales como videoconferencias, hacer presentaciones, etc.

Colaboración con tan sólo un clic a través de la solución de comunicaciones unificadas 3CX

¿Qué es SIP – Session Initiation Protocol?

SIP es un protocolo utilizado para establecer una “sesión” entre 2 o más participantes, modificarla y eventualmente terminar esa sesión. Ha encontrado su mayor uso en el mundo de la Telefonía IP. Este protocolo tiene un parecido significativo al protocolo HTTP. Los mensajes están basados en texto y el mecanismo de petición-respuesta hace muy fácil la resolución de errores.

Contamos con dos tipos de mensajes SIP, los pedidos (requests) y los mensajes de estado (status). Entre los pedidos más comunes se encuentran: REGISTER, INVITE, ACK (acknowledge), INFO, NOTIFY, UPDATE, BYE, etc. Y en los estados encontraremos códigos de respuesta en el rango entre 100 y 600, por ejemplo: 100 (Trying), 180 (Ringing), 200 (OK), 407 (Necesita autenticarse), etc.

Los mensajes SIP describen la identidad de los participantes en una llamada y cómo los participantes pueden ser alcanzados sobre una red IP. Una vez que el intercambio de los mensajes de configuración culminó, la comunicación puede ser intercambiada utilizando otro protocolo, típicamente RTP (Real-Time Transmission Protocol).

SIP fue desarrollado por el IETF y publicado como RFC 3261.Su flexibilidad ha permitido reemplazar casi por completo al protocolo H.323 en el mundo VoIP.

¿Cómo capturar tráfico con el protocolo SIP?

La herramienta que recomendamos para capturar este protocolo es Wireshark.
Wireshark es un analizador de protocolos que permite ver todo el tráfico que pasa a través de una red y filtrarlo por protocolos.
A continuación se detallarán las distintas secciones que encontraremos en Wireshark y que son de gran utilidad a la hora de automatizar el flujo.

  1. En esta sección se puede filtrar tanto por protocolos como por IPs
  2. Se visualiza la  IP desde la que se mandan los mensajes.
  3. Se visualiza  la IP que recibe los mensajes.
  4. En esta sección se puede ver qué protocolo se está usando
  5. En esta sección podremos ver si el mensaje es un pedido (request) o un mensaje de estado (status).
  6. Al seleccionar uno de los paquetes capturados, podremos visualizar en esta sección la información referente a los protocolos de cada una de las capas de red . Si seleccionamos “Session Initiation Protocol” en “Message Headers” podremos ver todos los headers del protocolo SIP que se mandan en ese mensaje y que luego utilizaremos para automatizar la llamada.

¿Qué es SIPp? 

SIPp es una herramienta Open Source que nos permite generar una o varias llamadas usando el protocolo SIP emulando tanto clientes como servidores.

Por defecto trae algunos escenarios básicos prontos para ejecutar, pero de todas maneras nos permite importar nuestros propios escenarios que crearemos en formato XML.

En estos describiremos flujos de llamadas desde los más simples hasta los más complejos, pudiendo regular la cantidad de llamadas por periodo de tiempo, el uso de autenticaciones, envío de audio o video usando el protocolo RTP, entre otros.

En el siguiente link podremos descargar SIPp y también encontraremos su documentación, la cual explica fácilmente cómo instalarlo (recomendamos hacerlo en Linux).

Usando SIPp 

Si se quiere utilizar la herramienta, bastará con realizar los siguientes pasos: 

Para comenzar, se ejecuta desde línea de comandos mediante  “sipp”.

# ./sipp

Luego indicamos la dirección IP a la cual irán dirigidas nuestras llamadas.

# ./sipp 127.0.0.1

Y por último la flag “-sf” se usa para ejecutar un escenario creado por nosotros o “-sn” para usar uno de los ya incluidos, seguido del archivo de escenario que vamos a ejecutar.

# ./sipp 127.0.0.1 -sf mi_escenario.xml

Con esto ya podríamos ejecutar un escenario simple sin problemas, pero contamos con una gran variedad de opciones que nos permitirán llegar a ejecutar escenarios de mayor complejidad. El siguiente link los llevara a la documentación de SIPp en donde podrán ver todas ellas. 

A continuación veremos algunas de estas opciones que creemos serán de gran utilidad a la hora de hacer más robustos sus escenarios. 

-h: Nos muestra información de ayuda en pantalla

-aa: Activa una respuesta automática con el código “200 OK” para todos los pedidos de tipo INFO, UPDATE y NOTIFY. Esto es de utilidad para poder obviar todos estos mensajes que generalmente no aportan mucho al usuario, solamente informan.

-m: Determina el número máximo de llamadas a ejecutar y detiene la prueba en el momento en el que se procese esa cantidad de llamadas.

-r: Configura la cantidad de llamadas por periodo de tiempo que deseemos generar. Por defecto se generaron 10 llamadas por segundo. Esta configuración es editable dinámicamente durante la prueba utilizando las siguientes teclas:

  • “+” aumenta en 1 las llamadas por periodo de tiempo.
  • “-” disminuye en 1 las llamadas por periodo de tiempo.
  • “*” aumenta en 10 las llamadas por periodo de tiempo.
  • “/” disminuye en 10 las llamadas por periodo de tiempo.

-rp: En complemento de la flag anterior este especifica el periodo de tiempo (en milisegundos) en el cual se generarán esta cantidad de llamadas, este está seteado por defecto en 1000 = 1 segundo. 

-inf: Nos permite importar archivos, CSV por ejemplo, y trabajar con los sus datos en nuestros scripts. Más adelante cuando veamos cómo generar nuestros escenarios veremos en más detalle esta opción.

-oocsf: SIPp utiliza un solo “call-id” para cada ejecución del flujo automatizado. Esto quiere decir que si en el mismo script se tiene automatizado distintas comunicaciones la herramienta va a usar el mismo call-id para ambos. Para el caso de esta aplicación todas las comunicaciones (llamadas, registro del escuchador en el servidor, etc.) se realizan con un call-id distinto. Esta flag nos permite, siempre que SIPp reciba un pedido con un “call-id” distinto al inicial, ejecutar un segundo escenario particular para resolver esta segunda comunicación. Para usar esta funcionalidad pero con los escenarios ya integrados en la herramienta usaremos la flag “-oocsn”.

Escenarios en SIPp

Los escenarios en SIPp son archivos en formato XML. Estos tienen la siguiente forma.

A continuación veremos algunos de los comandos que podemos colocar en nuestro script.

Comandos

Estas son las etiquetas más utilizadas:

<send> – Usado para enviar pedidos.

<recv> – Usado para recibir pedidos.

<pause> – Genera pausas de determinada duración (en milisegundos).

<label> – Nos permite identificar una parte específica de nuestro escenario para luego si así lo queremos poder dirigirnos directamente a ese pedido si se cumple alguna condición.

<nop> – No tiene efecto a nivel de protocolo SIP, pero nos permite realizar acciones específicas que veremos a continuación.

Para una lista completa y más detallada de estos comandos con sus ejemplos de uso ingresar al siguiente link.

Acciones

En cualquier instancia de un comando “recv” o “nop” podremos usar acciones de distintos tipos, entre ellas tenemos: el uso de expresiones regulares, reproducir audio o video, asignar valores a variables, saltar a otro punto del escenario,etc.

Para una lista completa y más detallada de estas acciones con sus ejemplos de uso por favor ingresar al siguiente link.

Palabras clave (Keywords)

A la hora de armar nuestros mensajes, SIPp nos proporciona diferentes palabras clave que nos serán de gran utilidad. Estas palabras clave sirven para indicarle a SIPp que tiene que hacer algo con ellas. Entre las más usadas encontramos:

[remote_ip] y [remote_port] – Valores de IP y puerto con el que nos queremos comunicar.

[local_ip] y [local_port] – Valores de nuestro IP y puerto local.

[call_id] – Guarda el valor del identificador de la llamada.

[authentication] – Crea header de autenticación. Más adelante veremos ejemplos.

[fieldX] – Usa valores obtenidos de archivos externos. Más adelante veremos ejemplos.

La siguiente figura muestra un mensaje de pedido típico en SIP. El primer bloque de información representa todos nuestros headers. Luego, separado por una línea en blanco encontramos al final del pedido el bloque que contiene la información que pertenece al body. 

En los headers encontramos información sobre la comunicación en sí, como por ejemplo: la VIA que vamos a utilizar, quien envía (FROM) y quien recibe (TO) el mensaje, cual es la CALL ID, etc. Y en el body generalmente encontramos la configuración de lo que será el contenido de esa llamada, como por ejemplo: desde dónde será enviado, de qué tipo sera (audio o video), que formato tendrá, etc.

Tanto en los headers como en el body podemos ver ejemplos del uso de las palabras clave que mencionamos anteriormente.

Por otro lado un mensaje de estado típico en SIP se ve de la siguiente forma. 

Notaran que las palabras clave cambian con respecto a las de nuestro mensaje de pedido anterior. Ahora las palabras clave están precedidas por la palabra “last”. Esto se debe a que todos los mensajes de estado son consecuencia de un pedido anterior y comparten la gran mayoría de sus headers con ese pedido. SIPp nos permite al colocar esta palabra “last” para acceder a la última configuración conocida de ese header (en el ejemplo sería la recibida en el pedido INVITE) y reutilizarla en este header.

Para una lista completa y más detallada de estas palabras clave con sus ejemplos de uso por favor ingresar al siguiente link.

Resultados en SIPp

Ahora hablaremos un poco sobre lo que veremos en pantalla al ejecutar SIPp. Teniendo como referencia la siguiente imagen:

  1. La configuración del script.
  2. El flujo que tendrá la llamada. Las flechas indican si se envía o recibe el mensaje.
  3. El estado de cada uno de los mensajes. (Correctos, retransmisiones o errores)
  4. Las advertencias o errores ocurridos durante la ejecución, en el caso de que las haya.

NOTA: las retransmisiones ocurren cuando un mensaje no recibe respuesta en un periodo de tiempo seteado por el usuario (por defecto 500 milisegundos) o cuando la respuesta recibida no es la esperada.

Otros elementos utilizados

En el proyecto probando Yo Te Escucho tuvimos que hacer uso de otros elementos que explicamos a continuación.

Variables

En escenarios más complejos, vamos a necesitar almacenar información que va a ser reutilizada en otras partes del script o incluso en otras llamadas. Para ello, haremos uso de las variables. 

En este proyecto en particular, utilizamos variables para los distintos usuarios y las definimos de la siguiente manera:

donde user es el nombre de la variable y 002 su valor.  Para hacer uso de esta variable bastará con llamarla de la siguiente manera: [$user]

Expresiones Regulares

El uso de expresiones regulares en SIPp nos permite obtener y almacenar información específica de un mensaje para poder utilizarla luego.

Si no conocen los fundamentos de las expresiones regulares les recomendamos esta web, que a través de ejercicios explica su funcionamiento.

Como mostramos a continuación el uso de la acción “ereg” en SIPp nos requiere varios datos:

regex – la expresión regular.

search_in – el lugar en donde buscaremos esa expresión regular.

header – nombre del header, solamente lo pondremos cuando buscamos en un header.

check_it – Si no encuentra la expresión marca la llamada como fallida.

assign_to – nombre de la variable en donde almacenaremos el valor encontrado

En este caso nosotros buscamos que la expresión regular “;.*” se encuentre en el “hdr” (header) que tiene el nombre “To”. No marcara la llamada como fallida si no encuentra esa expresión (“false”) y si la encuentra guardará su valor en una variable de nombre “3”

Por más información sobre el uso de expresiones regulares en SIPp dirigirse a este link.

Archivos CSV

Para insertar valores a los escenarios desde un archivo CSV se puede utilizar el siguiente comando en la consola: -inf archivo.csv

La primer línea del archivo deberá especificar cómo se van a leer los datos:

  • SEQUENTIAL: Si queremos que se lean de forma secuencial.
  • RANDOM: Si queremos que se lean de forma aleatoria.

Cada línea corresponde a una llamada y son delimitadas con “;”. En cualquier parte del script que aparezca la palabra clave “[field0]”, será reemplazado por el valor “042” en la primer llamada, “043” en la segunda llamada y asì sucesivamente. Al llegar al final del archivo, SIPp comenzará a leer el archivo desde el principio.

Por más información sobre este tema, visitar este link.

Archivos de audio

SIPp nos permite enviar archivos de audio o video lo cual se realiza simplemente usando la acción “rtp_stream” como lo mostramos a continuación.

Luego del nombre del archivo a reproducir, podemos colocar una “,” y un número que indicará la cantidad de veces que se reproducirá ese archivo (por defecto es 1 y si colocamos -1 lo reproducirá sin parar).

Por otro lado, es algo complejo cumplir con los requerimientos en cuanto a la configuración del  archivo de audio para que SIPp lo pueda reproducir. Les dejamos la siguiente web ya que les será de mucha utilidad si necesitan transformar archivos de audio a distintos formatos para que puedan ser reproducidos correctamente en la llamada (recomendamos usar la opción “a-law”).

Para saber más sobre cómo enviar audio o video usando SIPp ver el siguiente link.

Autenticación

SIPp soporta dos tipos de algoritmos de autenticación, MD5 y AKA. Esta autenticación se realiza fácilmente usando SIPp. Cuando recibimos un mensaje 401 o 407 con un pedido de autenticación debemos colocarle la configuración auth=”true” como mostramos a continuación, con esto SIPp sabrá de dónde obtener la información necesaria para realizar los algoritmos.

<recv response="407" auth="true" />

En el próximo pedido podremos enviar entre nuestros headers la autenticación generada utilizando la palabra clave [authentication]. En nuestro caso tuvimos que autenticarnos contra el servidor usando MD5, agregando en la palabra clave los valores de usuario y contraseña de la siguiente forma.

Con esto SIPp generará automáticamente el header con toda la información necesaria para autenticarnos contra el servidor.

Para más información de cómo autenticarse usando SIPp visiten el siguiente link.

Next y Label

Es posible ejecutar un escenario de forma no secuencial, pudiendo saltar de una parte a otra del escenario cuando se cumpla alguna condición.

Para esto usaremos el comando “label” que indicara un punto de referencia en nuestro escenario y el parámetro “next” que colocado en el comando de nuestra elección hará que cuando este se cumpla el escenario salte al punto en donde se encuentra la label indicada.

En la siguiente imagen vemos un ejemplo de una llamada que se realiza y luego espera por un código 486 de llamada ocupada que puede llegar o no, por eso el parámetro “opcional” se encuentra activado.

Lo que ocurrirá si se recibe este código de llamada ocupada es que el escenario vuelva a la label “ocupado”, como lo indica el parámetro “next”, y reintente la llamada hasta que logre comunicarse.

Para leer más sobre cómo manejar escenarios de forma no secuencial visitar el siguiente link.

Conclusión

Este proyecto fue un gran desafío que significó mucho aprendizaje, desde conocer el protocolo hasta las herramientas a utilizar. 

Se trató de un proyecto súper motivante, tanto por el aprendizaje como también por los beneficios que esta app puede aportar a la sociedad.

SIPp es una herramienta muy poderosa y simple de utilizar. Haciendo un buen uso de las palabras clave se encarga prácticamente de toda la configuración del script, dejándonos a nosotros a cargo de construir el flujo de la llamada. Es importante destacar la posibilidad de traer información desde archivos externos para contar con más versatilidad a la hora de parametrizar y también la posibilidad de transmitir archivos de audio y video que hacen que la llamada sea lo más real posible.

Por otro lado, creemos que se podrían llegar a realizar mejoras. SIPp cuenta con una GUI que intenta hacer más fácil el armado de los scripts para el usuario. Nosotros al comienzo no la encontramos intuitiva, ya que desconocíamos la lógica del armado de los scripts. Por este motivo, optamos por escribir los scripts a mano. Si se tiene conocimiento previo del protocolo SIP, la interfaz puede ser beneficiosa para los usuarios. De lo contrario, tendríamos que leer la documentación que explica el uso de esta GUI (ver el siguiente link) o la documentación de SIPp para poder usarla de forma correcta. Por otro lado la posibilidad de trabajar con más de un call-id por script facilitan mucho el trabajo en los casos como el nuestro, en que el registro del usuario y la comunicación en sí se efectúa en dos call-id diferentes.

Quedaron funcionalidades de SIPp fuera de este post por el hecho de que no tuvimos la necesidad de utilizarlas en esta oportunidad, pero que no deben ser descartadas a la hora de ver todas las capacidades que nos brinda SIPp. 

Te dejamos acá el repositorio con los scripts que usamos en nuestra ejecución para que los tengas como referencia.

One thought on “SIPp para pruebas de performance de VoIP

  1. Anonymous says:

    Gracias chicos… me ahorraron el trabajo que ya he hecho hace algunos años y no guarde nada :P.
    Pocas veces un articulo tan completo de inicio a fin, de lo general a lo particular… Bravo!

Leave a Reply

Your email address will not be published. Required fields are marked *