Draft: draft-ietf-quic-http

Commentary: This overhauls the system for IANA registries to use a unified scheme that allows provisional registration . This seems pretty complicated in terms of nailing down all the corner cases , but it is fairly simple in practice : Provisional registration is easy , it only requires that the requester provide contact information and ( ideally ) the codepoint they want . They could provide more , but at their discretion . Permanent registration requires that you fill out the fields . Experts are required for both , but only really to prevent spam . We have a few more requirements for permanent registrations of frame types , but that is more for the purposes of advice , because sending an new frame leads to protocol errors if you have n't agreed to that in the past . I 've sketched out a strawman for a codepoint reclamation process . That advises that experts try to find some use of the codepoint . There is a date on registrations that can guide the selection of codepoints to reclaim , but these can be updated any time by anyone who wants to keep the registration " live " . I wanted to sketch this out for transport first , but I intend to update this PR with changes to the HTTP draft if these policies are agreeable . 
 Could contact information be replaced with a domain name . There is much abuse of contact information and domain names can have private contact information ? Also , maintaining an email address is harder over time . I realize the field contact field does n't say email , but that is sort of implied . 
 You can specify this so that IANA collects the information and thus can follow up if needed , but where the registry does not display this information . I understand that the authors of RFC 8126 are working on a bis that will make this much more common , if not the default . You can also split the contact information from the change controller , if you want to have , say  be the contact but Example Corp be the change controller . There 's also a presumption that if the change controller is gone that the change controller for the entire registry ( usually the IESG ) can make a determination of what to do in the case that a change is needed . For many registries this amounts to " do nothing " since there is no scarcity of code points . In the case of scarcity , that 's how you get re - use when the change controllers are gone .   I did that intentionally , mostly just to avoid the wordy reference . I 'm happy to defer to you on that . ( Julian can say " told you so " again if he likes :) 
 We have nice registration policies for everything , but that does n't serve for experimentation very well , because those experiments can clobber each other . See also RFC 6648 . The proposal here is to allow for permanent registrations ( under the same rules we have now ) , but to allow FCFS provisional registrations so that we avoid collisions when people start experiments that could be widely deployed . We should also encourage people to choose random values rather than sequential ones . 
 Does resolve this ? 
 As of , transport parameter identifiers are 16bit integers , with a registry where uses the is reserved for experimentation While keeping Specification Required makes sense for a good chunk of the registry space , I think there will be many experiments that are conducted before a full specification is written ( some already exist today and I expect there to be many many more once the protocol is standardized ) . However , those experiments only have 256 values to play with , and that is bound to cause collisions and headaches down the road . I think the simplest solution to this problem is to use variable length integers for transport parameter identifiers . The TLS presentation language does n't support them but since we already use VLIs for the values of several transport parameters we 're no longer bound by the TLS presentation language . I think there was also support for doing this when it was discussed on , but that issue was closed when the values were changed to VLI with , without changing the identifiers . I 'm happy to write the PR if this issue gathers support . 
 You are n't the first to suggest this one . Let 's make sure we at least discuss this directly . We did discuss this in the context of the issues that you cite and decided not to , but that was never the central question . From our perspective , this is n't a significant change to code . 
 The same for us , too . Am I understanding correctly that the concern here is that extensions of TLS structures tend to use uint16_t as their type identifiers , and that the reusable parser might be constrained to that design pattern ? 
 I thought that this might be the case originally , but it turns out that the blob for transport parameters is generated by QUIC code in mostly all of the cases I have seen . If there is someone out there who is relying on passing a TLS stack a structured grammar and letting the TLS stack perform serialization , then we might want to just leave this alone . 
 Thank you for the clarification . We do use the TLS stack to encode / decode the transport parameters , therefore we do want see the TLS grammar - based design being preserved . The reason we do not mind the extension type being a varint is because our codec is flexible enough to handle that . 
 We should definitely do something to increase the number of experimentation codepoints from 256 . Changing to a varint sounds good . If not , then we should allocate more of the space(ie : [ 0xf000 - 0xffff ] ) to experiments . 
 I agree with and I do n't think we need to go varint here , that seems like a bit of an overkill . How about reserving 4096 codepoints for spec required , and leaving the rest ( 2 ^ 16 - 2 ^ 12 = ) for experimentation : [ 0x0000 - 0x0fff ] uses the RFC8128 Specification Required policy [ 0x1000 - 0xffff ] is reserved for experimentation 
 Apart from the fact that we want to limit changes at this stage , are there arguments against going varint here ? It feels pretty odd that many transport parameters are TLVs where T and L are 16bit and V is varint . 
 I do n't have much of an argument here besides the general principle that we should n't provide more flexibility than is necessary . I do n't think it 's odd that T is fixed - length while the V is varint , FWIW . If no implementations are bothered by the change to varint , then it 's a bit of a bikeshed . Let 's see if other implementers are bothered . 
  in two ? what the same size ? Do n't forget there is also GREASE TP now 
 From looking at all the integer fields in QUICv1 , it looks like at this point everything is a varint except the versions , packet numbers , connection ID lengths ( which all have valid reasons for their lengths ) , and the transport parameter identifier and transport parameter lengths . Switching transport parameters to QUIC format ( as opposed to TLS presentation language ) feels fitting to me , saves bytes on the wire , and will facilitate innovation down the road . 
 I 'm happy to make transport parameter identifier a varint . Are you(implicitly ) suggesting that transport parameter lengths should be varint as well ? 
 I think so , yes . If we 're changing implementations might as well make both changes at once ( assuming no one wants one of them to be varint but not the other ) . 
 I 'd be opposed to changing the transport parameter lengths to varints , as that means departure from the TLS notation that we use for defining TPs . It 's very different from changing the IDs to varints , which is just changing the type of a particular variable . IIRC , we discussed if we should switch to a different notation , and decided to go with the TLS - based design . At least I have built ( or maintained ) code based on that . 
 I agree with  here : splitting it in half would make plenty of room 
 I 'm in favor of the change that is suggesting in . There 's no reason for us to use TLS presentation language , if anything , it just makes the spec harder to read for people who are unfamiliar with the TLS presentation language ( if I remember correctly , this came up multiple times on issues here and / or on Slack ) . 
 Remember the experience with the X - Options in SMTP or HTML ? Do we really want to replicate that ? 
 Discussed in Cupertino . to open a new  issue to only replace the TLS syntax with something easier to understand . to also do a Design PR to shuffle the assigned ranges in the registry . 
 As discussed in Cupertino , I have closed previous PR and replaced it with : editorial - only PR IANA policy PR 
 I think that the RFC 6648 lessons need to be considered carefully here . I think that it would be better to use a combination of random selection and provisional registration as a means of handling experiments . Random selection means that we end up colliding with very low probability ; provisional registration ensures that registrations are protected . Making the private use space larger does neither . I would prefer to instead remove the private use space completely . 
 In lots of places , you reference    - policy } } for things that are n't actually described there -- it just contains a pointer to the QUIC spec for the policy . It might be better to point directly to the QUIC spec in those places . ( Though given that the section number in QUIC could potentially change , it 's also a reasonable argument that we want to have one place to update . ) Just want to make sure that 's intentional , rather than a copy - paste of the policy from the QUIC registries .
