Is QUIC in WebRTC a solution looking for a problem or a real requirement?
Three and a half years later, and we still don’t really have QUIC in WebRTC – at least not until last month. Google decided to come out with a new RTCQUICTransport for WebRTC in Chrome and written a post about it on their Chrome Developers site.
UDP, TCP, SCTP & QUIC. How do these transport protocols compare?
What is QUIC again?
I am not going to go into the technical details – I’ve done that in the past already, and there are other places for that. I want to focus here on the bigger picture.
If you look at the timeline of web transport protocols, it looks something like this:
We had TCP and UDP for some 40 years now. HTTP 1.1 is defunct, but runs most of the internet at the moment. HTTP/2 is growing nicely in adoption. According to W3Techs, we’re standing on ~33% adoption for HTTP/2 (Feb 2019):
HTTP/2 came to be after Google came out with SPDY, a “fix” for HTTP and got parts (most?) of it wrapped into HTTP/2 to get it standardized.
HTTP 1.0, 1.1 and HTTP/2 are all built on top of TCP. Signaling, which requires reliability and causality won’t work on top of UDP without adding these characteristics. After around 40 years, it is time for a refresh. Enter QUIC. It uses UDP and works in ways that are better than TCP for signaling purposes.
QUIC follows a similar path – Google created it to “fix” the ailments of HTTP over TCP. the end goal here is to turn it into HTTP/3.
Since QUIC is built on top of UDP, it can handle a lot more than just HTTP signaling. Which is why it is becoming an interesting topic for WebRTC –
Where QUIC in WebRTC fits exactly?
This is the real question. My answer to it in 2015 was this:
There are two places where QUIC fits in WebRTC:
1. In the signaling, which is out of scope of WebRTC, but interesting, as it enables faster connection of the initial call (theoretically at least)
2. In the data channel, by replacing SCTP with QUIC wholesale
Google’s answer in their post on Chrome Developers blog?
A powerful low level data transport API can enable applications (like real time communications) to do new things on the web. You can build on top of the API, creating your own solutions, pushing the limits of what can be done with peer to peer connections, […] WebRTC’s NV effort is to move towards lower level APIs, and experimenting early with this is valuable.
The QUIC protocol is desirable for real time communications. It is built on top of UDP, has built in encryption, congestion control and is multiplexed without head of line blocking.
Hmm… somehow they lost me in that explanation somewhere. This is about real time communications. It is about doing stuff on top of UDP. And it is about low level APIs. Great. Why do I need it again? For voice and video I already have SRTP in WebRTC. The SCTP data channel works quite well. So where exactly do I need this great thing called QUIC in WebRTC?
I think there’s merit, but it is in totally different places.
QUIC is about having a single, modern, common transport protocol for the web.
Here’s what we do today with WebRTC in terms of transport protocols:
- HTTPS, HTTP/2 or WebSocket for our signaling, which runs over TCP/TLS
- SRTP for media, which runs over UDP
- SCTP for data channels
There’s this popular drawing from the High Performance Browser Networking book that shows this amalgamation of protocols:
So many transport protocols in a single standard. This makes implementations of the backend more complex, as they need to be able to understand all these transport protocols as well. One can say that this is already common enough and widely used already that it is a solution looking for a problem, but the developer in me can appreciate unifying all these functionality over a single transport protocol.
Here’s how life will look like with QUIC in WebRTC:
- QUIC is being planned for HTTP/3, so it can be used for WebRTC signaling moving forward (replacing both WebSocket and HTTP/2)
- QUIC is looked as an SRTP replacement, which means sending real time audio and video can take place on top of it
- QUIC can replace SCTP for the data channels (that was the obvious use of QUIC in WebRTC to begin with)
Putting it into an architecture diagram of my own, we get this:
What do we gain?
Theoretically, we can multiplex signaling, voice, video and low latency data in a single QUIC connection. That’s powerful:
- We can now tunnel or proxy all that WebRTC traffic with a lot less logic, boxes and code in our servers
- For smaller deployments, we might not even need multiple servers – just the one that handles it all
- It makes developing web servers that handle media and data channels simpler, as they need to support only one transport – QUIC, instead of having to implement multiple transports
What do we lose?
This isn’t going to happen in a day. Getting there is going to be a journey of multiple years and people will complain and whine about it along the way. Similar to what is happening today with WebRTC – whenever something is modified or something new is added – things tend to break (either because APIs get deprecated, behavior changes or just pure bugs).
Moving to a QUIC based stack is a huge undertaking – for the WebRTC stack, browser vendors and all the related internet infrastructure vendors.
Connecting to other realms such as SIP? That’s going to get even harder, as we move away from the domain of SRTP towards QUIC, more translations and protocol interworking will be required.
The question then becomes – is it worth all the fuss? Are we gaining enough to make this effort worthwhile?
Can you use QUIC in WebRTC now?
To some extent you can. Check out the recent post on QUIC @ webrtcHacks for that.
I will be adding a new dedicated lesson to my online WebRTC course about QUIC – my goal is to have the most up to date and relevant WebRTC training curriculum in the market, so keeping up with these changes comes with the territory.
Interested in WebRTC? Check out my WebRTC course.