presentations/quic/quic.md

177 lines
5.3 KiB
Markdown

---
title:
- QUIC with GStreamer & Rust
author:
- Sanchayan Maity
theme:
- default
classoption:
- aspectratio=169
---
# Who
- Who am I?
* Embedded Systems background
* Prefer C, Haskell and Rust
* Organize and speak at Rust and Haskell meet-ups in Bangalore
- Work?
* Software Engineer @ [asymptotic](https://asymptotic.io/)
* Open source consulting firm based out of Bangalore and Toronto
* Work on low level systems software centred around multimedia
* GStreamer, PipeWire, PulseAudio
* Language Polyglots
# Open source contributions
- [GStreamer](https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests?scope=all&state=all&author_username=SanchayanMaity)
- [gst-plugins-rs](https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests?scope=all&state=all&author_username=SanchayanMaity)
- [PipeWire](https://gitlab.freedesktop.org/pipewire/pipewire/-/merge_requests?scope=all&state=all&author_username=SanchayanMaity)
- [PulseAudio](https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests?scope=all&state=all&author_username=SanchayanMaity)
- [Linux](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/log/?qt=author&q=Sanchayan+Maity)
- [u-boot](https://source.denx.de/u-boot/u-boot/-/commits/master?search=Sanchayan%20Maity)
# Agenda
- QUIC which is a UDP-Based Multiplexed and Secure Transport and standardized in RFC 9000
- Whirlwind tour of GStreamer
- QUIC implementations in Rust
- QUIC support in GStreamer
- Demo
- Future work
# QUIC
- QUIC is pronounced exactly like the English word "quick"
- Not an acronym
- Reliable and secure transport protocol
- Addresses some of the known shortcomings of doing HTTP/2 over TCP and TLS
- Standardized QUIC in RFC 9000
- Supported by RFC 8999, RFC 9001 and RFC 9002
# Building on shoulders of giants
- HTTP/2 [RFC7540](https://www.rfc-editor.org/rfc/rfc7540) published in May 2015
- Makes use of multiplexing
- Multiple logical streams over same logical connection
- Better congestion control
- Makes better use of TCP with bandwidth saturation
- Less bandwidth consumption due to header compression
# Head of line blocking[^1]
![*_HOL Blocking_*](HOL_blocking.png){width=80%}
[^1]: [Head of line blocking](https://en.wikipedia.org/wiki/Head-of-line_blocking)
# Protocol
- Something new?
- TCP?
- UDP?
# Security/encryption
- No clear text version of the protocol
- Negotiation employs cryptography and security with TLS 1.3
# QUIC
- Implemented on top of UDP
- Uses UDP port numbers
- Implements re-transmission, congestion control among others
- Logical streams similar to HTTP/2
- In-order
- Reliable
- Different streams can be out-of-order
- Flow control
- Fast handshakes (0-RTT and 1-RTT)
# GStreamer
- Multiplatform Pipeline based multimedia framework
- Bindings for various languages
- Allows building complex media processing workflows
- Some applications
* PiTiVi (Video Editor)
* amaroK, Banshee, Clementine (audio players)
* Empathy (VOIP and video conferencing)
* GstLAL (gravitational wave data analysis)
* Rygel (DLNA streaming server and renderer)
* Totem (movie player for the GNOME desktop)
# Simple pipeline
```bash
gst-launch-1.0 videotestsrc ! autovideosink
gst-launch-1.0 audiotestsrc ! autoaudiosink
```
# Media pipeline[^2]
![*_Simple Player_*](simple-player.png){width=80%}
[^2]: [Dynamic Pipelines](https://gstreamer.freedesktop.org/documentation/tutorials/basic/dynamic-pipelines.html?gi-language=c)
# Rust implementations
- [quinn-rs](https://github.com/quinn-rs/quinn)
- [quiche](https://github.com/cloudflare/quiche)
- [s2n-quic](https://github.com/aws/s2n-quic)
- [neqo](https://github.com/mozilla/neqo)
- [msquic](https://github.com/microsoft/msquic)
# QUIC in GStreamer
- Prior work
- [gst-quic-transport](https://github.com/bbc/gst-quic-transport)
- `quinnquicsink` and `quinnquicsrc` (Merged just a month ago)
- Written in Rust
- Uses [quinn-rs](https://github.com/quinn-rs/quinn)
- New elements `quinnquicmux` and `quinnquicdemux` to support stream multiplexing
# Audio demo
```bash
gst-launch-1.0 -v -e audiotestsrc blocksize=4096 ! \
audio/x-raw,format=S16LE,rate=48000,channels=2,layout=interleaved ! \
opusenc ! quinnquicsink use-datagram=false secure-connection=false
```
```bash
gst-launch-1.0 -v -e audiotestsrc blocksize=4096 ! \
audio/x-raw,format=S16LE,rate=48000,channels=2,layout=interleaved ! \
opusenc ! quinnquicsink use-datagram=false secure-connection=false
```
# Video demo
[quin-quic-mux](https://git.sanchayanmaity.net/sanchayanmaity/quinn-quic-mux)
- Shows stream and datagram multiplexed on same connection
- Merge request: [!1634](https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/1634)
# Future work
- Handling flow control
- Congestion control
- [RTP over QUIC](https://datatracker.ietf.org/doc/draft-ietf-avtcore-rtp-over-quic/)
- [Media over QUIC](https://datatracker.ietf.org/group/moq/about/)
# References
- [RFC 9000](https://www.rfc-editor.org/rfc/rfc9000.html)
- [Road to QUIC](https://blog.cloudflare.com/the-road-to-quic)
- [0-RTT](https://blog.cloudflare.com/even-faster-connection-establishment-with-quic-0-rtt-resumption/)
# Questions
- Reach out on
* Email: sanchayan@sanchayanmaity.net
* Mastodon: [sanchayanmaity.com](https://sanchayanmaity.com/@sanchayan)
* Telegram: https://t.me/SanchayanMaity
* Blog: [sanchayanmaity.net](https://sanchayanmaity.net/)