Paragraph (version B):
This document registers a new ALPN protocol ID (iana-alpn) and
creates new registries that manage the assignment of codepoints in
HTTP/3.
Paragraph (version A):
This document establishes a registry for HTTP/3 frame type codes.
The "HTTP/3 Frame Type" registry governs a 62-bit space.  This space
is split into three spaces that are governed by different policies.
Values between "0x00" and "0x3f" (in hexadecimal) are assigned via
the Standards Action or IESG Review policies RFC8126.  Values from
"0x40" to "0x3fff" operate on the Specification Required policy
RFC8126.  All other values are assigned to Private Use RFC8126.
Paragraph (version B):
New registries created in this document operate under the QUIC
registration policy documented in Section 22.1 of QUIC-TRANSPORT.
These registries all include the common set of fields listed in
Section 22.1.1 of QUIC-TRANSPORT.
Paragraph (version B):
The initial allocations in these registries created in this document
are all assigned permanent status and list as contact both the IESG
(iesg@ietf.org) and the HTTP working group (ietf-http-wg@w3.org).
Paragraph (version B):
This document establishes a registry for HTTP/3 frame type codes.
The "HTTP/3 Frame Type" registry governs a 62-bit space.  This
registry follows the QUIC registry policy; see iana-policy.
Permanent registrations in this registry are assigned using the
Specification Required policy RFC8126, except for values between 0x00
and 0x3f (in hexadecimal; inclusive), which are assigned using
Standards Action or IESG Approval as defined in Section 4.9 and 4.10
of RFC8126.
Paragraph (version A):
The 62-bit code assigned to the frame type.
Paragraph (version A):
A reference to a specification that includes a description of the
frame layout and its semantics, including any parts of the frame
that are conditionally present.
Paragraph (version A):
This document establishes a registry for HTTP/3 settings.  The
"HTTP/3 Settings" registry governs a 62-bit space.  This space is
split into three spaces that are governed by different policies.
Values between "0x00" and "0x3f" (in hexadecimal) are assigned via
the Standards Action or IESG Review policies RFC8126.  Values from
"0x40" to "0x3fff" operate on the Specification Required policy
RFC8126.  All other values are assigned to Private Use RFC8126.  The
designated experts are the same as those for the "HTTP/2 Settings"
registry defined in HTTP2.
Paragraph (version B):
Specifications of frame types MUST include a description of the frame
layout and its semantics, including any parts of the frame that are
conditionally present.
Paragraph (version B):
The entries in iana-frame-table are registered by this document.
Paragraph (version B):
This document establishes a registry for HTTP/3 settings.  The
"HTTP/3 Settings" registry governs a 62-bit space.  This registry
follows the QUIC registry policy; see iana-policy.  Permanent
registrations in this registry are assigned using the Specification
Required policy RFC8126, except for values between 0x00 and 0x3f (in
hexadecimal; inclusive), which are assigned using Standards Action or
IESG Approval as defined in Section 4.9 and 4.10 of RFC8126.
Paragraph (version A):
The 62-bit code assigned to the setting.
Paragraph (version A):
An optional reference to a specification that describes the use of
the setting.
Paragraph (version A):
The value of the setting unless otherwise indicated.  SHOULD be
the most restrictive possible value.
Paragraph (version A):
This document establishes a registry for HTTP/3 error codes.  The
"HTTP/3 Error Code" registry manages a 62-bit space.  The "HTTP/3
Error Code" registry operates under the "Expert Review" policy
RFC8126.
Paragraph (version A):
The 62-bit error code value.
Paragraph (version A):
A brief description of the error code semantics, longer if no
detailed specification is provided.
Paragraph (version A):
An optional reference for a specification that defines the error
code.
Paragraph (version A):
This document establishes a registry for HTTP/3 unidirectional stream
types.  The "HTTP/3 Stream Type" registry governs a 62-bit space.
This space is split into three spaces that are governed by different
policies.  Values between "0x00" and 0x3f (in hexadecimal) are
assigned via the Standards Action or IESG Review policies RFC8126.
Values from "0x40" to "0x3fff" operate on the Specification Required
policy RFC8126.  All other values are assigned to Private Use
RFC8126.
Paragraph (version A):
The 62-bit code assigned to the stream type.
Paragraph (version A):
A reference to a specification that includes a description of the
stream type, including the layout semantics of its payload.
Paragraph (version B):
The value of the setting unless otherwise indicated.  A default
SHOULD be the most restrictive possible value.
Paragraph (version B):
The entries in iana-setting-table are registered by this document.
Paragraph (version B):
This document establishes a registry for HTTP/3 error codes.  The
"HTTP/3 Error Code" registry manages a 62-bit space.  This registry
follows the QUIC registry policy; see iana-policy.  Permanent
registrations in this registry are assigned using the Specification
Required policy RFC8126, except for values between 0x00 and 0x3f (in
hexadecimal; inclusive), which are assigned using Standards Action or
IESG Approval as defined in Section 4.9 and 4.10 of RFC8126.
Paragraph (version B):
A brief description of the error code semantics.
Paragraph (version B):
The entries in the iana-error-table are registered by this document.
Paragraph (version B):
This document establishes a registry for HTTP/3 unidirectional stream
types.  The "HTTP/3 Stream Type" registry governs a 62-bit space.
This registry follows the QUIC registry policy; see iana-policy.
Permanent registrations in this registry are assigned using the
Specification Required policy RFC8126, except for values between 0x00
and 0x3f (in hexadecimal; inclusive), which are assigned using
Standards Action or IESG Approval as defined in Section 4.9 and 4.10
of RFC8126.
Paragraph (version B):
Specifications for permanent registrations MUST include a description
of the stream type, including the layout semantics of the stream
contents.
Paragraph (version A):
IANA [SHALL add/has added] a registry for "QUIC Transport Parameters"
under a "QUIC Protocol" heading.
Paragraph (version A):
The "QUIC Transport Parameters" registry governs a 16-bit space.
This space is split into two spaces that are governed by different
policies.  Values with the first byte in the range 0x00 to 0xfe (in
hexadecimal) are assigned via the Specification Required policy
RFC8126.  Values with the first byte 0xff are reserved for Private
Use RFC8126.
Paragraph (version A):
The numeric value of the assignment (registrations will be between
0x0000 and 0xfeff).
Paragraph (version A):
Additionally, each value of the format "31 * N + 27" for integer
values of N (that is, "27", "58", "89", ...) MUST NOT be assigned by
IANA.
Paragraph (version A):
IANA [SHALL add/has added] a registry for "QUIC Frame Types" under a
"QUIC Protocol" heading.
Paragraph (version A):
The "QUIC Frame Types" registry governs a 62-bit space.  This space
is split into three spaces that are governed by different policies.
Values between 0x00 and 0x3f (in hexadecimal) are assigned via the
Standards Action or IESG Review policies RFC8126.  Values from 0x40
to 0x3fff operate on the Specification Required policy RFC8126.  All
other values are assigned to Private Use RFC8126.
Paragraph (version A):
The numeric value of the assignment (registrations will be between
0x00 and 0x3fff).  A range of values MAY be assigned.
Paragraph (version A):
The nominated expert(s) verify that a specification exists and is
readily accessible.  Specifications for new registrations need to
describe the means by which an endpoint might determine that it can
send the identified type of frame.  An accompanying transport
parameter registration (see iana-transport-parameters) is expected
for most registrations.  The specification needs to describe the
format and assigned semantics of any fields in the frame.
Paragraph (version A):
Expert(s) are encouraged to be biased towards approving registrations
unless they are abusive, frivolous, or actively harmful (not merely
aesthetically displeasing, or architecturally dubious).
Paragraph (version A):
IANA [SHALL add/has added] a registry for "QUIC Transport Error
Codes" under a "QUIC Protocol" heading.
Paragraph (version A):
The "QUIC Transport Error Codes" registry governs a 62-bit space.
This space is split into three spaces that are governed by different
policies.  Values between 0x00 and 0x3f (in hexadecimal) are assigned
via the Standards Action or IESG Review policies RFC8126.  Values
from 0x40 to 0x3fff operate on the Specification Required policy
RFC8126.  All other values are assigned to Private Use RFC8126.
Paragraph (version A):
The numeric value of the assignment (registrations will be between
0x0000 and 0x3fff).
Paragraph (version B):
This document establishes several registries for the management of
codepoints in QUIC.  These registries operate on a common set of
policies as defined in iana-policy.
Paragraph (version B):
All QUIC registries allow for both provisional and permanent
registration of codepoints.  This section documents policies that are
common to these registries.
Paragraph (version B):
Provisional registration of codepoints are intended to allow for
private use and experimentation with extensions to QUIC.  Provisional
registrations only require the inclusion of the codepoint value and
contact information.  However, provisional registrations could be
reclaimed and reassigned for another purpose.
Paragraph (version B):
Provisional registrations require Expert Review, as defined in
Section 4.5 of RFC8126.  Designated expert(s) are advised that only
registrations for an excessive proportion of remaining codepoint
space or the very first unassigned value (see iana-random) can be
rejected.
Paragraph (version B):
Provisional registrations will include a date field that indicates
when the registration was last updated.  A request to update the date
on any provisional registration can be made without review from the
designated expert(s).
Paragraph (version B):
The assigned codepoint.
Paragraph (version B):
"Permanent" or "Provisional".
Paragraph (version B):
The date of last update to the registration.
Paragraph (version B):
Contact details for the registrant.
Paragraph (version B):
Supplementary notes about the registration.
Paragraph (version B):
Provisional registrations MAY omit the Specification and Notes
fields, plus any additional fields that might be required for a
permanent registration.  The Date field is not required as part of
requesting a registration as it is set to the date the registration
is created or updated.
Paragraph (version B):
New uses of codepoints from QUIC registries SHOULD use a randomly
selected codepoint that excludes both existing allocations and the
first unallocated codepoint in the selected space.  Requests for
multiple codepoints MAY use a contiguous range.  This minimizes the
risk that differing semantics are attributed to the same codepoint by
different implementations.  Use of the first codepoint in a range is
intended for use by specifications that are developed through the
standards process STD and its allocation MUST be negotiated with IANA
before use.
Paragraph (version B):
For codepoints that are encoded in variable-length integers (integer-
encoding), such as frame types, codepoints that encode to four or
eight bytes (that is, values 2^14 and above) SHOULD be used unless
the usage is especially sensitive to having a longer encoding.
Paragraph (version B):
Applications to register codepoints in QUIC registries MAY include a
codepoint as part of the registration.  IANA MUST allocate the
selected codepoint unless that codepoint is already assigned or the
codepoint is the first unallocated codepoint in the registry.
Paragraph (version B):
A request might be made to remove an unused provisional registration
from the registry to reclaim space in a registry, or portion of the
registry (such as the 64-16383 range for codepoints that use
variable-length encodings).  This SHOULD be done only for the
codepoints with the earliest recorded date and entries that have been
updated less than a year prior SHOULD NOT be reclaimed.
Paragraph (version B):
A request to remove a codepoint MUST be reviewed by the designated
expert(s).  The expert(s) MUST attempt to determine whether the
codepoint is still in use.  Experts are advised to contact the listed
contacts for the registration, plus as wide a set of protocol
implementers as possible in order to determine whether any use of the
codepoint is known.  The expert(s) are advised to allow at least four
weeks for responses.
Paragraph (version B):
If any use of the codepoints is identified by this search or a
request to update the registration is made, the codepoint MUST NOT be
reclaimed.  Instead, the date on the registration is updated.  A note
might be added for the registration recording relevant information
that was learned.
Paragraph (version B):
If no use of the codepoint was identified and no request was made to
update the registration, the codepoint MAY be removed from the
registry.
Paragraph (version B):
This process also applies to requests to change a provisional
registration into a permanent registration, except that the goal is
not to determine whether there is no use of the codepoint, but to
determine that the registration is an accurate representation of any
deployed usage.
Paragraph (version B):
Permanent registrations in QUIC registries use the Specification
Required policy RFC8126, unless otherwise specified.  The designated
expert(s) verify that a specification exists and is readily
accessible.  Expert(s) are encouraged to be biased towards approving
registrations unless they are abusive, frivolous, or actively harmful
(not merely aesthetically displeasing, or architecturally dubious).
The creation of a registry MAY specify additional constraints on
permanent registrations.
Paragraph (version B):
The creation of a registries MAY identify a range of codepoints where
registrations are governed by a different registration policy.  For
instance, the registries for 62-bit codepoints in this document have
stricter policies for codepoints in the range from 0 to 63.
Paragraph (version B):
Any stricter requirements for permanent registrations do not prevent
provisional registrations for affected codepoints.  For instance, a
provisional registration for a frame type iana-frames of 61 could be
requested.
Paragraph (version B):
All registrations made by Standards Track publications MUST be
permanent.
Paragraph (version B):
All registrations in this document are assigned a permanent status
and list as contact both the IESG (ietf@ietf.org) and the QUIC
working group (quic@ietf.org).
Paragraph (version B):
IANA [SHALL add/has added] a registry for "QUIC Transport Parameters"
under a "QUIC" heading.
Paragraph (version B):
The "QUIC Transport Parameters" registry governs a 16-bit space.
This registry follows the registration policy from iana-policy.
Permanent registrations in this registry are assigned using the
Specification Required policy RFC8126.
Paragraph (version B):
Additionally, each value of the format "31 * N + 27" for integer
values of N (that is, "27", "58", "89", ...) are reserved and MUST
NOT be assigned by IANA.
Paragraph (version B):
IANA [SHALL add/has added] a registry for "QUIC Frame Types" under a
"QUIC" heading.
Paragraph (version B):
The "QUIC Frame Types" registry governs a 62-bit space.  This
registry follows the registration policy from iana-policy.  Permanent
registrations in this registry are assigned using the Specification
Required policy RFC8126, except for values between 0x00 and 0x3f (in
hexadecimal; inclusive), which are assigned using Standards Action or
IESG Approval as defined in Section 4.9 and 4.10 of RFC8126.
Paragraph (version B):
In addition to the advice in iana-policy, specifications for new
permanent registrations SHOULD describe the means by which an
endpoint might determine that it can send the identified type of
frame.  An accompanying transport parameter registration (see iana-
transport-parameters) is expected for most registrations.
Specifications for permanent registrations also needs to describe the
format and assigned semantics of any fields in the frame.
Paragraph (version B):
IANA [SHALL add/has added] a registry for "QUIC Transport Error
Codes" under a "QUIC" heading.
Paragraph (version B):
The "QUIC Transport Error Codes" registry governs a 62-bit space.
This space is split into three spaces that are governed by different
policies.  Permanent registrations in this registry are assigned
using the Specification Required policy RFC8126, except for values
between 0x00 and 0x3f (in hexadecimal; inclusive), which are assigned
using Standards Action or IESG Approval as defined in Section 4.9 and
4.10 of RFC8126.