|
libwebsockets
Lightweight C library for HTML5 websockets
|
libwebsockets supports WebTransport (RFC 9297) and QUIC Datagrams (RFC 9221) natively over its HTTP/3 and QUIC transport layers. WebTransport is an API that provides low-latency, bidirectional, multiplexed, and secure client-server messaging.
WebTransport offers several architectural advantages over WebSocket, particularly in high-performance or lossy networking environments:
| Feature | WebSocket (ws) | WebTransport (wt) |
|---|---|---|
| Transport Protocol | TCP (HTTP/1.1 or HTTP/2) | UDP (QUIC via HTTP/3) |
| Multiplexing | Built-in for H2, none for H1. | Native QUIC streams (multiple independent streams without head-of-line blocking). |
| Delivery Guarantees | Reliable, strictly ordered. | Offers both reliable streams and unreliable Datagrams. |
| Connection Setup | Requires 1-3 RTTs (TCP + TLS + HTTP). | 0-RTT or 1-RTT (QUIC handshake). |
| Security | TLS 1.2 or 1.3 | Always TLS 1.3 (embedded in QUIC). |
Use WebSocket when you need maximum backward compatibility across older clients, infrastructure, and proxies. Use WebTransport when you require low-latency media streaming, gaming, or parallel data transfers where head-of-line blocking is unacceptable.
WebTransport in libwebsockets maps elegantly to the wsi (WebSocket Instance) abstraction. WebTransport requires an HTTP/3 virtual host.
A WebTransport connection starts with an HTTP/3 CONNECT request specifying the :protocol: webtransport pseudo-header. If accepted, libwebsockets transitions this wsi to the wt role (&role_ops_wt).
Within the WebTransport session, you can spawn multiple independent QUIC streams.
Ensure your context and vhost are configured with HTTP/3 support and TLS:
Implement the protocol callback. Distinguish between the session and its streams using lws_wt_is_session(wsi):
Major web browsers (Chrome, Firefox, Safari) support the WebTransport JavaScript API. However, browsers strictly enforce TLS certificates for WebTransport.
If you are developing locally with self-signed certificates, the browser will instantly reject the connection. You can bypass this during development in Chromium-based browsers using:
Alternatively, you can provide the SHA-256 hash of your self-signed certificate in the JavaScript WebTransport constructor's serverCertificateHashes option.