neqo icon indicating copy to clipboard operation
neqo copied to clipboard

Should Neqo support the HTTP DATAGRAM Capsule?

Open mxinden opened this issue 4 months ago • 4 comments

3.5. The DATAGRAM Capsule

This document defines the DATAGRAM (0x00) Capsule Type. This Capsule allows HTTP Datagrams to be sent on a stream using the Capsule Protocol. This is particularly useful when HTTP is running over a transport that does not support the QUIC DATAGRAM frame.

https://www.rfc-editor.org/rfc/rfc9297.html#section-3.5

One use-case would be proxying an HTTP/3 connection over a MASQUE connect-udp HTTP/3 proxy connection (https://github.com/mozilla/neqo/pull/2796), where the proxy connection does not support the QUIC datagram extension.

Asked differently, do we expect wide deployments of MASQUE connect-udp proxy servers without the QUIC datagram extension?

Note that this is not relevant for WebTransport datagrams, as WebTransport requires WebTransport datagrams to be sent via QUIC datagrams:

WebTransport over HTTP/3 also requires support for QUIC datagrams. To indicate support, both the client and the server MUST send a max_datagram_frame_size transport parameter with a value greater than 0 (see Section 3 of [QUIC-DATAGRAM]).

Any WebTransport requests sent by the client without enabling QUIC and HTTP datagrams MUST be treated as malformed by the server, as described in Section 4.1.2 of [HTTP3].

https://www.ietf.org/archive/id/draft-ietf-webtrans-http3-13.html#section-3.1

mxinden avatar Aug 11 '25 12:08 mxinden

Asked differently, do we expect wide deployments of MASQUE connect-udp proxy servers without the QUIC datagram extension?

Do we know what Fastly supports? I'd prioritize it accordingly.

larseggert avatar Aug 11 '25 12:08 larseggert

Given where things are going with respect to discussion of intermediating MASQUE and the capsule protocol stuff, I would say the answer is yes. The concern here is that some intermediaries might relay the HTTP/2 version without rewriting capsules.

It should be relatively easy to parse and pass along in much the same way as a frame. The only trick I can see is in managing the weirdness you get as a result (like datagrams that span multiple packets).

martinthomson avatar Aug 11 '25 21:08 martinthomson

@WaterWhisperer in case you are looking for another challenge, this might be interesting for you. It is a bit more involved than https://github.com/mozilla/neqo/pull/3077/ as it requires reading the above linked RFCs. Also happy to suggest alternatives, in case you are generally interested, just not in this particular one. E.g. https://github.com/mozilla/neqo/pull/3102 might be interesting.

mxinden avatar Nov 03 '25 23:11 mxinden

@WaterWhisperer in case you are looking for another challenge, this might be interesting for you. It is a bit more involved than #3077 as it requires reading the above linked RFCs. Also happy to suggest alternatives, in case you are generally interested, just not in this particular one. E.g. #3102 might be interesting.

@mxinden Thanks! Well, I don't know if I can do it, but I'd like to give it a try. Thanks again for your guidance and trust!

WaterWhisperer avatar Nov 04 '25 13:11 WaterWhisperer