Falando sobre WebRTC

Vitor Hugo
Zenvia
Published in
4 min readAug 26, 2020
Imagem de capa meramente ilustrativa (créditos)

Apresentação

WebRTC (Web Real Time Communication) é um projeto de código aberto que tem como objetivo fornecer uma forma simples de estabelecer uma comunicação ponto a ponto entre duas entidades que utilizem a web.

Essa comunicação deve acontecer idealmente através de APIs presentes nos navegadores, sendo que estas estão prontas para ser consumidas através do javascript. Essas mesmas APIs fornecem uma forma mais compreensível de trabalhar com coisas como:

  • Audio
  • Vídeo
  • Transferência de arquivos.

Com esse texto, espero abrir uma porta de entrada para aqueles que desejam saber mais sobre esse tema e sobre os processos que o orbitam o mesmo. Assumindo esse papel didático, tomarei a liberdade de utilizar termos não técnicos e analogias sempre que possível.

Descrição

Tendo como referência um dispositívo que chamaremos de A, podemos dividir a tarefa de “estabelecer uma comunicação via WebRTC” em três etapas:

  • Descobrir a localização de seu par, que chamaremos de dispositívo B.
  • Notificar seu par do desejo de estabelecer conexão.
  • Estabelecer uma conexão direta com seu par.

Descobrindo a localização do par

Antes de mais nada, pensemos numa ligação telefônica simples. Quando você deseja se comunicar com um colega, faz uso de uma sequência de números numa ordem específica para informar este desejo ao seu celular e este, por sua vez, faz uso da rede de telefonia Fixa/Móvel para localizar o dispositívo que tem posse do número que você discou. Sabendo então o endereço associado ao dispositívo de destino, o celular de origem tenta estabelecer conexão.

As aplicações WEB atuam de forma muito similar. Todas possuem um endereço para comunicação e quando fazemos uso de qualquer aplicação, via de regra teremos sempre um dispositívo de origem buscando fazer conexão com um dispositívo de destino (e conseguindo em grande parte das vezes).

Nos apegamos no termo “similar” e não no termo “igual” por conta de uma diferença muito básica, que gera efeitos colaterais em todo processo, visando garantir o mesmo resultado final. Nossos dispositivos WEB não possuem números únicos que os identificam nessa grande rede que chamamos de internet. Sem me alongar muito nos conceitos de redes de computadores, podemos ser singelos e falar que assim como uma empresa possui ramais privados em sua central telefônica que fica atrás de seu número de telefônico publico, nossos dispositivos WEB possuem endereços privados para se comunicar entre si (como seu celular falando com seu computador para usar o whatsapp web) e estes ficam atrás de seu roteador que detêm seu endereço público usado para falar com a internet.

Na telefonia, quando um precisávamos que um desses ramais internos recebesse uma chamada de um telefone externo a central, muitas vezes tínhamos o papel de uma telefonista que recebia todas as requisições e encaminhava para o ramal adequado. Na WEB isso ocorre de forma mais automatizada com o que chamamos de tradução de endereço de rede, ou para os mais íntimos, o tal do NAT.

Imagem meramente ilustrativa.

Uma consequência da automatização é o fato de que na maioria dos cenários um dispositívo WEB não sabe com qual endereço público está chegando na internet. Para facilitar esse conceito, voltamos a telefonia imaginando que nossos dispositívo são aparelho telefônicos em um hotel, pois até podemos fazer ligações através dele, mas não sabemos por que linha esta ligação vai sair.

Para que um dispositívo saiba qual seu endereço público na internet, os dispositivos muitas vezes recorrem a serviços utilitários para sessão transversal de NAT, sendo que estes são comumente chamados de STUN. De forma muito resumida, o STUN permite que nossos dispositivos WEB saibam seus endereços públicos e assim possam informar uns aos outros qual o melhor caminho que se possa chegar até eles. Se isso não ficar claro em sua cabeça, pense numa conversa entre dois amigos: Um deseja visitar o outro e aquele que vai ser o anfitrião precisa saber de onde sua visita irá sair para explicar o trajeto mais rápido e seguro a se trilhar.

Com esses conceitos presentes em sua cabeça de forma mais clara, vamos ao segundo passo.

Notificando o par sobre seu desejo de estabelecer uma conexão

Para notificar o nosso par do desejo de estabelecermos uma conexão, se faz uso de um terceiro dispositívo, que chamaremos de central de sinalização. A central de sinalização detêm os endereço público de todos os nós associados a ela e quando um desses nós tem por objetivo conversar com o outro, a central recebe uma mensagem que declara esse interesse e encaminha a mesma para o dispositívo apropriado.

Estabelecimento de conexão direta

Uma vez que os dois nós estão cientes do desejo de estabelecer conexões e obtém a informação de seu par (necessidade de NAT, STUM e etc…), os mesmos se conectam diretamente a podem começar a trocar informação através de rede.

Conclusão

Através de um estrutura simples podemos usar WebRTC para estabelecer comunicação direta entre dois dispositivos WEB e permitir um fluxo de dados bidirecional. Isso nos permite tratar desde chamadas de vídeo/audio até a transferência de arquivos.

Recomendação de leitura

--

--

Vitor Hugo
Zenvia
Writer for

Desenvolvedor Python com gosto pela cultura DevOps.