¿Te gustaría colaborar en un proyecto de software libre? Conoce P2PSP

WebRTC Comunicación en tiempo real sin plugin

Comparte este artículo

WebRTC logo

¿Qué es WebRTC?

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. 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/video y puede contener varios canales.
  • RTCPeerConnection: Permite establecer una conexión p2p con otros navegadores, procesar la señal, manejo de codec, gestión de ancho de banda, etc.
  • RTCDataChannel: Permite al navegador una comunicación de datos bidireccional entre peers.

Proceso de señalización (Signaling)

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

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

Ejemplo de SDP:

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

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


Signaling

Una propuesta para el proceso de señalización

WebSocket es una buena elección para llevar a cabo este proceso. 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'. 

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

Obtener la información de la red atravesando 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 y se comparten.

Ejemplo de cada uno de los tipos de candidatos:

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

Referencias - Más Información

Este artículo en modo presentación en Presentación WebRTC

Comparte este artículo

Escribir un comentario


Código de seguridad
Refescar

Suscripción RSS

feed-image Blog