Wat is WebRTC? Alles over de online standaard voor videobellen

Als je in de beginjaren van het web videogesprekken in je webbrowser wilde voeren, moest je een plug-in zoals Adobe Flash of Silverlight installeren. Anno nu is er een veel betere oplossing, die op alle populaire browsers werkt zonder extra installatie: WebRTC. Wat is WebRTC precies?

WebRTC is een open framework voor realtime communicatie (RTC) voor het web. Het stelt ontwikkelaars in staat om webapplicaties voor spraak- en videogesprekken en peer-to-peer bestandsuitwisseling te bouwen zonder dat gebruikers extra software hoeven te installeren.

Opensource videobeldiensten zoals Jitsi en Nextcloud Talk gebruiken WebRTC en ook Microsoft Teams heeft een webclient die op WebRTC is gebaseerd. WebRTC is een standaard van het World Wide Web Consortium (W3C) en de Internet Engineering Task Force (IETF). Het wordt ondersteund door Google, Mozilla, Apple, Microsoft en Opera, zowel op de desktop als in mobiele browsers.

Toegang tot je webcam, microfoon en luidsprekers was in het begin van het web alleen mogelijk via een browserplug-in zoals Flash of Silverlight. Html5 maakte daar een einde aan: de standaard bood javascript-api’s aan voor rechtstreekse toegang tot allerlei apparaten.

De toegang tot audio- en videoapparaten, maar ook tot schermdeling, krijg je in de javascript-api MediaDevices en dan specifieker de functie getUserMedia. WebRTC bouwt hierop dan ook voort. Als een WebRTC-app de functie getUserMedia aanroept, komt je browser met de vraag om de website toegang te geven tot je webcam en microfoon.

WebRTC werkt peer-to-peer, wat betekent dat de communicatie rechtstreeks tussen de clients gebeurt. Maar bij het opbouwen van de verbinding is er nog wel een server nodig. Die server helpt beide clients om elkaars publieke ip-adres en poort uit te wisselen als ze NAT (Network Address Translation) gebruiken. Dat heet een STUN-server (Session Traversal Utilities for NAT).

In sommige netwerken is een STUN-server niet voldoende en dan heeft WebRTC voor de communicatie een TURN-server nodig (Traversal Using Relays around NAT). Die stuurt continu het verkeer door tussen beide clients. Dat lijkt op het eerste gezicht een veiligheidsrisico, want de TURN-server kan al het verkeer tussen de clients afluisteren, maar dat is het niet: WebRTC verplicht het gebruik van encryptie.

WebRTC en privacy

We kennen allemaal encryptie in de browser in de vorm van https: http-verkeer dat versleuteld is met behulp van tls. Maar realtime communicatie kan tls niet gebruiken, want tls is een protocol gebaseerd op tcp. En tcp gebruikt een handshake die voor elk verstuurd pakketje een bevestiging vraagt, wat extra vertraging introduceert. Realtime communicatie verloopt daarentegen altijd over udp, dat pakketjes gewoon negeert als ze niet arriveren. Enkele verloren pakketjes hoor je toch niet.

Gelukkig bestaat er ook voor udp-verkeer een standaard encryptieprotocol: Datagram Transport Layer Security (dtls). De nieuwste versie, dtls 1.2, is gebaseerd op tls 1.2. WebRTC gebruikt dtls om na de verbindingsopbouw met een STUN-server op een veilige manier encryptiesleutels uit te wisselen.

Daarna wordt de mediastream door Secure Real-time Transport Protocol (srtp) doorgestuurd, versleuteld met de sleutels die door dtls werden uitgewisseld. Het gebruik van het onversleutelde Real-time Transport Protocol (rtp) is expliciet verboden in de WebRTC-specificatie.

Er zit één grote zwakheid in de encryptie van WebRTC. Srtp versleutelt alleen maar de ‘payload’ van pakketjes, maar niet de header. Daardoor kan een turn-server de communicatie die ze doorstuurt niet afluisteren, maar ze kan er wel nuttige metadata uithalen.

Zo bevat de header de audioniveaus van de versleutelde mediastream. Iedereen die srtp-pakketjes kan onderscheppen, kan daaruit bijvoorbeeld afleiden of de gebruiker aan het spreken is of niet. Je kunt je voorstellen dat dat in sommige omstandigheden al gevoelige informatie is.

Een ander nadeel heeft te maken met het peer-to-peer-aspect: omdat clients rechtstreeks met elkaar spreken, kennen ze elkaars ip-adres. Voor anonimiteit is WebRTC dus niet geschikt, tenzij je extra maatregelen neemt.

Codecs

Elke webbrowser die WebRTC-ondersteuning zegt te hebben, is verplicht om de videocodecs VP8 en AVC / H.264 te ondersteunen. Van die laatste is alleen het profiel Constrained Baseline (CB) verplicht. Dat is een subset van het algemene profiel, specifiek ontworpen voor videoconferencing. WebRTC specificeert ook enkele AVC-parameters die de webbrowser op een specifieke manier moeten ondersteunen. Naast deze twee verplichte videocodecs ondersteunen Chrome en Firefox ook VP9, de opvolger van VP8.

De verplichte audiocodecs voor WebRTC zijn Opus en G.711 PCM (A-law en µ-law). Opus is de voorkeurscodec en hij wordt vaak gebruikt in combinatie met VP9. G.711 is geschikt als je alleen audio gebruikt en minder bandbreedte hebt. Daarnaast ondersteunen Chrome en Safari ook iLBC (Internet Low Bitrate Codec) en iSAC (Internet Speech Audio Codec). Chrome, Firefox en Safari ondersteunen ook G.722, dat een betere audiokwaliteit biedt dan G.711.

De ontwikkeling van WebRTC

2010 - Google koopt On2 Technologies, de eigenaar van de VP8-videocodec, en Global IP Solutions, dat realtime spraak- en videosoftware voor ip-netwerken ontwikkelt.

2011 - Google maakt de technologie van Global IP Solutions opensource onder de naam WebRTC en ondersteunt deze in Chrome 23.

2013- Firefox 20 ondersteunt WebRTC. Het eerste WebRTC-videogesprek tussen Chrome en Firefox wordt gevoerd.

2014 -Google Hangouts gebruikt een variant van WebRTC.

2017 - WebRTC 1.0 wordt een W3C Candidate Recommendation en wordt ondersteund door Microsoft Edge en Safari 11.

Zelf aan de slag

Op de website van het WebRTC-project vind je allerlei handleidingen om aan de slag te gaan. Uiteraard is de informatie daar nogal op Google gefocust. Zo wordt er verwezen naar Googles ontwikkelplatform Firebase. Ook Mozilla heeft een boel informatie over WebRTC beschikbaar op MDN Web Docs.

Hoewel WebRTC een open standaard is, verschilt de ondersteuning in diverse webbrowsers nog wel. Google heeft een javascript-bibliotheek ontwikkeld waardoor je in je WebRTC-webapp geen rekening hoeft te houden met die verschillen: Adapter.js. Het enige wat je hoeft te doen is het bestand adapter.js als script in je webpagina invoegen en dan de WebRTC-specificatie letterlijk te volgen: adapter.js voert zelf browserspecifieke aanpassingen door.

Geschreven door: Koen Vervloesem op

Category: Nieuws, Internet

Tags: standaard, webrtc