Servidor TURN es un servidor del protocolo Traversal Using Relays around NAT que retransmite tráfico multimedia entre dos pares cuando una conexión P2P directa es imposible. Según IETF RFC 5766, 2010, el servidor TURN actúa como último recurso (fallback) en el proceso ICE de WebRTC, garantizando la conexión incluso con NAT Simétrico y cortafuegos corporativos.
Puntos clave
Servidor TURN (Traversal Using Relays around NAT) es un servicio de red definido en RFC 5766 y actualizado en RFC 8656 que retransmite tráfico UDP y TCP entre dos clientes cuando la conexión P2P directa es imposible debido a restricciones de NAT o cortafuegos. En la arquitectura WebRTC, el servidor TURN actúa como mecanismo de reserva final, garantizando la conectividad en cualquier condición de red.
A diferencia de STUN, que simplemente informa a un cliente de su dirección externa, el servidor TURN participa activamente en la transmisión de datos. Cada par establece una conexión con el servidor TURN y le envía sus datos multimedia. El servidor TURN, a su vez, reenvía estos datos al otro par. Como resultado, no existe una conexión directa entre pares — todo el tráfico pasa a través del servidor de retransmisión, lo que garantiza la entrega incluso bajo las restricciones NAT más estrictas.
TURN es una extensión del protocolo STUN. Los mensajes TURN utilizan el mismo encabezado de 20 bytes y el mecanismo de atributos. La diferencia clave es que TURN define nuevos tipos de mensajes (Allocate, Refresh, Send, Data, CreatePermission, ChannelBind) y atributos necesarios para gestionar las asignaciones de retransmisión. El cliente crea una asignación en el servidor TURN mediante un mensaje Allocate, recibe una dirección de transporte retransmitida (relayed transport address) y la utiliza para enviar y recibir datos a través del servidor.
El servidor TURN opera siguiendo la siguiente secuencia de pasos. El cliente envía una solicitud Allocate con autenticación (username, credential). El servidor verifica las credenciales y crea una asignación — un enlace temporal de una dirección retransmitida (IP:puerto en el servidor TURN) al cliente. El servidor devuelve una respuesta Allocate con una dirección de transporte retransmitida — la dirección que otros pares utilizarán para enviar datos a este cliente a través del servidor TURN.
Después de crear la asignación, el cliente puede enviar datos a través del servidor TURN usando mensajes Send Indication o mediante canales (ChannelBind). Al recibir datos del cliente, el servidor TURN verifica los permisos (autorización para enviar datos a pares específicos) y retransmite los datos al par objetivo. Para recibir datos entrantes, el cliente debe crear primero un permiso para el par del que espera datos; de lo contrario, el servidor TURN descartará el paquete entrante. Un permiso se crea mediante un mensaje CreatePermission especificando la dirección IP del par.
Una asignación en el servidor TURN tiene un tiempo de vida limitado — 10 minutos por defecto. El cliente debe enviar periódicamente una solicitud Refresh para extender la asignación. El tiempo de vida se especifica en segundos en el atributo LIFETIME. Si no se recibe ningún Refresh, el servidor elimina la asignación y libera la dirección retransmitida. Intervalo de actualización recomendado — 5 minutos (300 segundos) para protegerse contra la pérdida de paquetes Refresh.
En WebRTC, el servidor TURN se configura mediante la configuración de RTCPeerConnection en el array iceServers. Los servidores TURN pueden usar transporte UDP, TCP o TLS. La autenticación normalmente utiliza credenciales con límite de tiempo (credenciales TURN) generadas en el servidor de la aplicación con un período de validez restringido.
Considere un ejemplo de configuración del servidor TURN en JavaScript con autenticación mediante token HMAC-SHA1.
async function createPeerConnection(turnServerUrl) {
const credentials = await fetchTurnCredentials();
const config = {
iceServers: [
{
urls: "stun:stun.l.google.com:19302"
},
{
urls: turnServerUrl,
username: credentials.username,
credential: credentials.credential
}
],
iceTransportPolicy: "all"
};
return new RTCPeerConnection(config);
}
async function fetchTurnCredentials() {
const response = await fetch("/api/turn-credentials");
return response.json();
}
const turnUrl = "turn:turn.example.com:3478";
const pc = await createPeerConnection(turnUrl);
En este ejemplo, el servidor TURN se especifica junto con un servidor STUN en una única configuración ICE. El proceso ICE primero intenta usar candidatos host y candidatos srflx obtenidos de STUN. Si la conexión directa falla, ICE cambia automáticamente al candidato relay obtenido del servidor TURN. El parámetro iceTransportPolicy: "all" habilita los candidatos relay — el valor alternativo "relay" deshabilita todos los candidatos excepto TURN, lo que es útil para pruebas.
Para evitar el uso no autorizado, el servidor TURN requiere autenticación. El enfoque estándar son las credenciales con límite de tiempo generadas en el servidor de la aplicación mediante HMAC-SHA1. El servidor de la aplicación cifra el nombre de usuario con la clave secreta del servidor TURN y devuelve el nombre de usuario y la credencial al cliente. El cliente los pasa a la configuración de RTCPeerConnection, y el navegador los utiliza al crear una asignación en el servidor TURN. Cuando las credenciales caducan, el cliente obtiene otras nuevas del servidor de la aplicación.
TURN y STUN resuelven tareas relacionadas de travessía NAT, pero difieren fundamentalmente en mecanismo y costo. TURN retransmite tráfico, actuando como intermediario, mientras que STUN solo ayuda a determinar la dirección externa para una conexión P2P directa. La elección entre ellos depende del tipo de NAT de los pares y los requisitos de rendimiento.
| Criterio | STUN | TURN |
|---|---|---|
| Mecanismo | Descubrimiento de dirección externa | Retransmisión de tráfico |
| Conexión | P2P directa | A través del servidor de retransmisión |
| Latencia | Mínima (ruta directa) | Adicional (a través del retransmisor) |
| Carga del servidor | Solo solicitudes iniciales | Retransmisión constante de tráfico |
| Costo | Bajo (pocas solicitudes) | Alto (tráfico del servidor) |
| Compatibilidad con NAT Simétrico | No | Sí |
| Ancho de banda | Limitado solo por el canal P2P | Limitado por el canal del servidor |
En la práctica, el servidor TURN se utiliza solo para conexiones donde P2P es imposible. Según Google (estadísticas de WebRTC, 2023), aproximadamente el 15–20% de todas las conexiones WebRTC requieren retransmisión TURN. El 80–85% restante establece conexión a través de STUN o candidatos host locales. Al diseñar una aplicación, debe presupuestar el tráfico TURN al 15–20% del volumen total de medios si su audiencia incluye usuarios de redes corporativas y regiones con estrictas restricciones NAT.
El servidor TURN consume recursos significativos ya que todo el tráfico multimedia pasa a través de él. Cada llamada activa con retransmisión TURN utiliza el ancho de banda del servidor igual al rendimiento total del tráfico multimedia (flujo entrante + saliente). Para una videollamada en HD (720p), esto puede ser de 1,5–2,5 Mbps por conexión en cada dirección, totalizando 3–5 Mbps de tráfico general a través del servidor TURN.
Existen varias opciones de implementación para la infraestructura TURN. Los servidores TURN públicos gratuitos no se recomiendan para producción debido a la falta de garantías de calidad y seguridad. Los proveedores comerciales (Twilio Network Traversal Service, Xirsys, Metered) ofrecen TURN como servicio con precio por gigabyte — el costo típico es de $0,005–0,02 por gigabyte. El autoalojamiento con coturn (servidor TURN de código abierto) requiere un servidor con suficiente capacidad de ancho de banda y configuración de monitoreo.
Al elegir una solución de servidor TURN, considere la geografía del usuario, el costo del tráfico y los requisitos de seguridad. Para aplicaciones con miles de llamadas simultáneas, el coturn autoalojado en servidores con un canal amplio (1+ Gbps) puede ser más rentable que los proveedores comerciales. Para proyectos pequeños con docenas de usuarios, los servicios TURN comerciales son preferibles debido a la falta de gastos generales de administración y monitoreo.
Preguntas Frecuentes
Un servidor TURN es un intermediario que retransmite datos entre usuarios cuando no pueden conectarse directamente. Si dos computadoras están detrás de enrutadores que no permiten conexiones directas, el servidor TURN recibe datos de uno y los envía al otro.
Se requiere un servidor TURN cuando ambos participantes de una llamada WebRTC están detrás de NAT Simétrico o cortafuegos corporativos que bloquean el tráfico P2P. En tales casos, STUN no puede ayudar y el proceso ICE cambia automáticamente al candidato relay obtenido del servidor TURN.
STUN simplemente muestra a una computadora su dirección externa para la conexión directa. TURN retransmite activamente el tráfico a través de sí mismo. STUN no crea carga en el servidor, mientras que TURN consume ancho de banda. STUN funciona solo con ciertos tipos de NAT; TURN siempre funciona pero cuesta más.
El costo de un servidor TURN depende del proveedor y el volumen de tráfico. Twilio cobra aproximadamente $0,005–0,01 por GB de tráfico retransmitido por TURN. Xirsys cobra desde $0,007 por GB. El autoalojamiento de coturn requiere un servidor con al menos 100 Mbps de ancho de banda, cuyo costo depende del proveedor de alojamiento.
Su propio servidor TURN se puede configurar usando coturn (código abierto). La instalación incluye la configuración de puertos, autenticación (secreto compartido), certificados TLS y cortafuegos. El archivo de configuración básico contiene parámetros para listening-port, realm, user y fingerprint. Después de la configuración, el servidor se especifica en iceServers de WebRTC con el prefijo turn: o turns: para TLS.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también