§1

Protocolos

WebRTC & Mumble — Los Dos Stacks de Transmisión
Cómo viajan datos, audio y vídeo entre peers
web-rtc.md §1.1–§1.5 + §1.7 (Mumble)
7capas WebRTC
4capas Mumble
5RFCs core
Opuscodec compartido

Ficha Técnica: Stack WebRTC

CapaProtocoloPuertoFunción
SeñalizaciónSDP (Session Description Protocol)Fuera de bandaNegociación de capacidades y direcciones
DescubrimientoICE (RFC 8445)Dinámico UDPEncontrar la mejor ruta entre peers
NAT traversalSTUN (RFC 8489) / TURN (RFC 8656)3478 / 443Resolver IP pública / relay
Transporte seguroDTLS 1.2 (RFC 6347)Sobre ICEHandshake criptográfico, intercambio de claves
MediaSRTP (RFC 3711)Sobre DTLSAudio/vídeo cifrado (Opus, VP8/H.264)
DatosSCTP (RFC 4960) sobre DTLSSobre DTLSDataChannels: mensajes fiables u ordenados
Codecs oblg.Opus (audio), VP8 (vídeo)Mínimo común garantizado por spec
RFCs: W3C WebRTC 1.0 · RFC 8825 Overview · RFC 8829 JSEP · RFC 8831 Data Channels · RFC 8826 Security

§1.1 — Señalización: Oferta y Respuesta (SDP)

WebRTC no define el canal de señalización — eso es "fuera de banda" (HTTP, WebSocket, SSB, formulario HTML…). Lo que sí define es el formato: SDP.
Peer A                     Señalización                      Peer B
══════                  (cualquier canal)                    ══════
  │                                                            │
  │── createOffer() ─────────────────────────────────────────>│
  │   (SDP: codecs, ICE candidates, fingerprint DTLS)          │
  │                                                            │
  │                                        setRemoteDescription(offer)
  │                                        createAnswer()
  │                                                            │
  │<──────────────────────────────────── answer (SDP) ────────│
  │                                                            │
  │   setRemoteDescription(answer)                             │
  │                                                            │
  │◄═══════════ DTLS handshake + SRTP/SCTP ══════════════════►│
  │                  Canal abierto                             │
El SDP contiene: codecs soportados, candidatos ICE (IPs:puertos), fingerprint del certificado DTLS, y los media tracks ofrecidos.

§1.2 — Tres Capas de Comunicación

                ┌──────────────────────────────────┐
                │      Señalización (SDP)          │
                │  (HTTP, WebSocket, SSB, manual)  │
                └────────┬─────────────────────────┘
                         │ establece
      ┌──────────────────┼──────────────────────┐
      │                  │                      │
┌─────┴──────┐   ┌───────┴────────┐   ┌────────┴───────┐
│ DataChannel│   │ Media Stream   │   │    Files       │
│   (SCTP)   │   │   (SRTP)       │   │  (SCTP bin)    │
│            │   │                │   │                │
│ mensajes   │   │ audio: Opus    │   │ arraybuffer    │
│ texto/bin  │   │ vídeo: VP8/H264│   │ chunked        │
│ chat, JSON │   │ tracks         │   │ con progreso   │
└─────┬──────┘   └───────┬────────┘   └────────┬───────┘
      │                  │                      │
      └──────────────────┼──────────────────────┘
                         │
              ┌──────────┴──────────────────────┐
              │ Transporte: DTLS-SRTP sobre ICE │
              │        (peer-to-peer)           │
              └─────────────────────────────────┘
Las 3 capas comparten el mismo canal ICE (misma conexión UDP), multiplexadas por DTLS. La señalización solo interviene al inicio — después, todo el tráfico es directo.

§1.3 — ICE: Descubrimiento de Ruta

ICE (RFC 8445) encuentra la mejor ruta entre dos peers en 3 fases.
FaseQué haceDetalle
1. Gathering Recopilar candidatos host: IPs locales (192.168.1.50:54321)
srflx: IP pública vía STUN (85.34.22.10:54321)
relay: dirección TURN (turn.example.com:443)
2. Checks Probar pares de candidatos STUN Binding Requests directos entre peers. Cada par recibe prioridad calculada.
3. Nomination Elegir ruta activa Par con mejor prioridad + conectividad. Si la red cambia → ICE restart.
En LAN, el candidato host conecta directamente en milisegundos. En WAN entran STUN y TURN.

§1.4 — STUN: IP Pública

  Cliente              Servidor STUN
  ═══════              ═════════════
    │                        │
    │── Binding Req (UDP) ──>│
    │                        │ (ve IP:puerto
    │                        │  tras el NAT)
    │<── Binding Response ───│
    │ XOR-MAPPED-ADDRESS:    │
    │ 85.34.22.10:54321      │
    │                        │
Solo pregunta-respuesta. STUN no retransmite tráfico — solo dice "tu IP pública es X".

Servidores públicos:
stun:stun.l.google.com:19302
stun:stun.stunprotocol.org:3478

§1.5 — TURN: Relay

