WebRTC

Comunicación en tiempo real sin plugin




Cristóbal Medina López
Septiembre, 2013

¿Qué es?

WebRTC (Web Real-Time Communication) es un proyecto de software libre que permite a los navegadores mantener comunicaciones en tiempo real a través de una API Javascript sin necesidad de software adicional.

WebRTC es un proyecto mantenido por Google, Mozilla y Opera que actualmente está en proceso de estandarización en el IETF y en el W3C.


Componentes Principales


MediaStream o getUserMedia
Permite al navegador acceder a la cámara y al micrófono.

  • Representa un stream de audio y video.
  • Puede contener varios canales.

Componentes Principales


RTCPeerConnection
Permite establacer una conexión p2p con otros navegadores y mucho mas...
  • Procesamiento de la señal.
  • Manejo de codec.
  • Seguridad.
  • Gestión de ancho de banda.
  • ...

Componentes Principales


RTCDataChannel
Permite al navegador una comunicación bidireccional de datos de cualquier tipo entre peers.
  • Muy baja latencia.
  • Transporte fiable o no fiable.
  • Seguridad.
  • ...

Signaling (Señalización)

Para conseguir conectar los peer es necesario intercambiar un objeto 'session description' (SDP), este objeto contiene:

  • Formatos soportados y que información desea enviar
  • Información de la red para iniciar la conexión p2p

	v=0
	o=- 5148251955052202386 2 IN IP4 127.0.0.1
	s=-
	t=0 0
	a=group:BUNDLE audio data
	a=msid-semantic: WMS
	m=audio 1 RTP/SAVPF 111 103 104 0 8 107 106 105 13 126
	c=IN IP4 0.0.0.0
	a=rtcp:1 IN IP4 0.0.0.0
	a=ice-ufrag:MrZfMOyTeofdkalZ
	a=ice-pwd:Zi68MAZJcGR8WVQEPHzIWeBQ
	a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
	a=sendonly
	a=mid:audio
	a=rtcp-mux
	a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:T93pY5PBv4fgDmVIuz7qmL3y9UXozTZdjUCKYlrn
	a=rtpmap:111 opus/48000/2
	...
       

Signaling (Señalización)

El proceso de señalización es abstracto, por tanto, se puede usar cualquier mecanismo y protocolo para el intercambio.


Signaling (Señalización)

WebSocket para signaling, una buena elección.
Un navegador que soporta WebRTC casi con total seguridad soporta WebSocket. Usar JSON junto a WebSocket es una buena opción para realizar el intercambio del objeto 'session description'

var signalingChannel = new WebSocket("ws://ip:port/");
...
signalingChannel.send(JSON.stringify({ "sdp": localDescription }));
...
signalingChannel.onmessage = function (evt) {
	var message = JSON.parse(evt.data);
...
	

¿Firewalls y NATs?

Para conseguir la información de la red atravesando firewalls y NATs se hace uso del protocolo ICE.
ICE permite que se prueben distintas rutas para comunicar dos terminales entre sí acordando una común. De forma que si están en la misma red local se comparte la información de forma local sin necesidad de utilizar otros servicios.
Pueden existir 3 tipos de candidatos:

  • Host candidates: Son candidatos locales, las tarjetas de red del equipo, contiene ips privadas.
  • Reflexive candidates: Se obtienen realizando consultas a servidores STUN, contiene ips públicas. (Permite atravesar NAT de tipo Cone)
  • Relay candidates: Se obtienen realizando consultas a servidores TURN, contiene ips públicas y se transmiten los datos a través de él. (permite atravesar NAT simétricos)

Una vez que se obtienen los candidatos se añaden al SDP.

a=candidate:1 1 UDP 6556159 192.168.1.1 50036 typ host 
a=candidate:6 2 UDP 6556159 171.211.100.26 50135 typ srflx raddr 192.168.1.1 
rport 50039 
a=candidate:2 1 UDP 6556159 120.50.141.51 50099 typ relay raddr 120.50.141.51 
rport 50099
	

Referencias / Más Información