Since I am the "maintainer of picoquic" quoted in the zhangph's email, let me provide a bit more context.

The generic behavior in parsing settings is to ignore anything that the local implementation does not understand. RFC 9114 says that, and then also says a bit later that some settings should not be just ignored, but also ignored with prejudice. The prejudice applies to the 5 parameters that are defined in HTTP2 but have no meaning in HTTP3, but as it is written it would also apply to all new parameters that will be defined for HTTP2 in the future but do not apply to HTTP3. That latter requirement is, shall we say, not entirely realistic.

Coming back to the distinction between "ignore" and "ignore with prejudice". The main reason for that requirement is to enforce that any implementation that errs into reusing HTTP2 parameters for H3 will encounter so many connection failures that it would have no choice but to fix their code. It is a classic consequence of the "Postel was wrong" argument: by providing stark consequences to any deviation of the standard, we ensure that the standard remains pure.

We have a couple of similar prohibitions in RFC9000, and we generally adopted a "MUST ignore, MAY yell" pattern. This is a practical solution, because if enough implementations do the "MAY" part, the deviants will still be whacked into compliance. At the same time,  we let constrained implementations decide whether they should add code to implement the punishment. We also make sure that these implementations will not be bothered by over-zealous protocol verifiers.

My position is that RFC 9114 should have adopted the "MUST ignore, MAY yell" pattern, and that mandating all implementations to police this kind of thing is overreach worthy of an errata.

As for protocol purity, I don't think that flogging these 5 specific code points will have a big effect on the purity of the ecosystem. Deviants have almost 2^62 potential codes to experiment with, blocking 5 of them is not likely to make a difference.

And as for picoquic, we just checked in a PR to fail the connection if the settings include one of these five codes. Turns out that we already had a switch statement listing the code points that should not be expected, and returning an error for the 5 contentious values costed just 8 lines of code...

-- Christian Huitema


On 6/10/2026 6:50 PM, Lucas Pardue wrote:
Thanks for the added context. I asked Claude Opus 4.5 to survey open source 
implementations of HTTP/3. I have not verified the full results for all 
surveyed. Take with pinch of salt. But can speak authoritative for Cloudflare 
quiche as a maintainer.

7 implementations reject 5 reserved  codepoints (0x0, 0x2-0x5) - Cloudflare 
quiche, aioquic, hyperium/h3, haproxy, haskell http3, eclipse jetty, 
cowlib/cowboy

9 implementations reject 4 reserved codepoints (0x2-0x5). They all fail to 
reject 0x0. HTTP/2 itself reserves 0x0 for no use, see IANA. nghttp3, lsquic, 
msquic (.net), neqo, Google quiche, netty, ocaml-quic, libhttp.zig, quiver

9 implementations ignore these reserved settings. quic-go, proxygen, picoquic, 
nginx, xquic, flupke/kwik, h2o/quicly, ATS, deno

I'd summarise this as an inconsistent application of the intent of RFC 9114. 
However, I don't think the fault lies solely on the RFC 9114 shoulders nor 
implementations. IANA has a reserved value for HTTP/2's 0x0, which cites RFC 
9113 but there doesnt seem to be anything there. RFC 7540 seems quiet on 0x0 
too. RFC 9114 explicirly reserves 0x0, it also has a section discussing H2 
settings - A.3 - 0x0 is not mentioned there.

So we are in a bit of an awkward situation that likely warrants deeper thinking 
than a spot fix in just one RFC.

Cheers
Lucas

On Thu, Jun 11, 2026, at 01:38, zhangph wrote:
Thank you both for the detailed analysis.



I'd like to present a concrete example of the ambiguity in practice. The 
maintainer of picoquic (a widely-deployed HTTP/3 implementation) encountered 
exactly this issue when reviewing a bug report about reserved setting 
identifiers:



https://github.com/private-octopus/picoquic/issues/2126



In response to the report, the project maintainer wrote:



"The spec also says that 'An implementation MUST ignore any parameter with an 
identifier it does not understand.' Picoquic does not understand these parameters, so it 
ignores them."



"The requirement to break the connection is probably a bug in RFC 9114, that should 
be fixed in its next revision."



In other words, an experienced implementer of this RFC read the general rule in Section 
7.2.4 ("MUST ignore unknown") and concluded that it applies to reserved 
identifiers — and further concluded that the specific requirement in Section 7.2.4.1 is 
itself the error. This is precisely the ambiguity I am highlighting.



I agree this erratum may not warrant a technical correction. But I believe this 
real-world evidence supports Hold for Document Update — the current wording has 
led at least one prominent implementer to a reasonable but incorrect reading of 
the document.


Reply via email to