Peer A         TURN           Peer B
══════         ════           ══════
  │              │              │
  │─ Allocate ──>│              │
  │<─ relay addr │              │
  │              │              │
  │═ datos ═════>│═══ relay ═══>│
  │<═════════════│<═════════════│
  │  (todo pasa por TURN)       │
Fallback cuando STUN falla (NATs simétricos, firewalls). TURN sí retransmite todo el tráfico — consume BW y CPU en el servidor.

ICE siempre prefiere host → srflx → relay (último recurso).

Ficha Técnica: Stack Mumble

Mumble es un sistema VoIP completo con >20 años de madurez, ya desplegado en el SNH (~10 MB RAM). Su protocolo condiciona la arquitectura.
CapaProtocoloPuertoFunción
ControlTCP + TLS 1.2 (AES-256-SHA)64738Auth, canales, ACLs, estado users, chat texto
VozUDP + OCB-AES12864738Audio Opus/CELT cifrado, ~20–50 ms latencia
Voz fallbackTCP tunnel64738Voz sobre TCP cuando UDP no funciona (NAT/Tor)
SerializaciónProtocol Buffers (Mumble.proto)Mensajes de control tipados y extensibles
CodecOpus (desde v1.2.4, 2013)Mismo codec que WebRTC
Cifrado vozOCB-AES128 (AEAD)Confidencialidad + integridad en un solo paso
AuthCert X.509 del cliente + usernameTLS mutuo opcional

Flujo de Conexión Mumble

Mumble Client                              murmurd (servidor)
══════════════                             ═══════════════════
     │                                              │
     │── TCP connect ──────────────────────────────>│
     │── TLS handshake (AES-256-SHA) ─────────────>│
     │<─ TLS established ─────────────────────────│
     │                                              │
     │── Version (protobuf) ──────────────────────>│
     │── Authenticate (user, cert, tokens) ───────>│
     │<─ CryptSetup (key, nonce para OCB-AES128) ─│
     │<─ ChannelState[] (árbol de canales) ───────│
     │<─ UserState[] (usuarios conectados) ───────│
     │<─ ServerSync (session_id, permisos) ───────│
     │                                              │
     │══ UDP ping ════════════════════════════════>│
     │<═ UDP pong ════════════════════════════════│
     │                                              │
     │══ Voice (Opus, OCB-AES128, UDP) ══════════>│
     │<═ Voice (otros users, Opus, UDP) ═════════│
     │                                              │
     │   [si UDP falla → voice tunnel sobre TCP]    │

¿Por Qué Mumble Importa para el SNH?

#PropiedadDetalle
1Opus compartidoTanto Mumble como WebRTC usan Opus. No hay conversión de codec necesaria.
2Cifrado mandatorioTLS para control, OCB-AES128 para voz. No existe modo sin cifrar.
3TCP fallback nativoCuando UDP falla (NAT simétrico, Tor), Mumble tuneliza voz por TCP automáticamente. Lo que WebRTC resuelve con TURN, Mumble lo resuelve gratis.
4Funciona sobre TorTCP tunnel sobre hidden services. WebRTC sobre Tor es problemático (ver §2.3).
5Ya instaladomurmurd ya corre en el SNH (~10 MB RAM). Coste incremental: cero.
★ Mumble resuelve gratis (TCP fallback + Tor + cifrado) lo que WebRTC necesita TURN + configuración extra ★

WebRTC vs. Mumble — Cara a Cara

WebRTCMumble
FunciónAudio + vídeo + datos P2PAudio VoIP (solo audio)
Codec audioOpus (obligatorio)Opus (desde 2013)
NAT traversalICE + STUN + TURNTCP fallback automático
TorProblemático (UDP, leaks)✔ TCP tunnel nativo
CifradoDTLS + SRTP (obligatorio)TLS + OCB-AES128 (obligatorio)
Vídeo✔ VP8/H.264✘ Solo audio
DataChannels✔ SCTP sobre DTLS✘ Solo texto por TCP control
En el SNHRequiere instalar libYa instalado (murmurd :64738)
No son excluyentes: en escenario remoto + Tor, la Arq. 3 combina ambos — Mumble para audio, WebRTC/go2rtc para vídeo. Ver poster Arq. 3.

Pipeline de Transmisión por Pista

PistaCapturaCodecUnidadProtocolo
DatosTexto/JSON (formulario HTML)N/AMensajes SCTP ≤256 KBSCTP sobre DTLS
Audioffmpeg -f alsa/pulse (mic)Opus 48 kHzPaquetes RTP 20 ms (~160 B)SRTP sobre DTLS
Vídeoffmpeg -f v4l2 (cámara)VP8 o H.264 HWPaquetes RTP ~1200 BSRTP sobre DTLS
ArchivosBuffer desde discoN/AChunks binarios DataChannelSCTP (fiable, ordenado)
La captura varía según CSI/USB — ver CSI vs. USB y spec pipeline.

☞ Continúa Explorando

Ecosistema — Librerías & Servidores (todas las opciones)
Retransmisión al Navegador — MJPEG, HLS, sin JS
Matriz de Decisión — ¿qué arquitectura elegir?
Glosario — 40 términos
SDP ICE STUN TURN DTLS SRTP SCTP Opus Mumble OCB-AES128 Protobuf DataChannel