Future of QUIC in Stream

Roman Arutyunyan arut at nginx.com
Fri Apr 7 14:28:43 UTC 2023

Hi everyone,

As we are approaching the merge of QUIC code into mainline, there's one
important issue that's still on the table.  That's QUIC in Stream[1].

In nginx-quic branch[2], QUIC is supported both in http and Stream.  In http,
there are two application-level protocols supported by nginx, which are HTTP/3
and hq-interop (HTTP/0.9 over QUIC).  Stream only supports plain QUIC without
an application-level protocol involved.

  http {
      server {
          listen 8443 quic;
          # the defaults
          #http3 on;
          #http3_hq off;
  stream {
      server {
          listen 9443 quic;

While QUIC in Stream has been a handy tool for testing QUIC implementation in
its early days, the truth is, we don't see many application-level protocols
other that HTTP/3, that work over QUIC.

One such protocol is DNS-over-QUIC (DoQ) [3].  If you try to make it work over
a generic QUIC proxy in Stream, you'll quickly realize that DoQ uses DNS/UDP
packet format, rather DNS/TCP, so it cannot be proxied to a TCP backend.
As a result, DoQ support would require a separate module for dealing with DNS
packet prefix.

HTTP/3 cannot be proxied by a generic QUIC -> TCP proxy as well.

Considering the above, our current plan is to remove QUIC support from Stream
before the merge.  In future we may bring it back depending on availability of
application-level protocols that work over QUIC.

We are open for feedback about QUIC in Stream, application protocols and
the features you expect in Stream.

[1] https://nginx.org/en/docs/stream/ngx_stream_core_module.html
[2] https://hg.nginx.org/nginx-quic/
[3] https://www.rfc-editor.org/rfc/rfc9250.html

Roman Arutyunyan

More information about the nginx mailing list