Servidores STUN y TURN: lo que necesita una videollamada para conectarse

Una videollamada en el navegador parece algo que debería ser sencillo. WebRTC envía el audio y el vídeo directamente de un dispositivo al otro, sin ningún servidor en medio. Luego lo pruebas fuera de tu propia red, y algunas llamadas suenan, se contestan y se quedan en silencio y en negro. Casi siempre el código está bien. Lo que falta es un servidor STUN, un servidor TURN o los dos.
Este artículo explica qué hace cada uno, por qué una llamada los necesita, qué hace falta para mantener tu propio servidor TURN y qué hacer con las llamadas que ni siquiera un relé consigue conectar.
Por qué dos dispositivos no pueden conectarse sin más
Casi ningún dispositivo en internet tiene una dirección pública propia. Un portátil en casa está detrás de un router, un teléfono está detrás de su operador y un ordenador de oficina está detrás de un cortafuegos. Cada uno conoce solo su dirección privada, como 192.168.1.23, que no significa nada para el otro lado de la llamada.
Antes de que una llamada pueda empezar, cada dispositivo tiene que averiguar cómo se puede llegar al otro, y los dos tienen que probar esas vías hasta que una funcione. WebRTC lo hace con ICE, que reúne direcciones candidatas para cada dispositivo y las prueba por parejas. Algunos de esos candidatos salen de STUN y TURN.
Qué hace un servidor STUN
Un servidor STUN responde a una sola pregunta: “¿cuál es mi dirección, tal como tú la ves?”. Un dispositivo le envía una pequeña petición, y el servidor le responde con la dirección pública y el puerto desde los que llegó. El dispositivo añade esa dirección a sus candidatos, el otro lado la prueba y, en la mayoría de las redes domésticas, la llamada se conecta directamente.
STUN es barato. Solo ve unos pocos paquetes pequeños al principio de una llamada y nada después, así que un único servidor STUN puede atender muchísimas llamadas, y hay servidores públicos que cualquiera puede usar. Cuando existe un camino directo, STUN es todo lo que una llamada necesita.
Qué hace un servidor TURN
A veces no existe ningún camino directo. Un cortafuegos estricto no deja entrar nada, un operador móvil da al teléfono un puerto público distinto para cada nuevo destino, o la red de una empresa solo permite tráfico web. La dirección que dio STUN no le sirve al otro lado, y la llamada falla.
Un servidor TURN es un relé para esas llamadas. Los dos dispositivos abren una conexión de salida hacia él, y él se encarga de pasar el audio y el vídeo de uno a otro. Como los dispositivos solo abren conexiones de salida, algo que permiten casi todas las redes, la llamada pasa allí donde una directa no puede.
Retransmitir tiene un coste que STUN no tiene: cada segundo de audio y vídeo pasa por el relé, en los dos sentidos, mientras dure la llamada. Una videollamada entre dos personas puede llevar varios megabits por segundo a través de él. Por eso hay servidores STUN públicos, pero no servidores TURN gratuitos de confianza: un relé abierto a cualquiera pronto acaba llevando tráfico que su dueño nunca quiso llevar, y se cierra o se protege con credenciales.
Mantener tu propio servidor TURN
Existen servidores TURN de código abierto que funcionan bien, y muchos equipos empiezan por ahí. Esto es lo que hace falta:
- Un servidor con dirección pública y mucho ancho de banda, cerca de tus usuarios. Un relé en otro continente añade un retardo que la gente oye.
- Los puertos adecuados. El puerto habitual es el 3478 por UDP y TCP. Para las redes que solo permiten tráfico web, el relé también tiene que responder en el puerto 443 con TLS, lo que significa un certificado para su nombre, renovado a tiempo.
- Credenciales que caducan. Un servidor TURN nunca debería aceptar un usuario y una contraseña fijos, escritos en tu página para que cualquiera los copie. Lo habitual es un secreto compartido entre tu app y el relé: tu servidor crea para cada llamada un usuario y una contraseña que dejan de funcionar al cabo de un tiempo.
- Más de uno, a medida que creces. Un solo relé es un único punto en el que pueden fallar todas las llamadas. Los usuarios de otras regiones necesitan uno cerca, y cada uno hay que vigilarlo, actualizarlo y darle margen para crecer.
- Pruebas desde redes reales. Un relé que funciona desde tu oficina puede fallar desde un teléfono en la red de un operador o desde un portátil en la Wi-Fi de un hotel. Haz pruebas desde las redes que usan tus usuarios.
Nada de esto es difícil, pero es un servicio que hay que mantener en marcha mientras tu app tenga llamadas.
Cuando ni siquiera TURN puede conectar una llamada
Un relé resuelve la mayoría de las llamadas que fallan, pero no todas. Algunas redes bloquean el UDP que prefiere el relé, y otras interfieren con las conexiones largas incluso en el puerto 443. En esos casos, una llamada puede ir un paso más allá, a una sala en un servidor multimedia, como los que usan las llamadas en grupo. Entonces las dos personas envían su audio y vídeo al servidor multimedia y reciben los del otro desde él, un camino que aguanta en redes donde cualquier tipo de conexión de medios entre pares tiene problemas.
Si una llamada solo pudiera pasar allí después de fallar, se colgaría antes. Lo mejor es mantener la llamada mientras cambia de camino, para que las personas que están en ella noten que la imagen se congela un momento, no que la llamada se corta.
Cómo conecta las llamadas WordPlus Cloud
WordPlus Cloud gestiona los tres caminos, así que una llamada entre dos personas siempre se conecta, sea cual sea la red:
- Directamente, entre los dos dispositivos, en la mayoría de las redes. El camino más rápido.
- A través de nuestros relés, cuando un cortafuegos bloquea el camino directo. Responden en los puertos de la web, el 443 y el 80, además del 3478, así que una llamada pasa allí donde pasan los sitios web. Cada persona de cada llamada recibe sus propias credenciales para los relés, que caducan al cabo de unas horas, así que nadie puede usar los relés fuera de tus llamadas.
- A través de nuestros servidores multimedia, cuando ni siquiera los relés pueden llevar la llamada. La llamada pasa a ellos y sigue, sin colgar.
Las llamadas están cifradas de extremo a extremo en todos los caminos, con una clave que solo entrega tu servidor, así que los relés y los servidores multimedia transportan lo que no pueden leer. Las llamadas entre dos personas están incluidas en todos los planes, pasen por un relé o no. Tu servidor sigue decidiendo quién puede llamar a quién, y la nube lo hace cumplir.
Funciona igual en Better Messages en WordPress y en tus propias apps, desde Next.js, Laravel, Django y otros stacks con nuestros SDK. Videollamadas y llamadas en grupo para tu app muestra lo que te dan los SDK, y cómo funcionan las llamadas en nuestra documentación muestra el código.