rfc9114.form.xml | rfc9114.xml | |||
---|---|---|---|---|
<?xml version="1.0" encoding="UTF-8"?> | <?xml version='1.0' encoding='UTF-8'?> | |||
<!DOCTYPE rfc [ | ||||
<!-- [CS] updated by Chris 03/25/21 --> | <!ENTITY nbsp " "> | |||
<!ENTITY zwsp "​"> | ||||
<!-- [rfced] draft submitted in xml v3 --> | <!ENTITY nbhy "‑"> | |||
<!ENTITY wj "⁠"> | ||||
<!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.3.24 --> | ]> | |||
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft | ||||
<!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent"> | -ietf-quic-http-34" number="9114" obsoletes="" updates="" submissionType="IETF" | |||
category="std" consensus="true" xml:lang="en" tocInclude="true" | ||||
<?rfc toc="yes"?> | ||||
<?rfc sortrefs="yes"?> | ||||
<?rfc symrefs="yes"?> | ||||
<?rfc docmapping="yes"?> | ||||
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft | ||||
-ietf-quic-http-34" number="0000" obsoletes="" updates="" submissionType="IETF" | ||||
category="std" consensus="true" xml:lang="en" tocInclude="true" | ||||
sortRefs="true" symRefs="true" version="3"> | sortRefs="true" symRefs="true" version="3"> | |||
<link href='https://datatracker.ietf.org/doc/draft-ietf-quic-http-latest' rel= | ||||
<!-- xml2rfc v2v3 conversion 3.5.0 --> | 'prev'/> | |||
<front> | <front> | |||
<title abbrev="HTTP/3">Hypertext Transfer Protocol Version 3 (HTTP/3)</title | <title>HTTP/3</title> | |||
> | <seriesInfo name='RFC' value='9114'/> | |||
<seriesInfo name="RFC" value="0000"/> | <author fullname='Mike Bishop' initials='M.' role='editor' surname='Bishop'> | |||
<author initials="M." surname="Bishop" fullname="Mike Bishop" role="editor"> | ||||
<organization>Akamai</organization> | <organization>Akamai</organization> | |||
<address> | <address> | |||
<email>mbishop@evequefou.be</email> | <email>mbishop@evequefou.be</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<date year="2021" month="March"/> | <date month='May' year='2022'/> | |||
<area>Transport</area> | <area>Transport</area> | |||
<workgroup>QUIC</workgroup> | <workgroup>QUIC</workgroup> | |||
<keyword>HTTP/2</keyword> | ||||
<!-- [rfced] Please insert any keywords (beyond those that appear in the | <keyword>HPACK</keyword> | |||
title) for use on https://www.rfc-editor.org/search. --> | <keyword>QPACK</keyword> | |||
<keyword>Web</keyword> | ||||
<keyword>example</keyword> | ||||
<abstract> | <abstract> | |||
<t>The QUIC transport protocol has several features that are desirable in a | <t>The QUIC transport protocol has several features that are desirable in a | |||
transport for HTTP, such as stream multiplexing, per-stream flow control, and | transport for HTTP, such as stream multiplexing, per-stream flow control, and | |||
low-latency connection establishment. This document describes a mapping of HTTP | low-latency connection establishment. This document describes a mapping of HTTP | |||
semantics over QUIC. This document also identifies HTTP/2 features that are | semantics over QUIC. This document also identifies HTTP/2 features that are | |||
subsumed by QUIC, and describes how HTTP/2 extensions can be ported to HTTP/3.</ t> | subsumed by QUIC and describes how HTTP/2 extensions can be ported to HTTP/3.</t > | |||
</abstract> | </abstract> | |||
<note> | ||||
<name>DO NOT DEPLOY THIS VERSION OF HTTP</name> | ||||
<t>DO NOT DEPLOY THIS VERSION OF HTTP/3 UNTIL IT IS IN AN RFC. This versio | ||||
n is | ||||
still a work in progress. For trial deployments, please use earlier versions.</t | ||||
> | ||||
</note> | ||||
<note> | ||||
<name>Note to Readers</name> | ||||
<t>Discussion of this draft takes place on the QUIC working group mailing | ||||
list | ||||
(quic@ietf.org), which is archived at | ||||
<eref target="https://mailarchive.ietf.org/arch/search/?email_list=quic"/>.</t> | ||||
<t>Working Group information can be found at <eref target="https://github. | ||||
com/quicwg"/>; source | ||||
code and issues list for this draft can be found at | ||||
<eref target="https://github.com/quicwg/base-drafts/labels/-http"/>.</t> | ||||
</note> | ||||
</front> | </front> | |||
<middle> | <middle> | |||
<section anchor="introduction" numbered="true" toc="default"> | <section anchor='introduction'> | |||
<name>Introduction</name> | <name>Introduction</name> | |||
<t>HTTP semantics (<xref target="RFCYYY4" format="default"/>) are used for | <t>HTTP semantics (<xref target='RFC9110'/>) are used for a broad range of | |||
a broad | services on the | |||
range of services on the Internet. These semantics have most commonly been used | Internet. These semantics have most commonly been used with HTTP/1.1 and HTTP/2. | |||
with HTTP/1.1 and HTTP/2. HTTP/1.1 has been used over a variety of transport | HTTP/1.1 has been used over a variety of transport and session layers, while | |||
and session layers, while HTTP/2 has been used primarily with TLS over TCP. | HTTP/2 has been used primarily with TLS over TCP. HTTP/3 supports the same | |||
HTTP/3 supports the same semantics over a new transport protocol, QUIC.</t> | semantics over a new transport protocol: QUIC.</t> | |||
<section anchor="prior-versions-of-http" numbered="true" toc="default"> | <section anchor='prior-versions-of-http'> | |||
<name>Prior versions of HTTP</name> | <name>Prior Versions of HTTP</name> | |||
<t>HTTP/1.1 (<xref target="I-D.ietf-httpbis-messaging" format="default"/ | <t>HTTP/1.1 (<xref target='RFC9112'/>) uses whitespace-delimited text fi | |||
>) uses whitespace-delimited text | elds to convey HTTP | |||
fields to convey HTTP messages. While these exchanges are human-readable, using | messages. While these exchanges are human readable, using whitespace for | |||
whitespace for message formatting leads to parsing complexity and excessive | message formatting leads to parsing complexity and excessive tolerance of | |||
tolerance of variant behavior.</t> | variant behavior.</t> | |||
<t>Because HTTP/1.1 does not include a multiplexing layer, multiple TCP connections | <t>Because HTTP/1.1 does not include a multiplexing layer, multiple TCP connections | |||
are often used to service requests in parallel. However, that has a negative | are often used to service requests in parallel. However, that has a negative | |||
impact on congestion control and network efficiency, since TCP does not share | impact on congestion control and network efficiency, since TCP does not share | |||
congestion control across multiple connections.</t> | congestion control across multiple connections.</t> | |||
<t>HTTP/2 (<xref target="RFC7540" format="default"/>) introduced a binar y framing and multiplexing layer | <t>HTTP/2 (<xref target='RFC9113'/>) introduced a binary framing and mul tiplexing layer | |||
to improve latency without modifying the transport layer. However, because the | to improve latency without modifying the transport layer. However, because the | |||
parallel nature of HTTP/2's multiplexing is not visible to TCP's loss recovery | parallel nature of HTTP/2's multiplexing is not visible to TCP's loss recovery | |||
mechanisms, a lost or reordered packet causes all active transactions to | mechanisms, a lost or reordered packet causes all active transactions to | |||
experience a stall regardless of whether that transaction was directly impacted | experience a stall regardless of whether that transaction was directly impacted | |||
by the lost packet.</t> | by the lost packet.</t> | |||
</section> | </section> | |||
<section anchor="delegation-to-quic" numbered="true" toc="default"> | <section anchor='delegation-to-quic'> | |||
<name>Delegation to QUIC</name> | <name>Delegation to QUIC</name> | |||
<t>The QUIC transport protocol incorporates stream multiplexing and per- stream flow | <t>The QUIC transport protocol incorporates stream multiplexing and per- stream flow | |||
control, similar to that provided by the HTTP/2 framing layer. By providing | control, similar to that provided by the HTTP/2 framing layer. By providing | |||
reliability at the stream level and congestion control across the entire | reliability at the stream level and congestion control across the entire | |||
connection, QUIC has the capability to improve the performance of HTTP compared | connection, QUIC has the capability to improve the performance of HTTP compared | |||
to a TCP mapping. QUIC also incorporates TLS 1.3 (<xref target="RFC8446" format ="default"/>) at the | to a TCP mapping. QUIC also incorporates TLS 1.3 (<xref target='TLS'/>) at the | |||
transport layer, offering comparable confidentiality and integrity to running | transport layer, offering comparable confidentiality and integrity to running | |||
TLS over TCP, with the improved connection setup latency of TCP Fast Open | TLS over TCP, with the improved connection setup latency of TCP Fast Open | |||
(<xref target="RFC7413" format="default"/>).</t> | (<xref target='TFO'/>).</t> | |||
<t>This document defines HTTP/3, a mapping of HTTP semantics over the QU | <t>This document defines HTTP/3: a mapping of HTTP semantics over the QU | |||
IC | IC | |||
transport protocol, drawing heavily on the design of HTTP/2. HTTP/3 relies on | transport protocol, drawing heavily on the design of HTTP/2. HTTP/3 relies on | |||
QUIC to provide confidentiality and integrity protection of data; peer | QUIC to provide confidentiality and integrity protection of data; peer | |||
authentication; and reliable, in-order, per-stream delivery. While delegating | authentication; and reliable, in-order, per-stream delivery. While delegating | |||
stream lifetime and flow control issues to QUIC, a binary framing similar to the | stream lifetime and flow-control issues to QUIC, a binary framing similar to the | |||
HTTP/2 framing is used on each stream. Some HTTP/2 features are subsumed by | HTTP/2 framing is used on each stream. Some HTTP/2 features are subsumed by | |||
QUIC, while other features are implemented atop QUIC.</t> | QUIC, while other features are implemented atop QUIC.</t> | |||
<t>QUIC is described in <xref target="RFCYYY1" format="default"/>. For | <t>QUIC is described in <xref target='QUIC-TRANSPORT'/>. For a full des | |||
a full description of HTTP/2, see | cription of | |||
<xref target="RFC7540" format="default"/>.</t> | HTTP/2, see <xref target='RFC9113'/>.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="http3-protocol-overview" numbered="true" toc="default"> | <section anchor='http3-protocol-overview'> | |||
<name>HTTP/3 Protocol Overview</name> | <name>HTTP/3 Protocol Overview</name> | |||
<t>HTTP/3 provides a transport for HTTP semantics using the QUIC transport protocol | <t>HTTP/3 provides a transport for HTTP semantics using the QUIC transport protocol | |||
and an internal framing layer similar to HTTP/2.</t> | and an internal framing layer similar to HTTP/2.</t> | |||
<t>Once a client knows that an HTTP/3 server exists at a certain endpoint, it opens | <t>Once a client knows that an HTTP/3 server exists at a certain endpoint, it opens | |||
a QUIC connection. QUIC provides protocol negotiation, stream-based | a QUIC connection. QUIC provides protocol negotiation, stream-based | |||
multiplexing, and flow control. Discovery of an HTTP/3 endpoint is described in | multiplexing, and flow control. Discovery of an HTTP/3 endpoint is described in | |||
<xref target="discovery" format="default"/>.</t> | <xref target='discovery'/>.</t> | |||
<t>Within each stream, the basic unit of HTTP/3 communication is a frame | <t>Within each stream, the basic unit of HTTP/3 communication is a frame | |||
(<xref target="frames" format="default"/>). Each frame type serves a different | (<xref target='frames'/>). Each frame type serves a different purpose. For exa | |||
purpose. For example, HEADERS | mple, <xref format='none' target='frame-headers'>HEADERS</xref><iref item='HEADE | |||
and DATA frames form the basis of HTTP requests and responses | RS'/> | |||
(<xref target="request-response" format="default"/>). Frames that apply to the | and <xref format='none' target='frame-data'>DATA</xref><iref item='DATA'/> frame | |||
entire connection are | s form the basis of HTTP requests and responses | |||
conveyed on a dedicated control stream.</t> | (<xref target='request-response'/>). Frames that apply to the entire connection | |||
<t>Multiplexing of requests is performed using the QUIC stream abstraction | are | |||
, | conveyed on a dedicated <xref format='none' target='control-streams'>control str | |||
described in <xref section="2" sectionFormat="of" target="RFCYYY1" format="defau | eam</xref><iref item='control stream'/>.</t> | |||
lt"/>. Each request-response pair | <t>Multiplexing of requests is performed using the QUIC stream abstraction | |||
, which | ||||
is described in <xref section='2' sectionFormat='of' target='QUIC-TRANSPORT'/>. | ||||
Each request-response pair | ||||
consumes a single QUIC stream. Streams are independent of each other, so one | consumes a single QUIC stream. Streams are independent of each other, so one | |||
stream that is blocked or suffers packet loss does not prevent progress on other | stream that is blocked or suffers packet loss does not prevent progress on other | |||
streams.</t> | streams.</t> | |||
<t>Server push is an interaction mode introduced in HTTP/2 (<xref target=" RFC7540" format="default"/>) that | <t>Server push is an interaction mode introduced in HTTP/2 (<xref target=' RFC9113'/>) that | |||
permits a server to push a request-response exchange to a client in anticipation | permits a server to push a request-response exchange to a client in anticipation | |||
of the client making the indicated request. This trades off network usage | of the client making the indicated request. This trades off network usage | |||
against a potential latency gain. Several HTTP/3 frames are used to manage | against a potential latency gain. Several HTTP/3 frames are used to manage | |||
server push, such as PUSH_PROMISE, MAX_PUSH_ID, and CANCEL_PUSH.</t> | server push, such as <xref format='none' target='frame-push-promise'>PUSH_PROMIS E</xref><iref item='PUSH_PROMISE'/>, <xref format='none' target='frame-max-push- id'>MAX_PUSH_ID</xref><iref item='MAX_PUSH_ID'/>, and <xref format='none' target ='frame-cancel-push'>CANCEL_PUSH</xref><iref item='CANCEL_PUSH'/>.</t> | |||
<t>As in HTTP/2, request and response fields are compressed for transmissi on. | <t>As in HTTP/2, request and response fields are compressed for transmissi on. | |||
Because HPACK (<xref target="RFC7541" format="default"/>) relies on in-order tra nsmission of | Because HPACK (<xref target='HPACK'/>) relies on in-order transmission of | |||
compressed field sections (a guarantee not provided by QUIC), HTTP/3 replaces | compressed field sections (a guarantee not provided by QUIC), HTTP/3 replaces | |||
HPACK with QPACK (<xref target="RFCYYY2" format="default"/>). QPACK uses separat e unidirectional streams to | HPACK with QPACK (<xref target='RFC9204'/>). QPACK uses separate unidirectional streams to | |||
modify and track field table state, while encoded field sections refer to the | modify and track field table state, while encoded field sections refer to the | |||
state of the table without modifying it.</t> | state of the table without modifying it.</t> | |||
<section anchor="document-organization" numbered="true" toc="default"> | <section anchor='document-organization'> | |||
<name>Document Organization</name> | <name>Document Organization</name> | |||
<t>The following sections provide a detailed overview of the lifecycle o f an HTTP/3 | <t>The following sections provide a detailed overview of the lifecycle o f an HTTP/3 | |||
connection:</t> | connection:</t> | |||
<ul spacing="normal"> | <ul spacing='normal'> | |||
<li>Connection Setup and Management (<xref target="connection-setup" f | <li>"<xref format='title' target='connection-setup'/>" (<xref target=' | |||
ormat="default"/>) covers how an HTTP/3 | connection-setup'/>) covers how an HTTP/3 | |||
endpoint is discovered and an HTTP/3 connection is established.</li> | endpoint is discovered and an HTTP/3 connection is established.</li> | |||
<li>HTTP Request Lifecycle (<xref target="http-request-lifecycle" form at="default"/>) describes how HTTP | <li>"<xref format='title' target='http-request-lifecycle'/>" (<xref ta rget='http-request-lifecycle'/>) describes how HTTP | |||
semantics are expressed using frames.</li> | semantics are expressed using frames.</li> | |||
<li>Connection Closure (<xref target="connection-closure" format="defa | <li>"<xref format='title' target='connection-closure'/>" (<xref target | |||
ult"/>) describes how HTTP/3 connections | ='connection-closure'/>) describes how HTTP/3 | |||
are terminated, either gracefully or abruptly.</li> | connections are terminated, either gracefully or abruptly.</li> | |||
</ul> | </ul> | |||
<t>The details of the wire protocol and interactions with the transport are | <t>The details of the wire protocol and interactions with the transport are | |||
described in subsequent sections:</t> | described in subsequent sections:</t> | |||
<ul spacing="normal"> | <ul spacing='normal'> | |||
<li>Stream Mapping and Usage (<xref target="stream-mapping" format="de | <li>"<xref format='title' target='stream-mapping'/>" (<xref target='st | |||
fault"/>) describes the way QUIC streams | ream-mapping'/>) describes the way QUIC streams | |||
are used.</li> | are used.</li> | |||
<li>HTTP Framing Layer (<xref target="http-framing-layer" format="defa | <li>"<xref format='title' target='http-framing-layer'/>" (<xref target | |||
ult"/>) describes the frames used on | ='http-framing-layer'/>) describes the frames used | |||
most streams.</li> | on most streams.</li> | |||
<li>Error Handling (<xref target="errors" format="default"/>) describe | <li>"<xref format='title' target='errors'/>" (<xref target='errors'/>) | |||
s how error conditions are handled and | describes how error conditions are handled and | |||
expressed, either on a particular stream or for the connection as a whole.</li> | expressed, either on a particular stream or for the connection as a whole.</li> | |||
</ul> | </ul> | |||
<t>Additional resources are provided in the final sections:</t> | <t>Additional resources are provided in the final sections:</t> | |||
<ul spacing="normal"> | <ul spacing='normal'> | |||
<li>Extensions to HTTP/3 (<xref target="extensions" format="default"/> | <li>"<xref format='title' target='extensions'/>" (<xref target='extens | |||
) describes how new capabilities can be | ions'/>) describes how new capabilities can be | |||
added in future documents.</li> | added in future documents.</li> | |||
<li>A more detailed comparison between HTTP/2 and HTTP/3 can be found in | <li>A more detailed comparison between HTTP/2 and HTTP/3 can be found in | |||
<xref target="h2-considerations" format="default"/>.</li> | <xref target='h2-considerations'/>.</li> | |||
</ul> | </ul> | |||
</section> | </section> | |||
<section anchor="conventions-and-terminology" numbered="true" toc="default "> | <section anchor='conventions-and-terminology'> | |||
<name>Conventions and Terminology</name> | <name>Conventions and Terminology</name> | |||
<t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp 14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL | <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp 14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL | |||
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECO MMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECO MMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | |||
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be i nterpreted as | "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be i nterpreted as | |||
described in BCP 14 <xref target="RFC2119" format="default"/> <xref target= "RFC8174" format="default"/> when, and only when, they | described in BCP 14 <xref target="RFC2119" format="default"/> <xref target= "RFC8174" format="default"/> when, and only when, they | |||
appear in all capitals, as shown here.</t> | appear in all capitals, as shown here.</t> | |||
<t>This document uses the variable-length integer encoding from | <t>This document uses the variable-length integer encoding from | |||
<xref target="RFCYYY1" format="default"/>.</t> | <xref target='QUIC-TRANSPORT'/>.</t> | |||
<t>The following terms are used:</t> | <t>The following terms are used:</t> | |||
<dl> | <dl> | |||
<dt> | <dt>abort:</dt> | |||
abort: </dt> | ||||
<dd> | <dd> | |||
<t>An abrupt termination of a connection or stream, possibly due to an error | <t>An abrupt termination of a connection or stream, possibly due to an error | |||
condition.</t> | condition.</t> | |||
</dd> | </dd> | |||
<dt> | <dt>client:</dt> | |||
client: </dt> | ||||
<dd> | <dd> | |||
<t>The endpoint that initiates an HTTP/3 connection. Clients send H TTP requests | <t>The endpoint that initiates an HTTP/3 connection. Clients send H TTP requests | |||
and receive HTTP responses.</t> | and receive HTTP responses.</t> | |||
</dd> | </dd> | |||
<dt> | <dt>connection:</dt> | |||
connection: </dt> | ||||
<dd> | <dd> | |||
<t>A transport-layer connection between two endpoints, using QUIC as the | <t>A transport-layer connection between two endpoints using QUIC as the | |||
transport protocol.</t> | transport protocol.</t> | |||
</dd> | </dd> | |||
<dt> | <dt><xref format='none' target='errors'>connection error</xref><iref i | |||
connection error: </dt> | tem='connection error'/>:</dt> | |||
<dd> | <dd> | |||
<t>An error that affects the entire HTTP/3 connection.</t> | <t>An error that affects the entire HTTP/3 connection.</t> | |||
</dd> | </dd> | |||
<dt> | <dt>endpoint:</dt> | |||
endpoint: </dt> | ||||
<dd> | <dd> | |||
<t>Either the client or server of the connection.</t> | <t>Either the client or server of the connection.</t> | |||
</dd> | </dd> | |||
<dt> | <dt>frame:</dt> | |||
frame: </dt> | ||||
<dd> | <dd> | |||
<t>The smallest unit of communication on a stream in HTTP/3, consist ing of a | <t>The smallest unit of communication on a stream in HTTP/3, consist ing of a | |||
header and a variable-length sequence of bytes structured according to the | header and a variable-length sequence of bytes structured according to the | |||
frame type. | frame type.</t> | |||
</t> | ||||
<t>Protocol elements called "frames" exist in both this document and | <t>Protocol elements called "frames" exist in both this document and | |||
<xref target="RFCYYY1" format="default"/>. Where frames from <xref target="RFCYY | <xref target='QUIC-TRANSPORT'/>. Where frames from <xref target='QUIC-TRANSPORT' | |||
Y1" format="default"/> are referenced, the | /> are referenced, the | |||
frame name will be prefaced with "QUIC." For example, "QUIC CONNECTION_CLOSE | frame name will be prefaced with "QUIC". For example, "QUIC CONNECTION_CLOSE | |||
frames." References without this preface refer to frames defined in | frames". References without this preface refer to frames defined in | |||
<xref target="frames" format="default"/>.</t> | <xref target='frames'/>.</t> | |||
</dd> | </dd> | |||
<dt> | <dt>HTTP/3 connection:</dt> | |||
HTTP/3 connection: </dt> | ||||
<dd> | <dd> | |||
<t>A QUIC connection where the negotiated application protocol is HT TP/3.</t> | <t>A QUIC connection where the negotiated application protocol is HT TP/3.</t> | |||
</dd> | </dd> | |||
<dt> | <dt>peer:</dt> | |||
peer: </dt> | ||||
<dd> | <dd> | |||
<t>An endpoint. When discussing a particular endpoint, "peer" refer s to the | <t>An endpoint. When discussing a particular endpoint, "peer" refer s to the | |||
endpoint that is remote to the primary subject of discussion.</t> | endpoint that is remote to the primary subject of discussion.</t> | |||
</dd> | </dd> | |||
<dt> | <dt>receiver:</dt> | |||
receiver: </dt> | ||||
<dd> | <dd> | |||
<t>An endpoint that is receiving frames.</t> | <t>An endpoint that is receiving frames.</t> | |||
</dd> | </dd> | |||
<dt> | <dt>sender:</dt> | |||
sender: </dt> | ||||
<dd> | <dd> | |||
<t>An endpoint that is transmitting frames.</t> | <t>An endpoint that is transmitting frames.</t> | |||
</dd> | </dd> | |||
<dt> | <dt>server:</dt> | |||
server: </dt> | ||||
<dd> | <dd> | |||
<t>The endpoint that accepts an HTTP/3 connection. Servers receive HTTP requests | <t>The endpoint that accepts an HTTP/3 connection. Servers receive HTTP requests | |||
and send HTTP responses.</t> | and send HTTP responses.</t> | |||
</dd> | </dd> | |||
<dt> | <dt>stream:</dt> | |||
stream: </dt> | ||||
<dd> | <dd> | |||
<t>A bidirectional or unidirectional bytestream provided by the QUIC transport. | <t>A bidirectional or unidirectional bytestream provided by the QUIC transport. | |||
All streams within an HTTP/3 connection can be considered "HTTP/3 streams," | All streams within an HTTP/3 connection can be considered "HTTP/3 streams", | |||
but multiple stream types are defined within HTTP/3.</t> | but multiple stream types are defined within HTTP/3.</t> | |||
</dd> | </dd> | |||
<dt> | <dt><xref format='none' target='errors'>stream error</xref><iref item= | |||
stream error: </dt> | 'stream error'/>:</dt> | |||
<dd> | <dd> | |||
<t>An application-level error on the individual stream.</t> | <t>An application-level error on the individual stream.</t> | |||
</dd> | </dd> | |||
</dl> | </dl> | |||
<t>The term "content" is defined in <xref section="6.4" sectionFormat="o f" target="RFCYYY4" format="default"/>.</t> | <t>The term "content" is defined in <xref section='6.4' sectionFormat='o f' target='RFC9110'/>.</t> | |||
<t>Finally, the terms "resource", "message", "user agent", "origin serve r", | <t>Finally, the terms "resource", "message", "user agent", "origin serve r", | |||
"gateway", "intermediary", "proxy", and "tunnel" are defined in <xref section="3 " sectionFormat="of" target="RFCYYY4" format="default"/>.</t> | "gateway", "intermediary", "proxy", and "tunnel" are defined in <xref section='3 ' sectionFormat='of' target='RFC9110'/>.</t> | |||
<t>Packet diagrams in this document use the format defined in | <t>Packet diagrams in this document use the format defined in | |||
<xref section="1.3" sectionFormat="of" target="RFCYYY1" format="default"/> to il lustrate the order and size of fields.</t> | <xref section='1.3' sectionFormat='of' target='QUIC-TRANSPORT'/> to illustrate t he order and size of fields.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="connection-setup" numbered="true" toc="default"> | <section anchor='connection-setup'> | |||
<name>Connection Setup and Management</name> | <name>Connection Setup and Management</name> | |||
<section anchor="discovery" numbered="true" toc="default"> | <section anchor='discovery'> | |||
<name>Discovering an HTTP/3 Endpoint</name> | <name>Discovering an HTTP/3 Endpoint</name> | |||
<t>HTTP relies on the notion of an authoritative response: a response th at has been | <t>HTTP relies on the notion of an authoritative response: a response th at has been | |||
determined to be the most appropriate response for that request given the state | determined to be the most appropriate response for that request given the state | |||
of the target resource at the time of response message origination by (or at the | of the target resource at the time of response message origination by (or at the | |||
direction of) the origin server identified within the target URI. Locating an | direction of) the origin server identified within the target URI. Locating an | |||
authoritative server for an HTTP URI is discussed in | authoritative server for an HTTP URI is discussed in <xref section='4.3' section | |||
<xref section="4.3" sectionFormat="of" target="RFCYYY4" format="default"/>.</t> | Format='of' target='RFC9110'/>.</t> | |||
<t>The "https" scheme associates authority with possession of a certific ate that | <t>The "https" scheme associates authority with possession of a certific ate that | |||
the client considers to be trustworthy for the host identified by the authority | the client considers to be trustworthy for the host identified by the authority | |||
component of the URI. Upon receiving a server certificate in the TLS handshake, | component of the URI. Upon receiving a server certificate in the TLS handshake, | |||
the client <bcp14>MUST</bcp14> verify that the certificate is an acceptable matc | the client <bcp14>MUST</bcp14> | |||
h for the URI's | verify that the certificate is an acceptable match for the URI's | |||
origin server using the process described in <xref section="4.3.4" sectionFormat | origin server using the process described in <xref section='4.3.4' sectionFormat | |||
="of" target="RFCYYY4" format="default"/>. If | ='of' target='RFC9110'/>. If | |||
the certificate cannot be verified with respect to the URI's origin server, the | the certificate cannot be verified with respect to the URI's origin server, the | |||
client <bcp14>MUST NOT</bcp14> consider the server authoritative for that origin | client <bcp14>MUST NOT</bcp14> | |||
.</t> | consider the server authoritative for that origin.</t> | |||
<t>A client <bcp14>MAY</bcp14> attempt access to a resource with an "htt | <t>A client <bcp14>MAY</bcp14> | |||
ps" URI by resolving the | attempt access to a resource with an "https" URI by resolving the | |||
host identifier to an IP address, establishing a QUIC connection to that address | host identifier to an IP address, establishing a QUIC connection to that address | |||
on the indicated port (including validation of the server certificate as | on the indicated port (including validation of the server certificate as | |||
described above), and sending an HTTP/3 request message targeting the URI | described above), and sending an HTTP/3 request message targeting the URI | |||
to the server over that secured connection. Unless some other mechanism is used | to the server over that secured connection. Unless some other mechanism is used | |||
to select HTTP/3, the token "h3" is used in the Application Layer Protocol | to select HTTP/3, the token "h3" is used in the Application-Layer Protocol | |||
Negotiation (ALPN; see <xref target="RFC7301" format="default"/>) extension duri | Negotiation (ALPN; see <xref target='RFC7301'/>) extension during the TLS handsh | |||
ng the TLS handshake.</t> | ake.</t> | |||
<t>Connectivity problems (e.g., blocking UDP) can result in QUIC connect | <t>Connectivity problems (e.g., blocking UDP) can result in a failure to | |||
ion | establish | |||
establishment failure; clients <bcp14>SHOULD</bcp14> attempt to use TCP-based ve | a QUIC connection; clients <bcp14>SHOULD</bcp14> | |||
rsions of HTTP | attempt to use TCP-based versions of HTTP | |||
in this case.</t> | in this case.</t> | |||
<t>Servers <bcp14>MAY</bcp14> serve HTTP/3 on any UDP port; an alternati | <t>Servers <bcp14>MAY</bcp14> | |||
ve service advertisement | serve HTTP/3 on any UDP port; an alternative service advertisement | |||
always includes an explicit port, and URIs contain either an explicit port or a | always includes an explicit port, and URIs contain either an explicit port or a | |||
default port associated with the scheme.</t> | default port associated with the scheme.</t> | |||
<section anchor="alt-svc" numbered="true" toc="default"> | <section anchor='alt-svc'> | |||
<name>HTTP Alternative Services</name> | <name>HTTP Alternative Services</name> | |||
<t>An HTTP origin can advertise the availability of an equivalent HTTP /3 endpoint | <t>An HTTP origin can advertise the availability of an equivalent HTTP /3 endpoint | |||
via the Alt-Svc HTTP response header field or the HTTP/2 ALTSVC frame | via the Alt-Svc HTTP response header field or the HTTP/2 ALTSVC frame | |||
(<xref target="RFC7838" format="default"/>), using the "h3" ALPN token.</t> | (<xref target='ALTSVC'/>) using the "h3" ALPN token.</t> | |||
<t>For example, an origin could indicate in an HTTP response that HTTP /3 was | <t>For example, an origin could indicate in an HTTP response that HTTP /3 was | |||
available on UDP port 50781 at the same hostname by including the following | available on UDP port 50781 at the same hostname by including the following | |||
header field:</t> | header field:</t> | |||
<sourcecode type='http-message'><![CDATA[ | ||||
<artwork type="drawing" name="" align="left" alt=""><![CDATA[ | ||||
Alt-Svc: h3=":50781" | Alt-Svc: h3=":50781" | |||
]]></artwork> | ]]></sourcecode> | |||
<t>On receipt of an Alt-Svc record indicating HTTP/3 support, a client | <t>On receipt of an Alt-Svc record indicating HTTP/3 support, a client | |||
<bcp14>MAY</bcp14> attempt | <bcp14>MAY</bcp14> | |||
attempt | ||||
to establish a QUIC connection to the indicated host and port; if this | to establish a QUIC connection to the indicated host and port; if this | |||
connection is successful, the client can send HTTP requests using the mapping | connection is successful, the client can send HTTP requests using the mapping | |||
described in this document.</t> | described in this document.</t> | |||
</section> | </section> | |||
<section anchor="other-schemes" numbered="true" toc="default"> | <section anchor='other-schemes'> | |||
<name>Other Schemes</name> | <name>Other Schemes</name> | |||
<t>Although HTTP is independent of the transport protocol, the "http" scheme | <t>Although HTTP is independent of the transport protocol, the "http" scheme | |||
associates authority with the ability to receive TCP connections on the | associates authority with the ability to receive TCP connections on the | |||
indicated port of whatever host is identified within the authority component. | indicated port of whatever host is identified within the authority component. | |||
Because HTTP/3 does not use TCP, HTTP/3 cannot be used for direct access to the | Because HTTP/3 does not use TCP, HTTP/3 cannot be used for direct access to the | |||
authoritative server for a resource identified by an "http" URI. However, | authoritative server for a resource identified by an "http" URI. However, | |||
protocol extensions such as <xref target="RFC7838" format="default"/> permit the authoritative server | protocol extensions such as <xref target='ALTSVC'/> permit the authoritative ser ver | |||
to identify other services that are also authoritative and that might be | to identify other services that are also authoritative and that might be | |||
reachable over HTTP/3.</t> | reachable over HTTP/3.</t> | |||
<t>Prior to making requests for an origin whose scheme is not "https", | <t>Prior to making requests for an origin whose scheme is not "https", | |||
the client | the client <bcp14>MUST</bcp14> | |||
<bcp14>MUST</bcp14> ensure the server is willing to serve that scheme. For origi | ensure the server is willing to serve that scheme. For origins whose scheme | |||
ns whose scheme | ||||
is "http", an experimental method to accomplish this is described in | is "http", an experimental method to accomplish this is described in | |||
<xref target="RFC8164" format="default"/>. Other mechanisms might be defined for various schemes in the | <xref target='RFC8164'/>. Other mechanisms might be defined for various schemes in the | |||
future.</t> | future.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="connection-establishment" numbered="true" toc="default"> | <section anchor='connection-establishment'> | |||
<name>Connection Establishment</name> | <name>Connection Establishment</name> | |||
<t>HTTP/3 relies on QUIC version 1 as the underlying transport. The use of other | <t>HTTP/3 relies on QUIC version 1 as the underlying transport. The use of other | |||
QUIC transport versions with HTTP/3 <bcp14>MAY</bcp14> be defined by future spec | QUIC transport versions with HTTP/3 <bcp14>MAY</bcp14> | |||
ifications.</t> | be defined by future specifications.</t> | |||
<t>QUIC version 1 uses TLS version 1.3 or greater as its handshake proto col. | <t>QUIC version 1 uses TLS version 1.3 or greater as its handshake proto col. | |||
HTTP/3 clients <bcp14>MUST</bcp14> support a mechanism to indicate the target ho | HTTP/3 clients <bcp14>MUST</bcp14> | |||
st to the | support a mechanism to indicate the target host to the | |||
server during the TLS handshake. If the server is identified by a domain name | server during the TLS handshake. If the server is identified by a domain name | |||
(<xref target="RFC8499" format="default"/>), clients <bcp14>MUST</bcp14> send th | (<xref target='DNS-TERMS'/>), clients <bcp14>MUST</bcp14> | |||
e Server Name Indication (SNI; | send the Server Name Indication (SNI; | |||
<xref target="RFC6066" format="default"/>) TLS extension unless an alternative m | <xref target='RFC6066'/>) TLS extension unless an alternative mechanism to indic | |||
echanism to indicate the | ate the | |||
target host is used.</t> | target host is used.</t> | |||
<t>QUIC connections are established as described in <xref target="RFCYYY 1" format="default"/>. During | <t>QUIC connections are established as described in <xref target='QUIC-T RANSPORT'/>. During | |||
connection establishment, HTTP/3 support is indicated by selecting the ALPN | connection establishment, HTTP/3 support is indicated by selecting the ALPN | |||
token "h3" in the TLS handshake. Support for other application-layer protocols | token "h3" in the TLS handshake. Support for other application-layer protocols | |||
<bcp14>MAY</bcp14> be offered in the same handshake.</t> | <bcp14>MAY</bcp14> | |||
be offered in the same handshake.</t> | ||||
<t>While connection-level options pertaining to the core QUIC protocol a re set in | <t>While connection-level options pertaining to the core QUIC protocol a re set in | |||
the initial crypto handshake, HTTP/3-specific settings are conveyed in the | the initial crypto handshake, settings specific to HTTP/3 are conveyed in the | |||
SETTINGS frame. After the QUIC connection is established, a SETTINGS frame | <xref format='none' target='frame-settings'>SETTINGS</xref><iref item='SETTINGS' | |||
(<xref target="frame-settings" format="default"/>) <bcp14>MUST</bcp14> be sent b | /> frame. After the QUIC connection is established, a | |||
y each endpoint as the initial frame of their | <xref format='none' target='frame-settings'>SETTINGS</xref><iref item='SETTINGS' | |||
respective HTTP control stream; see <xref target="control-streams" format="defau | /> frame <bcp14>MUST</bcp14> | |||
lt"/>.</t> | be sent by each endpoint as the initial frame of their | |||
respective HTTP <xref format='none' target='control-streams'>control stream</xre | ||||
f><iref item='control stream'/>.</t> | ||||
</section> | </section> | |||
<section anchor="connection-reuse" numbered="true" toc="default"> | <section anchor='connection-reuse'> | |||
<name>Connection Reuse</name> | <name>Connection Reuse</name> | |||
<t>HTTP/3 connections are persistent across multiple requests. For best | <t>HTTP/3 connections are persistent across multiple requests. For best | |||
performance, it is expected that clients will not close connections until it is | performance, it is expected that clients will not close connections until it is | |||
determined that no further communication with a server is necessary (for | determined that no further communication with a server is necessary (for | |||
example, when a user navigates away from a particular web page) or until the | example, when a user navigates away from a particular web page) or until the | |||
server closes the connection.</t> | server closes the connection.</t> | |||
<t>Once a connection exists to a server endpoint, this connection <bcp14 | <t>Once a connection to a server endpoint exists, this connection | |||
>MAY</bcp14> be reused for | <bcp14>MAY</bcp14> | |||
be reused for | ||||
requests with multiple different URI authority components. To use an existing | requests with multiple different URI authority components. To use an existing | |||
connection for a new origin, clients <bcp14>MUST</bcp14> validate the certificat | connection for a new origin, clients <bcp14>MUST</bcp14> | |||
e presented by | validate the certificate presented by | |||
the server for the new origin server using the process described in <xref sectio | the server for the new origin server using the process described in <xref sectio | |||
n="4.3.4" sectionFormat="of" target="RFCYYY4" format="default"/>. This implies | n='4.3.4' sectionFormat='of' target='RFC9110'/>. This implies that clients will | |||
that clients will need to retain the | need to retain the | |||
server certificate and any additional information needed to verify that | server certificate and any additional information needed to verify that | |||
certificate; clients which do not do so will be unable to reuse the connection | certificate; clients that do not do so will be unable to reuse the connection | |||
for additional origins.</t> | for additional origins.</t> | |||
<t>If the certificate is not acceptable with regard to the new origin fo r any | <t>If the certificate is not acceptable with regard to the new origin fo r any | |||
reason, the connection <bcp14>MUST NOT</bcp14> be reused and a new connection <b | reason, the connection <bcp14>MUST NOT</bcp14> | |||
cp14>SHOULD</bcp14> be | be reused and a new connection <bcp14>SHOULD</bcp14> | |||
be | ||||
established for the new origin. If the reason the certificate cannot be | established for the new origin. If the reason the certificate cannot be | |||
verified might apply to other origins already associated with the connection, | verified might apply to other origins already associated with the connection, | |||
the client <bcp14>SHOULD</bcp14> re-validate the server certificate for those or | the client <bcp14>SHOULD</bcp14> | |||
igins. For | revalidate the server certificate for those origins. For | |||
instance, if validation of a certificate fails because the certificate has | instance, if validation of a certificate fails because the certificate has | |||
expired or been revoked, this might be used to invalidate all other origins for | expired or been revoked, this might be used to invalidate all other origins for | |||
which that certificate was used to establish authority.</t> | which that certificate was used to establish authority.</t> | |||
<t>Clients <bcp14>SHOULD NOT</bcp14> open more than one HTTP/3 connectio | <t>Clients <bcp14>SHOULD NOT</bcp14> | |||
n to a given IP address | open more than one HTTP/3 connection to a given IP address | |||
and UDP port, where the IP address and port might be derived from a URI, a | and UDP port, where the IP address and port might be derived from a URI, a | |||
selected alternative service (<xref target="RFC7838" format="default"/>), a conf | selected alternative service (<xref target='ALTSVC'/>), a configured proxy, or n | |||
igured proxy, or name | ame | |||
resolution of any of these. A client <bcp14>MAY</bcp14> open multiple HTTP/3 con | resolution of any of these. A client <bcp14>MAY</bcp14> | |||
nections to the | open multiple HTTP/3 connections to the | |||
same IP address and UDP port using different transport or TLS configurations but | same IP address and UDP port using different transport or TLS configurations but | |||
<bcp14>SHOULD</bcp14> avoid creating multiple connections with the same configur | <bcp14>SHOULD</bcp14> | |||
ation.</t> | avoid creating multiple connections with the same configuration.</t> | |||
<t>Servers are encouraged to maintain open HTTP/3 connections for as lon g as | <t>Servers are encouraged to maintain open HTTP/3 connections for as lon g as | |||
possible but are permitted to terminate idle connections if necessary. When | possible but are permitted to terminate idle connections if necessary. When | |||
either endpoint chooses to close the HTTP/3 connection, the terminating endpoint | either endpoint chooses to close the HTTP/3 connection, the terminating endpoint | |||
<bcp14>SHOULD</bcp14> first send a GOAWAY frame (<xref target="connection-shutdo | <bcp14>SHOULD</bcp14> | |||
wn" format="default"/>) so that both | first send a <xref format='none' target='frame-goaway'>GOAWAY</xref><iref item= | |||
'GOAWAY'/> frame (<xref target='connection-shutdown'/>) so that both | ||||
endpoints can reliably determine whether previously sent frames have been | endpoints can reliably determine whether previously sent frames have been | |||
processed and gracefully complete or terminate any necessary remaining tasks.</t > | processed and gracefully complete or terminate any necessary remaining tasks.</t > | |||
<t>A server that does not wish clients to reuse HTTP/3 connections for a particular | <t>A server that does not wish clients to reuse HTTP/3 connections for a particular | |||
origin can indicate that it is not authoritative for a request by sending a 421 | origin can indicate that it is not authoritative for a request by sending a 421 | |||
(Misdirected Request) status code in response to the request; see <xref section= "7.4" sectionFormat="of" target="RFCYYY4" format="default"/>.</t> | (Misdirected Request) status code in response to the request; see <xref section= '7.4' sectionFormat='of' target='RFC9110'/>.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="http-request-lifecycle" numbered="true" toc="default"> | <section anchor='http-request-lifecycle'> | |||
<name>HTTP Request Lifecycle</name> | <name>Expressing HTTP Semantics in HTTP/3</name> | |||
<section anchor="request-response" numbered="true" toc="default"> | <section anchor='request-response'> | |||
<name>HTTP Message Exchanges</name> | <name>HTTP Message Framing</name> | |||
<t>A client sends an HTTP request on a request stream, which is a client | <t>A client sends an HTTP request on a <xref format='none' target='reque | |||
-initiated | st-streams'>request stream</xref><iref item='request stream'/>, which is a clien | |||
bidirectional QUIC stream; see <xref target="request-streams" format="default"/> | t-initiated | |||
. A client <bcp14>MUST</bcp14> send only a | bidirectional QUIC stream; see <xref target='request-streams'/>. A client | |||
<bcp14>MUST</bcp14> | ||||
send only a | ||||
single request on a given stream. A server sends zero or more interim HTTP | single request on a given stream. A server sends zero or more interim HTTP | |||
responses on the same stream as the request, followed by a single final HTTP | responses on the same stream as the request, followed by a single final HTTP | |||
response, as detailed below. See <xref section="15" sectionFormat="of" target="R FCYYY4" format="default"/> for a description | response, as detailed below. See <xref section='15' sectionFormat='of' target='R FC9110'/> for a description | |||
of interim and final HTTP responses.</t> | of interim and final HTTP responses.</t> | |||
<t>Pushed responses are sent on a server-initiated unidirectional QUIC s tream; see | <t>Pushed responses are sent on a server-initiated unidirectional QUIC s tream; see | |||
<xref target="push-streams" format="default"/>. A server sends zero or more int erim HTTP responses, followed | <xref target='push-streams'/>. A server sends zero or more interim HTTP respons es, followed | |||
by a single final HTTP response, in the same manner as a standard response. | by a single final HTTP response, in the same manner as a standard response. | |||
Push is described in more detail in <xref target="server-push" format="default"/ >.</t> | Push is described in more detail in <xref target='server-push'/>.</t> | |||
<t>On a given stream, receipt of multiple requests or receipt of an addi tional HTTP | <t>On a given stream, receipt of multiple requests or receipt of an addi tional HTTP | |||
response following a final HTTP response <bcp14>MUST</bcp14> be treated as malfo | response following a final HTTP response <bcp14>MUST</bcp14> | |||
rmed | be treated as <xref format='none' target='malformed'>malformed</xref><iref item | |||
(<xref target="malformed" format="default"/>).</t> | ='malformed'/>.</t> | |||
<t>An HTTP message (request or response) consists of:</t> | <t>An HTTP message (request or response) consists of:</t> | |||
<ol spacing="normal" type="1"><li>the header section, sent as a single H | <ol spacing='normal' type='1'> | |||
EADERS frame (see <xref target="frame-headers" format="default"/>),</li> | <li>the header section, including message control data, sent as a sing | |||
<li>optionally, the content, if present, sent as a series of DATA fram | le <xref format='none' target='frame-headers'>HEADERS</xref><iref item='HEADERS' | |||
es | /> | |||
(see <xref target="frame-data" format="default"/>), and</li> | frame,</li> | |||
<li>optionally, the trailer section, if present, sent as a single HEAD | <li>optionally, the content, if present, sent as a series of <xref for | |||
ERS frame.</li> | mat='none' target='frame-data'>DATA</xref><iref item='DATA'/> frames, and</li> | |||
<li>optionally, the trailer section, if present, sent as a single <xre | ||||
f format='none' target='frame-headers'>HEADERS</xref><iref item='HEADERS'/> fram | ||||
e.</li> | ||||
</ol> | </ol> | |||
<t>Header and trailer sections are described in Sections <xref target="R | <t>Header and trailer sections are described in Sections <xref section=' | |||
FCYYY4" section="6.3" sectionFormat="bare" format="default"/> and <xref target=" | 6.3' sectionFormat='bare' target='RFC9110'/> and <xref section='6.5' sectionForm | |||
RFCYYY4" section="6.5" sectionFormat="bare" format="default"/> of <xref target=" | at='bare' target='RFC9110'/> of <xref target='RFC9110'/>; the content is describ | |||
RFCYYY4" format="default"/>; the content is described in <xref section="6.4" sec | ed in <xref section='6.4' sectionFormat='of' target='RFC9110'/>.</t> | |||
tionFormat="of" target="RFCYYY4" format="default"/>.</t> | <t>Receipt of an invalid sequence of frames <bcp14>MUST</bcp14> | |||
<t>Receipt of an invalid sequence of frames <bcp14>MUST</bcp14> be treat | be treated as a <xref format='none' target='errors'>connection error</xref><ire | |||
ed as a connection error | f item='connection error'/> | |||
of type H3_FRAME_UNEXPECTED; see <xref target="errors" format="default"/>. In p | of type <xref format='none' target='H3_FRAME_UNEXPECTED'>H3_FRAME_UNEXPECTED</xr | |||
articular, a DATA frame before | ef><iref item='H3_FRAME_UNEXPECTED'/>. In particular, a <xref format='none' tar | |||
any HEADERS frame, or a HEADERS or DATA frame after the trailing HEADERS frame, | get='frame-data'>DATA</xref><iref item='DATA'/> frame before | |||
any <xref format='none' target='frame-headers'>HEADERS</xref><iref item='HEADERS | ||||
'/> frame, or a <xref format='none' target='frame-headers'>HEADERS</xref><iref i | ||||
tem='HEADERS'/> or <xref format='none' target='frame-data'>DATA</xref><iref item | ||||
='DATA'/> frame after the trailing <xref format='none' target='frame-headers'>HE | ||||
ADERS</xref><iref item='HEADERS'/> frame, | ||||
is considered invalid. Other frame types, especially unknown frame types, | is considered invalid. Other frame types, especially unknown frame types, | |||
might be permitted subject to their own rules; see <xref target="extensions" for | might be permitted subject to their own rules; see <xref target='extensions'/>.< | |||
mat="default"/>.</t> | /t> | |||
<t>A server <bcp14>MAY</bcp14> send one or more PUSH_PROMISE frames (<xr | <t>A server <bcp14>MAY</bcp14> | |||
ef target="frame-push-promise" format="default"/>) | send one or more <xref format='none' target='frame-push-promise'>PUSH_PROMISE</ | |||
xref><iref item='PUSH_PROMISE'/> frames | ||||
before, after, or interleaved with the frames of a response message. These | before, after, or interleaved with the frames of a response message. These | |||
PUSH_PROMISE frames are not part of the response; see <xref target="server-push" | <xref format='none' target='frame-push-promise'>PUSH_PROMISE</xref><iref item='P | |||
format="default"/> for more | USH_PROMISE'/> frames are not part of the response; see <xref target='server-pus | |||
details. PUSH_PROMISE frames are not permitted on push streams; a pushed | h'/> for more | |||
response that includes PUSH_PROMISE frames <bcp14>MUST</bcp14> be treated as a c | details. <xref format='none' target='frame-push-promise'>PUSH_PROMISE</xref><ir | |||
onnection error | ef item='PUSH_PROMISE'/> frames are not permitted on <xref format='none' target= | |||
of type H3_FRAME_UNEXPECTED; see <xref target="errors" format="default"/>.</t> | 'push-streams'>push streams</xref><iref item='push stream'/>; a pushed | |||
<t>Frames of unknown types (<xref target="extensions" format="default"/> | response that includes <xref format='none' target='frame-push-promise'>PUSH_PROM | |||
), including reserved frames | ISE</xref><iref item='PUSH_PROMISE'/> frames <bcp14>MUST</bcp14> | |||
(<xref target="frame-reserved" format="default"/>) <bcp14>MAY</bcp14> be sent on | be treated as a <xref format='none' target='errors'>connection error</xref><ire | |||
a request or push stream before, after, or | f item='connection error'/> | |||
of type <xref format='none' target='H3_FRAME_UNEXPECTED'>H3_FRAME_UNEXPECTED</xr | ||||
ef><iref item='H3_FRAME_UNEXPECTED'/>.</t> | ||||
<t>Frames of unknown types (<xref target='extensions'/>), including rese | ||||
rved frames | ||||
(<xref target='frame-reserved'/>) <bcp14>MAY</bcp14> | ||||
be sent on a request or <xref format='none' target='push-streams'>push stream</ | ||||
xref><iref item='push stream'/> before, after, or | ||||
interleaved with other frames described in this section.</t> | interleaved with other frames described in this section.</t> | |||
<t>The HEADERS and PUSH_PROMISE frames might reference updates to the QP ACK dynamic | <t>The <xref format='none' target='frame-headers'>HEADERS</xref><iref it em='HEADERS'/> and <xref format='none' target='frame-push-promise'>PUSH_PROMISE< /xref><iref item='PUSH_PROMISE'/> frames might reference updates to the QPACK dy namic | |||
table. While these updates are not directly part of the message exchange, they | table. While these updates are not directly part of the message exchange, they | |||
must be received and processed before the message can be consumed. See | must be received and processed before the message can be consumed. See | |||
<xref target="header-formatting" format="default"/> for more details.</t> | <xref target='header-formatting'/> for more details.</t> | |||
<t>Transfer codings (see <xref section="6.1" sectionFormat="of" target=" | <t>Transfer codings (see <xref section='7' sectionFormat='of' target='RF | |||
I-D.ietf-httpbis-messaging" format="default"/>) are not defined for HTTP/3; | C9112'/>) are not defined for HTTP/3; | |||
the Transfer-Encoding header field <bcp14>MUST NOT</bcp14> be used.</t> | the Transfer-Encoding header field <bcp14>MUST NOT</bcp14> | |||
<t>A response <bcp14>MAY</bcp14> consist of multiple messages when and o | be used.</t> | |||
nly when one or more | <t>A response <bcp14>MAY</bcp14> | |||
interim responses (1xx; see <xref section="15.2" sectionFormat="of" target="RFCY | consist of multiple messages when and only when one or more | |||
YY4" format="default"/>) precede a final | interim responses (1xx; see <xref section='15.2' sectionFormat='of' target='RFC9 | |||
110'/>) precede a final | ||||
response to the same request. Interim responses do not contain content | response to the same request. Interim responses do not contain content | |||
or trailer sections.</t> | or trailer sections.</t> | |||
<t>An HTTP request/response exchange fully consumes a client-initiated | <t>An HTTP request/response exchange fully consumes a client-initiated | |||
bidirectional QUIC stream. After sending a request, a client <bcp14>MUST</bcp14> | bidirectional QUIC stream. After sending a request, a client <bcp14>MUS | |||
close the | T</bcp14> | |||
stream for sending. Unless using the CONNECT method (see <xref target="connect" | close the | |||
format="default"/>), clients | stream for sending. Unless using the CONNECT method (see <xref target='connect' | |||
<bcp14>MUST NOT</bcp14> make stream closure dependent on receiving a response to | />), clients <bcp14>MUST NOT</bcp14> | |||
their request. | make stream closure dependent on receiving a response to their request. | |||
After sending a final response, the server <bcp14>MUST</bcp14> close the stream | After sending a final response, the server <bcp14>MUST</bcp14> | |||
for sending. At | close the stream for sending. At | |||
this point, the QUIC stream is fully closed.</t> | this point, the QUIC stream is fully closed.</t> | |||
<t>When a stream is closed, this indicates the end of the final HTTP mes sage. | <t>When a stream is closed, this indicates the end of the final HTTP mes sage. | |||
Because some messages are large or unbounded, endpoints <bcp14>SHOULD</bcp14> be | Because some messages are large or unbounded, endpoints <bcp14>SHOULD</ | |||
gin processing | bcp14> | |||
begin processing | ||||
partial HTTP messages once enough of the message has been received to make | partial HTTP messages once enough of the message has been received to make | |||
progress. If a client-initiated stream terminates without enough of the HTTP | progress. If a client-initiated stream terminates without enough of the HTTP | |||
message to provide a complete response, the server <bcp14>SHOULD</bcp14> abort i | message to provide a complete response, the server <bcp14>SHOULD</bcp14 | |||
ts response | > | |||
stream with the error code H3_REQUEST_INCOMPLETE; see <xref target="errors" form | abort its response | |||
at="default"/>.</t> | stream with the error code <xref format='none' target='H3_REQUEST_INCOMPLETE'>H3 | |||
_REQUEST_INCOMPLETE</xref><iref item='H3_REQUEST_INCOMPLETE'/>.</t> | ||||
<t>A server can send a complete response prior to the client sending an entire | <t>A server can send a complete response prior to the client sending an entire | |||
request if the response does not depend on any portion of the request that has | request if the response does not depend on any portion of the request that has | |||
not been sent and received. When the server does not need to receive the | not been sent and received. When the server does not need to receive the | |||
remainder of the request, it <bcp14>MAY</bcp14> abort reading the request stream | remainder of the request, it <bcp14>MAY</bcp14> | |||
, send a | abort reading the <xref format='none' target='request-streams'>request stream</ | |||
xref><iref item='request stream'/>, send a | ||||
complete response, and cleanly close the sending part of the stream. The error | complete response, and cleanly close the sending part of the stream. The error | |||
code H3_NO_ERROR <bcp14>SHOULD</bcp14> be used when requesting that the client s | code <xref format='none' target='H3_NO_ERROR'>H3_NO_ERROR</xref><iref item='H3_N | |||
top sending on | O_ERROR'/> <bcp14>SHOULD</bcp14> | |||
the request stream. Clients <bcp14>MUST NOT</bcp14> discard complete responses | be used when requesting that the client stop sending on | |||
as a result of | the <xref format='none' target='request-streams'>request stream</xref><iref item | |||
='request stream'/>. Clients <bcp14>MUST NOT</bcp14> | ||||
discard complete responses as a result of | ||||
having their request terminated abruptly, though clients can always discard | having their request terminated abruptly, though clients can always discard | |||
responses at their discretion for other reasons. If the server sends a partial | responses at their discretion for other reasons. If the server sends a partial | |||
or complete response but does not abort reading the request, clients <bcp14>SHOU | or complete response but does not abort reading the request, clients <b | |||
LD</bcp14> | cp14>SHOULD</bcp14> | |||
continue sending the body of the request and close the stream normally.</t> | ||||
<section anchor="header-formatting" numbered="true" toc="default"> | continue sending the content of the request and close the stream normally.</t> | |||
<name>Field Formatting and Compression</name> | <section anchor='request-cancellation'> | |||
<t>HTTP messages carry metadata as a series of key-value pairs called | ||||
HTTP fields; | ||||
see Sections <xref target="RFCYYY4" section="6.3" sectionFormat="bare" format="d | ||||
efault"/> and <xref target="RFCYYY4" section="6.5" sectionFormat="bare" format=" | ||||
default"/> of <xref target="RFCYYY4" format="default"/>. For a listing of regist | ||||
ered HTTP | ||||
fields, see the "Hypertext Transfer Protocol (HTTP) Field Name Registry" | ||||
maintained at <eref target="https://www.iana.org/assignments/http-fields/"/>.</t | ||||
> | ||||
<ul empty="true" spacing="normal"> | ||||
<li> | ||||
<strong>Note:</strong> This registry will not exist until <xref t | ||||
arget="RFCYYY4" format="default"/> is approved. | ||||
<strong>RFC Editor</strong>, please remove this note prior to publication.</li> | ||||
</ul> | ||||
<t>Field names are strings containing a subset of ASCII characters. Pr | ||||
operties of | ||||
HTTP field names and values are discussed in more detail in <xref section="5.1" | ||||
sectionFormat="of" target="RFCYYY4" format="default"/>. As in HTTP/2, characters | ||||
in field names <bcp14>MUST</bcp14> be converted to | ||||
lowercase prior to their encoding. A request or response containing uppercase | ||||
characters in field names <bcp14>MUST</bcp14> be treated as malformed (<xref tar | ||||
get="malformed" format="default"/>).</t> | ||||
<t>Like HTTP/2, HTTP/3 does not use the Connection header field to ind | ||||
icate | ||||
connection-specific fields; in this protocol, connection-specific metadata is | ||||
conveyed by other means. An endpoint <bcp14>MUST NOT</bcp14> generate an HTTP/3 | ||||
field section | ||||
containing connection-specific fields; any message containing | ||||
connection-specific fields <bcp14>MUST</bcp14> be treated as malformed (<xref ta | ||||
rget="malformed" format="default"/>).</t> | ||||
<t>The only exception to this is the TE header field, which <bcp14>MAY | ||||
</bcp14> be present in an | ||||
HTTP/3 request header; when it is, it <bcp14>MUST NOT</bcp14> contain any value | ||||
other than | ||||
"trailers".</t> | ||||
<t>An intermediary transforming an HTTP/1.x message to HTTP/3 <bcp14>M | ||||
UST</bcp14> remove | ||||
connection-specific header fields as discussed in <xref section="7.6.1" sectionF | ||||
ormat="of" target="RFCYYY4" format="default"/>, or their messages will be treate | ||||
d by other HTTP/3 endpoints as | ||||
malformed (<xref target="malformed" format="default"/>).</t> | ||||
<section anchor="pseudo-header-fields" numbered="true" toc="default"> | ||||
<name>Pseudo-Header Fields</name> | ||||
<t>Like HTTP/2, HTTP/3 employs a series of pseudo-header fields wher | ||||
e the field | ||||
name begins with the ':' character (ASCII 0x3a). These pseudo-header fields | ||||
convey the target URI, the method of the request, and the status code for the | ||||
response.</t> | ||||
<t>Pseudo-header fields are not HTTP fields. Endpoints <bcp14>MUST | ||||
NOT</bcp14> generate | ||||
pseudo-header fields other than those defined in this document; however, an | ||||
extension could negotiate a modification of this restriction; see | ||||
<xref target="extensions" format="default"/>.</t> | ||||
<t>Pseudo-header fields are only valid in the context in which they | ||||
are defined. | ||||
Pseudo-header fields defined for requests <bcp14>MUST NOT</bcp14> appear in resp | ||||
onses; | ||||
pseudo-header fields defined for responses <bcp14>MUST NOT</bcp14> appear in req | ||||
uests. | ||||
Pseudo-header fields <bcp14>MUST NOT</bcp14> appear in trailer sections. Endpoin | ||||
ts <bcp14>MUST</bcp14> treat a | ||||
request or response that contains undefined or invalid pseudo-header fields as | ||||
malformed (<xref target="malformed" format="default"/>).</t> | ||||
<t>All pseudo-header fields <bcp14>MUST</bcp14> appear in the header | ||||
section before regular header | ||||
fields. Any request or response that contains a pseudo-header field that | ||||
appears in a header section after a regular header field <bcp14>MUST</bcp14> be | ||||
treated as | ||||
malformed (<xref target="malformed" format="default"/>).</t> | ||||
<t>The following pseudo-header fields are defined for requests:</t> | ||||
<dl> | ||||
<dt> | ||||
":method": </dt> | ||||
<dd> | ||||
<t>Contains the HTTP method (<xref section="9" sectionFormat="of | ||||
" target="RFCYYY4" format="default"/>)</t> | ||||
</dd> | ||||
<dt> | ||||
":scheme": </dt> | ||||
<dd> | ||||
<t>Contains the scheme portion of the target URI (<xref section= | ||||
"3.1" sectionFormat="of" target="RFC3986" format="default"/>)</t> | ||||
</dd> | ||||
<dt/> | ||||
<dd> | ||||
<t>":scheme" is not restricted to URIs with scheme "http" and "h | ||||
ttps". | ||||
A proxy or | ||||
gateway can translate requests for non-HTTP schemes, enabling the use of | ||||
HTTP to interact with non-HTTP services.</t> | ||||
</dd> | ||||
<dt/> | ||||
<dd> | ||||
<t>See <xref target="other-schemes" format="default"/> for guida | ||||
nce on using a scheme other than "https".</t> | ||||
</dd> | ||||
<dt> | ||||
":authority": </dt> | ||||
<dd> | ||||
<t>Contains the authority portion of the target URI (<xref secti | ||||
on="3.2" sectionFormat="of" target="RFC3986" format="default"/>). | ||||
The authority <bcp14>MUST NOT</bcp14> include the deprecated "userinfo" | ||||
subcomponent for URIs of scheme "http" or "https".</t> | ||||
</dd> | ||||
<dt/> | ||||
<dd> | ||||
<t>To ensure that the HTTP/1.1 request line can be reproduced ac | ||||
curately, this | ||||
pseudo-header field <bcp14>MUST</bcp14> be omitted when translating from an HTTP | ||||
/1.1 | ||||
request that has a request target in origin or asterisk form; see <xref section= | ||||
"7.1" sectionFormat="of" target="RFCYYY4" format="default"/>. Clients that gene | ||||
rate HTTP/3 requests directly | ||||
<bcp14>SHOULD</bcp14> use the ":authority" pseudo-header field instead of the Ho | ||||
st field. | ||||
An intermediary that converts an HTTP/3 request to HTTP/1.1 <bcp14>MUST</bcp14> | ||||
create a | ||||
Host field if one is not present in a request by copying the value of the | ||||
":authority" pseudo-header field.</t> | ||||
</dd> | ||||
<dt> | ||||
":path": </dt> | ||||
<dd> | ||||
<t>Contains the path and query parts of the target URI (the "pat | ||||
h-absolute" | ||||
production and optionally a '?' character followed by the "query" | ||||
production; see Sections <xref target="RFC3986" section="3.3" sectionFormat="bar | ||||
e" format="default"/> and <xref target="RFC3986" section="3.4" sectionFormat="ba | ||||
re" format="default"/> of <xref target="RFC3986" format="default"/>. A request | ||||
in | ||||
asterisk form includes the value '*' for the ":path" pseudo-header field.</t> | ||||
</dd> | ||||
<dt/> | ||||
<dd> | ||||
<t>This pseudo-header field <bcp14>MUST NOT</bcp14> be empty for | ||||
"http" or "https" URIs; | ||||
"http" or "https" URIs that do not contain a path component <bcp14>MUST</bcp14> | ||||
include a | ||||
value of '/'. The exception to this rule is an OPTIONS request for an | ||||
"http" or "https" URI that does not include a path component; these <bcp14>MUST< | ||||
/bcp14> | ||||
include a ":path" pseudo-header field with a value of '*'; see | ||||
<xref section="7.1" sectionFormat="of" target="RFCYYY4" format="default"/>.</t> | ||||
</dd> | ||||
</dl> | ||||
<t>All HTTP/3 requests <bcp14>MUST</bcp14> include exactly one value | ||||
for the ":method", ":scheme", | ||||
and ":path" pseudo-header fields, unless it is a CONNECT request; see | ||||
<xref target="connect" format="default"/>.</t> | ||||
<t>If the ":scheme" pseudo-header field identifies a scheme that has | ||||
a mandatory | ||||
authority component (including "http" and "https"), the request <bcp14>MUST</bcp | ||||
14> contain | ||||
either an ":authority" pseudo-header field or a "Host" header field. If these | ||||
fields are present, they <bcp14>MUST NOT</bcp14> be empty. If both fields are p | ||||
resent, they | ||||
<bcp14>MUST</bcp14> contain the same value. If the scheme does not have a manda | ||||
tory authority | ||||
component and none is provided in the request target, the request <bcp14>MUST NO | ||||
T</bcp14> | ||||
contain the ":authority" pseudo-header or "Host" header fields.</t> | ||||
<t>An HTTP request that omits mandatory pseudo-header fields or cont | ||||
ains invalid | ||||
values for those pseudo-header fields is malformed (<xref target="malformed" for | ||||
mat="default"/>).</t> | ||||
<t>HTTP/3 does not define a way to carry the version identifier that | ||||
is included in | ||||
the HTTP/1.1 request line.</t> | ||||
<t>For responses, a single ":status" pseudo-header field is defined | ||||
that carries | ||||
the HTTP status code; see <xref section="15" sectionFormat="of" target="RFCYYY4" | ||||
format="default"/>. This pseudo-header | ||||
field <bcp14>MUST</bcp14> be included in all responses; otherwise, the response | ||||
is malformed | ||||
(<xref target="malformed" format="default"/>).</t> | ||||
<t>HTTP/3 does not define a way to carry the version or reason phras | ||||
e that is | ||||
included in an HTTP/1.1 status line.</t> | ||||
</section> | ||||
<section anchor="field-compression" numbered="true" toc="default"> | ||||
<name>Field Compression</name> | ||||
<t><xref target="RFCYYY2" format="default"/> describes a variation o | ||||
f HPACK that gives an encoder some control over | ||||
how much head-of-line blocking can be caused by compression. This allows an | ||||
encoder to balance compression efficiency with latency. HTTP/3 uses QPACK to | ||||
compress header and trailer sections, including the pseudo-header fields present | ||||
in the header section.</t> | ||||
<t>To allow for better compression efficiency, the "Cookie" field (< | ||||
xref target="RFC6265" format="default"/>) | ||||
<bcp14>MAY</bcp14> be split into separate field lines, each with one or more coo | ||||
kie-pairs, | ||||
before compression. If a decompressed field section contains multiple cookie | ||||
field lines, these <bcp14>MUST</bcp14> be concatenated into a single byte string | ||||
using the | ||||
two-byte delimiter of 0x3b, 0x20 (the ASCII string "; ") before being passed | ||||
into a context other than HTTP/2 or HTTP/3, such as an HTTP/1.1 connection, or a | ||||
generic HTTP server application.</t> | ||||
</section> | ||||
<section anchor="header-size-constraints" numbered="true" toc="default | ||||
"> | ||||
<name>Header Size Constraints</name> | ||||
<t>An HTTP/3 implementation <bcp14>MAY</bcp14> impose a limit on the | ||||
maximum size of the message | ||||
header it will accept on an individual HTTP message. A server that receives a | ||||
larger header section than it is willing to handle can send an HTTP 431 (Request | ||||
Header Fields Too Large) status code (<xref target="RFC6585" format="default"/>) | ||||
. A client can discard | ||||
responses that it cannot process. The size of a field list is calculated based | ||||
on the uncompressed size of fields, including the length of the name and value | ||||
in bytes plus an overhead of 32 bytes for each field.</t> | ||||
<t>If an implementation wishes to advise its peer of this limit, it | ||||
can be conveyed | ||||
as a number of bytes in the SETTINGS_MAX_FIELD_SECTION_SIZE parameter. An | ||||
implementation that has received this parameter <bcp14>SHOULD NOT</bcp14> send a | ||||
n HTTP message | ||||
header that exceeds the indicated size, as the peer will likely refuse to | ||||
process it. However, an HTTP message can traverse one or more intermediaries | ||||
before reaching the origin server; see <xref section="3.7" sectionFormat="of" ta | ||||
rget="RFCYYY4" format="default"/>. Because | ||||
this limit is applied separately by each implementation which processes the | ||||
message, messages below this limit are not guaranteed to be accepted.</t> | ||||
</section> | ||||
</section> | ||||
<section anchor="request-cancellation" numbered="true" toc="default"> | ||||
<name>Request Cancellation and Rejection</name> | <name>Request Cancellation and Rejection</name> | |||
<t>Once a request stream has been opened, the request <bcp14>MAY</bcp1 | <t>Once a <xref format='none' target='request-streams'>request stream< | |||
4> be cancelled by either | /xref><iref item='request stream'/> has been opened, the request <bcp | |||
14>MAY</bcp14> | ||||
be cancelled by either | ||||
endpoint. Clients cancel requests if the response is no longer of interest; | endpoint. Clients cancel requests if the response is no longer of interest; | |||
servers cancel requests if they are unable to or choose not to respond. When | servers cancel requests if they are unable to or choose not to respond. When | |||
possible, it is <bcp14>RECOMMENDED</bcp14> that servers send an HTTP response wi | possible, it is <bcp14>RECOMMENDED</bcp14> | |||
th an | that servers send an HTTP response with an | |||
appropriate status code rather than canceling a request it has already begun | appropriate status code rather than cancelling a request it has already begun | |||
processing.</t> | processing.</t> | |||
<t>Implementations <bcp14>SHOULD</bcp14> cancel requests by abruptly t | <t>Implementations <bcp14>SHOULD</bcp14> | |||
erminating any | cancel requests by abruptly terminating any directions of | |||
directions of a stream that are still open. This means resetting the | a stream that are still open. To do so, an implementation resets the sending | |||
sending parts of streams and aborting reading on receiving parts of streams; | parts of streams and aborts reading on the receiving parts of streams; see | |||
see <xref section="2.4" sectionFormat="of" target="RFCYYY1" format="default"/>.< | <xref section='2.4' sectionFormat='of' target='QUIC-TRANSPORT'/>.</t> | |||
/t> | ||||
<t>When the server cancels a request without performing any applicatio n processing, | <t>When the server cancels a request without performing any applicatio n processing, | |||
the request is considered "rejected." The server <bcp14>SHOULD</bcp14> abort it | the request is considered "rejected". The server <bcp14>SHOULD</bcp1 | |||
s response | 4> | |||
stream with the error code H3_REQUEST_REJECTED. In this context, "processed" | abort its response | |||
stream with the error code <xref format='none' target='H3_REQUEST_REJECTED'>H3_R | ||||
EQUEST_REJECTED</xref><iref item='H3_REQUEST_REJECTED'/>. In this context, "proc | ||||
essed" | ||||
means that some data from the stream was passed to some higher layer of software | means that some data from the stream was passed to some higher layer of software | |||
that might have taken some action as a result. The client can treat requests | that might have taken some action as a result. The client can treat requests | |||
rejected by the server as though they had never been sent at all, thereby | rejected by the server as though they had never been sent at all, thereby | |||
allowing them to be retried later.</t> | allowing them to be retried later.</t> | |||
<t>Servers <bcp14>MUST NOT</bcp14> use the H3_REQUEST_REJECTED error c | <t>Servers <bcp14>MUST NOT</bcp14> | |||
ode for requests that were | use the <xref format='none' target='H3_REQUEST_REJECTED'>H3_REQUEST_REJECTED</x | |||
ref><iref item='H3_REQUEST_REJECTED'/> error code for requests that were | ||||
partially or fully processed. When a server abandons a response after partial | partially or fully processed. When a server abandons a response after partial | |||
processing, it <bcp14>SHOULD</bcp14> abort its response stream with the error co | processing, it <bcp14>SHOULD</bcp14> | |||
de | abort its response stream with the error code | |||
H3_REQUEST_CANCELLED.</t> | <xref format='none' target='H3_REQUEST_CANCELLED'>H3_REQUEST_CANCELLED</xref><ir | |||
<t>Client <bcp14>SHOULD</bcp14> use the error code H3_REQUEST_CANCELLE | ef item='H3_REQUEST_CANCELLED'/>.</t> | |||
D to cancel requests. Upon | <t>Client <bcp14>SHOULD</bcp14> | |||
receipt of this error code, a server <bcp14>MAY</bcp14> abruptly terminate the r | use the error code <xref format='none' target='H3_REQUEST_CANCELLED'>H3_REQUEST | |||
esponse using | _CANCELLED</xref><iref item='H3_REQUEST_CANCELLED'/> to cancel requests. Upon | |||
the error code H3_REQUEST_REJECTED if no processing was performed. Clients <bcp | receipt of this error code, a server <bcp14>MAY</bcp14> | |||
14>MUST | abruptly terminate the response using | |||
NOT</bcp14> use the H3_REQUEST_REJECTED error code, except when a server has req | the error code <xref format='none' target='H3_REQUEST_REJECTED'>H3_REQUEST_REJEC | |||
uested | TED</xref><iref item='H3_REQUEST_REJECTED'/> if no processing was performed. Cl | |||
closure of the request stream with this error code.</t> | ients <bcp14>MUST | |||
<t>If a stream is canceled after receiving a complete response, the cl | NOT</bcp14> | |||
ient <bcp14>MAY</bcp14> | use the <xref format='none' target='H3_REQUEST_REJECTED'>H3_REQUEST_REJECTED</x | |||
ref><iref item='H3_REQUEST_REJECTED'/> error code, except when a server has requ | ||||
ested | ||||
closure of the <xref format='none' target='request-streams'>request stream</xref | ||||
><iref item='request stream'/> with this error code.</t> | ||||
<t>If a stream is cancelled after receiving a complete response, the c | ||||
lient <bcp14>MAY</bcp14> | ||||
ignore the cancellation and use the response. However, if a stream is cancelled | ignore the cancellation and use the response. However, if a stream is cancelled | |||
after receiving a partial response, the response <bcp14>SHOULD NOT</bcp14> be us | after receiving a partial response, the response <bcp14>SHOULD NOT</b | |||
ed. Only | cp14> | |||
idempotent actions such as GET, PUT, or DELETE can be safely retried; a client | be used. Only | |||
<bcp14>SHOULD NOT</bcp14> automatically retry a request with a non-idempotent me | idempotent actions such as GET, PUT, or DELETE can be safely retried; a client | |||
thod unless it | <bcp14>SHOULD NOT</bcp14> | |||
automatically retry a request with a non-idempotent method unless it | ||||
has some means to know that the request semantics are idempotent | has some means to know that the request semantics are idempotent | |||
independent of the method or some means to detect that the original request was | independent of the method or some means to detect that the original request was | |||
never applied. See <xref section="9.2.2" sectionFormat="of" target="RFCYYY4" fo rmat="default"/> for more details.</t> | never applied. See <xref section='9.2.2' sectionFormat='of' target='RFC9110'/> for more details.</t> | |||
</section> | </section> | |||
<section anchor="malformed" numbered="true" toc="default"> | <section anchor='malformed'> | |||
<name>Malformed Requests and Responses</name> | <name>Malformed Requests and Responses</name><iref item='malformed' pr | |||
imary='true'/> | ||||
<t>A malformed request or response is one that is an otherwise valid s equence of | <t>A malformed request or response is one that is an otherwise valid s equence of | |||
frames but is invalid due to:</t> | frames but is invalid due to:</t> | |||
<ul spacing="normal"> | <ul spacing='normal'> | |||
<li>the presence of prohibited fields or pseudo-header fields,</li> | <li>the presence of prohibited fields or pseudo-header fields,</li> | |||
<li>the absence of mandatory pseudo-header fields,</li> | <li>the absence of mandatory pseudo-header fields,</li> | |||
<li>invalid values for pseudo-header fields,</li> | <li>invalid values for pseudo-header fields,</li> | |||
<li>pseudo-header fields after fields,</li> | <li>pseudo-header fields after fields,</li> | |||
<li>an invalid sequence of HTTP messages,</li> | <li>an invalid sequence of HTTP messages,</li> | |||
<li>the inclusion of uppercase field names, or</li> | <li>the inclusion of uppercase field names, or</li> | |||
<li>the inclusion of invalid characters in field names or values.</l i> | <li>the inclusion of invalid characters in field names or values.</l i> | |||
</ul> | </ul> | |||
<t>A request or response that is defined as having content when it con tains a | <t>A request or response that is defined as having content when it con tains a | |||
Content-Length header field (<xref section="6.4.1" sectionFormat="of" target="RF | Content-Length header field (<xref section='8.6' sectionFormat='of' target='RFC9 | |||
CYYY4" format="default"/>), | 110'/>) is malformed if the | |||
is malformed if the value of a Content-Length header field does not equal the | value of the Content-Length header field does not equal the sum of the <xref for | |||
sum of the DATA frame lengths received. A response that is defined as never | mat='none' target='frame-data'>DATA</xref><iref item='DATA'/> | |||
having content, even when a Content-Length is present, can have a non-zero | frame lengths received. A response that is defined as never having content, even | |||
Content-Length field even though no content is included in DATA frames.</t> | when a Content-Length is present, can have a non-zero Content-Length header | |||
field even though no content is included in <xref format='none' target='frame-da | ||||
ta'>DATA</xref><iref item='DATA'/> frames.</t> | ||||
<t>Intermediaries that process HTTP requests or responses (i.e., any i ntermediary | <t>Intermediaries that process HTTP requests or responses (i.e., any i ntermediary | |||
not acting as a tunnel) <bcp14>MUST NOT</bcp14> forward a malformed request or r | not acting as a tunnel) <bcp14>MUST NOT</bcp14> | |||
esponse. | forward a malformed request or response. | |||
Malformed requests or responses that are detected <bcp14>MUST</bcp14> be treated | Malformed requests or responses that are detected <bcp14>MUST</bcp14> | |||
as a stream | be treated as a <xref format='none' target='errors'>stream | |||
error (<xref target="errors" format="default"/>) of type H3_MESSAGE_ERROR.</t> | error</xref><iref item='stream error'/> of type <xref format='none' target='H3_M | |||
<t>For malformed requests, a server <bcp14>MAY</bcp14> send an HTTP re | ESSAGE_ERROR'>H3_MESSAGE_ERROR</xref><iref item='H3_MESSAGE_ERROR'/>.</t> | |||
sponse indicating the error | <t>For malformed requests, a server <bcp14>MAY</bcp14> | |||
prior to closing or resetting the stream. Clients <bcp14>MUST NOT</bcp14> accep | send an HTTP response indicating the error | |||
t a malformed | prior to closing or resetting the stream. Clients <bcp14>MUST NOT</b | |||
cp14> | ||||
accept a malformed | ||||
response. Note that these requirements are intended to protect against several | response. Note that these requirements are intended to protect against several | |||
types of common attacks against HTTP; they are deliberately strict because being | types of common attacks against HTTP; they are deliberately strict because being | |||
permissive can expose implementations to these vulnerabilities.</t> | permissive can expose implementations to these vulnerabilities.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="connect" numbered="true" toc="default"> | <section anchor='header-formatting'> | |||
<name>HTTP Fields</name> | ||||
<t>HTTP messages carry metadata as a series of key-value pairs called "H | ||||
TTP | ||||
fields"; see Sections <xref section='6.3' sectionFormat='bare' target='RFC9110'/ | ||||
> and <xref section='6.5' sectionFormat='bare' target='RFC9110'/> of <xref targe | ||||
t='RFC9110'/>. For a listing of registered | ||||
HTTP fields, see the "Hypertext Transfer Protocol (HTTP) Field Name Registry" | ||||
maintained at <eref brackets='angle' target='https://www.iana.org/assignments/ht | ||||
tp-fields/'/>. Like HTTP/2, HTTP/3 has additional considerations related to | ||||
the use of characters in field names, the Connection header field, and | ||||
pseudo-header fields.</t> | ||||
<t>Field names are strings containing a subset of ASCII characters. Prop | ||||
erties of | ||||
HTTP field names and values are discussed in more detail in <xref section='5.1' | ||||
sectionFormat='of' target='RFC9110'/>. Characters in field names <bcp14 | ||||
>MUST</bcp14> | ||||
be converted to lowercase prior to | ||||
their encoding. A request or response containing uppercase characters in field | ||||
names <bcp14>MUST</bcp14> | ||||
be treated as <xref format='none' target='malformed'>malformed</xref><iref item | ||||
='malformed'/>.</t> | ||||
<t>HTTP/3 does not use the Connection header field to indicate connectio | ||||
n-specific | ||||
fields; in this protocol, connection-specific metadata is conveyed by other | ||||
means. An endpoint <bcp14>MUST NOT</bcp14> | ||||
generate an HTTP/3 field section containing | ||||
connection-specific fields; any message containing connection-specific fields | ||||
<bcp14>MUST</bcp14> | ||||
be treated as <xref format='none' target='malformed'>malformed</xref><iref item | ||||
='malformed'/>.</t> | ||||
<t>The only exception to this is the TE header field, which <bc | ||||
p14>MAY</bcp14> | ||||
be present in an | ||||
HTTP/3 request header; when it is, it <bcp14>MUST NOT</bcp14> | ||||
contain any value other than | ||||
"trailers".</t> | ||||
<t>An intermediary transforming an HTTP/1.x message to HTTP/3 < | ||||
bcp14>MUST</bcp14> | ||||
remove | ||||
connection-specific header fields as discussed in <xref section='7.6.1' sectionF | ||||
ormat='of' target='RFC9110'/>, or their messages will be treated by other HTTP/3 | ||||
endpoints as | ||||
<xref format='none' target='malformed'>malformed</xref><iref item='malformed'/>. | ||||
</t> | ||||
<section anchor='field-compression'> | ||||
<name>Field Compression</name> | ||||
<t><xref target='RFC9204'/> describes a variation of HPACK that gives | ||||
an encoder some control | ||||
over how much head-of-line blocking can be caused by compression. This allows | ||||
an encoder to balance compression efficiency with latency. HTTP/3 uses QPACK to | ||||
compress header and trailer sections, including the control data present in the | ||||
header section.</t> | ||||
<t>To allow for better compression efficiency, the Cookie header field | ||||
(<xref target='COOKIES'/>) <bcp14>MAY</bcp14> | ||||
be split into separate field lines, each with one or | ||||
more cookie-pairs, before compression. If a decompressed field section contains | ||||
multiple cookie field lines, these <bcp14>MUST</bcp14> | ||||
be concatenated into a single byte | ||||
string using the two-byte delimiter of "<tt>; </tt>" (ASCII 0x3b, 0x20) bef | ||||
ore being | ||||
passed into a context other than HTTP/2 or HTTP/3, such as an HTTP/1.1 | ||||
connection, or a generic HTTP server application.</t> | ||||
</section> | ||||
<section anchor='header-size-constraints'> | ||||
<name>Header Size Constraints</name> | ||||
<t>An HTTP/3 implementation <bcp14>MAY</bcp14> | ||||
impose a limit on the maximum size of the message | ||||
header it will accept on an individual HTTP message. A server that receives a | ||||
larger header section than it is willing to handle can send an HTTP 431 (Request | ||||
Header Fields Too Large) status code (<xref target='RFC6585'/>). A client can d | ||||
iscard | ||||
responses that it cannot process. The size of a field list is calculated based | ||||
on the uncompressed size of fields, including the length of the name and value | ||||
in bytes plus an overhead of 32 bytes for each field.</t> | ||||
<t>If an implementation wishes to advise its peer of this limit, it ca | ||||
n be conveyed | ||||
as a number of bytes in the <xref format='none' target='SETTINGS_MAX_FIELD_SECTI | ||||
ON_SIZE'>SETTINGS_MAX_FIELD_SECTION_SIZE</xref><iref item='SETTINGS_MAX_FIELD_SE | ||||
CTION_SIZE'/> parameter. An | ||||
implementation that has received this parameter <bcp14>SHOULD NOT</bc | ||||
p14> | ||||
send an HTTP message | ||||
header that exceeds the indicated size, as the peer will likely refuse to | ||||
process it. However, an HTTP message can traverse one or more intermediaries | ||||
before reaching the origin server; see <xref section='3.7' sectionFormat='of' ta | ||||
rget='RFC9110'/>. Because | ||||
this limit is applied separately by each implementation that processes the | ||||
message, messages below this limit are not guaranteed to be accepted.</t> | ||||
</section> | ||||
</section> | ||||
<section anchor='http-control-data'> | ||||
<name>HTTP Control Data</name> | ||||
<t>Like HTTP/2, HTTP/3 employs a series of pseudo-header fields, where t | ||||
he field | ||||
name begins with the <tt>:</tt> character (ASCII 0x3a). These pseudo-header fie | ||||
lds | ||||
convey message control data; see <xref section='6.2' sectionFormat='of' target=' | ||||
RFC9110'/>.</t> | ||||
<t>Pseudo-header fields are not HTTP fields. Endpoints <bcp14> | ||||
MUST NOT</bcp14> | ||||
generate | ||||
pseudo-header fields other than those defined in this document. However, an | ||||
extension could negotiate a modification of this restriction; see | ||||
<xref target='extensions'/>.</t> | ||||
<t>Pseudo-header fields are only valid in the context in which they are | ||||
defined. | ||||
Pseudo-header fields defined for requests <bcp14>MUST NOT</bcp14> | ||||
appear in responses; | ||||
pseudo-header fields defined for responses <bcp14>MUST NOT</bcp14> | ||||
appear in requests. | ||||
Pseudo-header fields <bcp14>MUST NOT</bcp14> | ||||
appear in trailer sections. Endpoints <bcp14>MUST</bcp14> | ||||
treat a | ||||
request or response that contains undefined or invalid pseudo-header fields as | ||||
<xref format='none' target='malformed'>malformed</xref><iref item='malformed'/>. | ||||
</t> | ||||
<t>All pseudo-header fields <bcp14>MUST</bcp14> | ||||
appear in the header section before regular header | ||||
fields. Any request or response that contains a pseudo-header field that | ||||
appears in a header section after a regular header field <bcp14>MUST</b | ||||
cp14> | ||||
be treated as | ||||
<xref format='none' target='malformed'>malformed</xref><iref item='malformed'/>. | ||||
</t> | ||||
<section anchor='request-pseudo-header-fields'> | ||||
<name>Request Pseudo-Header Fields</name> | ||||
<t>The following pseudo-header fields are defined for requests:</t> | ||||
<dl> | ||||
<dt>":method":</dt> | ||||
<dd> | ||||
<t>Contains the HTTP method (<xref section='9' sectionFormat='of' | ||||
target='RFC9110'/>)</t> | ||||
</dd> | ||||
<dt>":scheme":</dt> | ||||
<dd> | ||||
<t>Contains the scheme portion of the target URI (<xref section='3 | ||||
.1' sectionFormat='of' target='URI'/>).</t> | ||||
</dd> | ||||
<dt/> | ||||
<dd> | ||||
<t>The :scheme pseudo-header is not restricted to URIs with scheme | ||||
"http" and | ||||
"https". A proxy or gateway can translate requests for non-HTTP schemes, | ||||
enabling the use of HTTP to interact with non-HTTP services.</t> | ||||
</dd> | ||||
<dt/> | ||||
<dd> | ||||
<t>See <xref target='other-schemes'/> for guidance on using a sche | ||||
me other than "https".</t> | ||||
</dd> | ||||
<dt>":authority":</dt> | ||||
<dd> | ||||
<t>Contains the authority portion of the target URI (<xref section | ||||
='3.2' sectionFormat='of' target='URI'/>). | ||||
The authority <bcp14>MUST NOT</bcp14> | ||||
include the deprecated userinfo | ||||
subcomponent for URIs of scheme "http" or "https".</t> | ||||
</dd> | ||||
<dt/> | ||||
<dd> | ||||
<t>To ensure that the HTTP/1.1 request line can be reproduced accu | ||||
rately, this | ||||
pseudo-header field <bcp14>MUST</bcp14> | ||||
be omitted when translating from an HTTP/1.1 | ||||
request that has a request target in a method-specific form; see <xref section=' | ||||
7.1' sectionFormat='of' target='RFC9110'/>. Clients that generate HTTP/3 reques | ||||
ts directly <bcp14>SHOULD</bcp14> | ||||
use | ||||
the :authority pseudo-header field instead of the Host header field. An | ||||
intermediary that converts an HTTP/3 request to HTTP/1.1 <bcp14>M | ||||
UST</bcp14> | ||||
create a Host | ||||
field if one is not present in a request by copying the value of the | ||||
:authority pseudo-header field.</t> | ||||
</dd> | ||||
<dt>":path":</dt> | ||||
<dd> | ||||
<t>Contains the path and query parts of the target URI (the "path- | ||||
absolute" | ||||
production and optionally a <tt>?</tt> character (ASCII 0x3f) followed by the | ||||
"query" production; see Sections <xref section='3.3' sectionFormat='bare' target | ||||
='URI'/> and <xref section='3.4' sectionFormat='bare' target='URI'/> of <xref ta | ||||
rget='URI'/>.</t> | ||||
</dd> | ||||
<dt/> | ||||
<dd> | ||||
<t>This pseudo-header field <bcp14>MUST NOT</bcp14> | ||||
be empty for "http" or "https" URIs; | ||||
"http" or "https" URIs that do not contain a path component <bcp1 | ||||
4>MUST</bcp14> | ||||
include a | ||||
value of <tt>/</tt> (ASCII 0x2f). An OPTIONS request that does not include a pa | ||||
th | ||||
component includes the value <tt>*</tt> (ASCII 0x2a) for the :path pseudo-header | ||||
field; see <xref section='7.1' sectionFormat='of' target='RFC9110'/>.</t> | ||||
</dd> | ||||
</dl> | ||||
<t>All HTTP/3 requests <bcp14>MUST</bcp14> | ||||
include exactly one value for the :method, :scheme, | ||||
and :path pseudo-header fields, unless the request is a CONNECT request; see | ||||
<xref target='connect'/>.</t> | ||||
<t>If the :scheme pseudo-header field identifies a scheme that has a m | ||||
andatory | ||||
authority component (including "http" and "https"), the request <bcp1 | ||||
4>MUST</bcp14> | ||||
contain | ||||
either an :authority pseudo-header field or a Host header field. If these | ||||
fields are present, they <bcp14>MUST NOT</bcp14> | ||||
be empty. If both fields are present, they <bcp14>MUST</bcp14> | ||||
contain the same value. If the scheme does not have a mandatory authority | ||||
component and none is provided in the request target, the request <bc | ||||
p14>MUST NOT</bcp14> | ||||
contain the :authority pseudo-header or Host header fields.</t> | ||||
<t>An HTTP request that omits mandatory pseudo-header fields or contai | ||||
ns invalid | ||||
values for those pseudo-header fields is <xref format='none' target='malformed'> | ||||
malformed</xref><iref item='malformed'/>.</t> | ||||
<t>HTTP/3 does not define a way to carry the version identifier that i | ||||
s included in | ||||
the HTTP/1.1 request line. HTTP/3 requests implicitly have a protocol version | ||||
of "3.0".</t> | ||||
</section> | ||||
<section anchor='response-pseudo-header-fields'> | ||||
<name>Response Pseudo-Header Fields</name> | ||||
<t>For responses, a single ":status" pseudo-header field is defined th | ||||
at carries | ||||
the HTTP status code; see <xref section='15' sectionFormat='of' target='RFC9110' | ||||
/>. This pseudo-header | ||||
field <bcp14>MUST</bcp14> | ||||
be included in all responses; otherwise, the response is <xref format='none' ta | ||||
rget='malformed'>malformed</xref><iref item='malformed'/> | ||||
(see <xref target='malformed'/>).</t> | ||||
<t>HTTP/3 does not define a way to carry the version or reason phrase | ||||
that is | ||||
included in an HTTP/1.1 status line. HTTP/3 responses implicitly have a protocol | ||||
version of "3.0".</t> | ||||
</section> | ||||
</section> | ||||
<section anchor='connect'> | ||||
<name>The CONNECT Method</name> | <name>The CONNECT Method</name> | |||
<t>The CONNECT method requests that the recipient establish a tunnel to the | <t>The CONNECT method requests that the recipient establish a tunnel to the | |||
destination origin server identified by the request-target; see <xref section="9 .3.6" sectionFormat="of" target="RFCYYY4" format="default"/>. It is primarily us ed with HTTP proxies to establish a TLS | destination origin server identified by the request-target; see <xref section='9 .3.6' sectionFormat='of' target='RFC9110'/>. It is primarily used with HTTP prox ies to establish a TLS | |||
session with an origin server for the purposes of interacting with "https" | session with an origin server for the purposes of interacting with "https" | |||
resources.</t> | resources.</t> | |||
<t>In HTTP/1.x, CONNECT is used to convert an entire HTTP connection int o a tunnel | <t>In HTTP/1.x, CONNECT is used to convert an entire HTTP connection int o a tunnel | |||
to a remote host. In HTTP/2 and HTTP/3, the CONNECT method is used to establish | to a remote host. In HTTP/2 and HTTP/3, the CONNECT method is used to establish | |||
a tunnel over a single stream.</t> | a tunnel over a single stream.</t> | |||
<t>A CONNECT request <bcp14>MUST</bcp14> be constructed as follows:</t> | <t>A CONNECT request <bcp14>MUST</bcp14> | |||
<ul spacing="normal"> | be constructed as follows:</t> | |||
<li>The ":method" pseudo-header field is set to "CONNECT"</li> | <ul spacing='normal'> | |||
<li>The ":scheme" and ":path" pseudo-header fields are omitted</li> | <li>The :method pseudo-header field is set to "CONNECT"</li> | |||
<li>The ":authority" pseudo-header field contains the host and port to | <li>The :scheme and :path pseudo-header fields are omitted</li> | |||
connect to | <li>The :authority pseudo-header field contains the host and port to c | |||
onnect to | ||||
(equivalent to the authority-form of the request-target of CONNECT requests; | (equivalent to the authority-form of the request-target of CONNECT requests; | |||
see <xref section="7.1" sectionFormat="of" target="RFCYYY4" format="default"/>)< /li> | see <xref section='7.1' sectionFormat='of' target='RFC9110'/>).</li> | |||
</ul> | </ul> | |||
<t>The request stream remains open at the end of the request to carry th e data to | <t>The <xref format='none' target='request-streams'>request stream</xref ><iref item='request stream'/> remains open at the end of the request to carry t he data to | |||
be transferred. A CONNECT request that does not conform to these restrictions | be transferred. A CONNECT request that does not conform to these restrictions | |||
is malformed; see <xref target="malformed" format="default"/>.</t> | is <xref format='none' target='malformed'>malformed</xref><iref item='malformed' | |||
<t>A proxy that supports CONNECT establishes a TCP connection (<xref tar | />.</t> | |||
get="RFC0793" format="default"/>) to the | <t>A proxy that supports CONNECT establishes a TCP connection (<xref tar | |||
server identified in the ":authority" pseudo-header field. Once this connection | get='RFC0793'/>) to the | |||
is successfully established, the proxy sends a HEADERS frame containing a 2xx | server identified in the :authority pseudo-header field. Once this connection | |||
series status code to the client, as defined in <xref section="15.3" sectionForm | is successfully established, the proxy sends a <xref format='none' target='frame | |||
at="of" target="RFCYYY4" format="default"/>.</t> | -headers'>HEADERS</xref><iref item='HEADERS'/> frame containing a 2xx | |||
<t>All DATA frames on the stream correspond to data sent or received on | series status code to the client, as defined in <xref section='15.3' sectionForm | |||
the TCP | at='of' target='RFC9110'/>.</t> | |||
connection. The payload of any DATA frame sent by the client is transmitted by | <t>All <xref format='none' target='frame-data'>DATA</xref><iref item='DA | |||
TA'/> frames on the stream correspond to data sent or received on the TCP | ||||
connection. The payload of any <xref format='none' target='frame-data'>DATA</xre | ||||
f><iref item='DATA'/> frame sent by the client is transmitted by | ||||
the proxy to the TCP server; data received from the TCP server is packaged into | the proxy to the TCP server; data received from the TCP server is packaged into | |||
DATA frames by the proxy. Note that the size and number of TCP segments is not | <xref format='none' target='frame-data'>DATA</xref><iref item='DATA'/> frames by | |||
guaranteed to map predictably to the size and number of HTTP DATA or QUIC STREAM | the proxy. Note that the size and number of TCP segments is not | |||
guaranteed to map predictably to the size and number of HTTP <xref format='none' | ||||
target='frame-data'>DATA</xref><iref item='DATA'/> or QUIC STREAM | ||||
frames.</t> | frames.</t> | |||
<t>Once the CONNECT method has completed, only DATA frames are permitted | <t>Once the CONNECT method has completed, only <xref format='none' targe | |||
to be sent | t='frame-data'>DATA</xref><iref item='DATA'/> frames are permitted to be sent | |||
on the stream. Extension frames <bcp14>MAY</bcp14> be used if specifically perm | on the stream. Extension frames <bcp14>MAY</bcp14> | |||
itted by the | be used if specifically permitted by the | |||
definition of the extension. Receipt of any other known frame type <bcp14>MUST< | definition of the extension. Receipt of any other known frame type <bc | |||
/bcp14> be | p14>MUST</bcp14> | |||
treated as a connection error of type H3_FRAME_UNEXPECTED; see <xref target="err | be | |||
ors" format="default"/>.</t> | treated as a <xref format='none' target='errors'>connection error</xref><iref it | |||
em='connection error'/> of type <xref format='none' target='H3_FRAME_UNEXPECTED' | ||||
>H3_FRAME_UNEXPECTED</xref><iref item='H3_FRAME_UNEXPECTED'/>.</t> | ||||
<t>The TCP connection can be closed by either peer. When the client ends the | <t>The TCP connection can be closed by either peer. When the client ends the | |||
request stream (that is, the receive stream at the proxy enters the "Data Recvd" | <xref format='none' target='request-streams'>request stream</xref><iref item='re quest stream'/> (that is, the receive stream at the proxy enters the "Data Recvd " | |||
state), the proxy will set the FIN bit on its connection to the TCP server. When | state), the proxy will set the FIN bit on its connection to the TCP server. When | |||
the proxy receives a packet with the FIN bit set, it will close the send stream | the proxy receives a packet with the FIN bit set, it will close the send stream | |||
that it sends to the client. TCP connections that remain half-closed in a | that it sends to the client. TCP connections that remain half closed in a | |||
single direction are not invalid, but are often handled poorly by servers, so | single direction are not invalid, but are often handled poorly by servers, so | |||
clients <bcp14>SHOULD NOT</bcp14> close a stream for sending while they still ex | clients <bcp14>SHOULD NOT</bcp14> | |||
pect to receive | close a stream for sending while they still expect to receive | |||
data from the target of the CONNECT.</t> | data from the target of the CONNECT.</t> | |||
<t>A TCP connection error is signaled by abruptly terminating the stream . A proxy | <t>A TCP <xref format='none' target='errors'>connection error</xref><ire f item='connection error'/> is signaled by abruptly terminating the stream. A pr oxy | |||
treats any error in the TCP connection, which includes receiving a TCP segment | treats any error in the TCP connection, which includes receiving a TCP segment | |||
with the RST bit set, as a stream error of type H3_CONNECT_ERROR; see | with the RST bit set, as a <xref format='none' target='errors'>stream error</xre | |||
<xref target="errors" format="default"/>. Correspondingly, if a proxy detects a | f><iref item='stream error'/> of type <xref format='none' target='H3_CONNECT_ERR | |||
n error with the stream or the | OR'>H3_CONNECT_ERROR</xref><iref item='H3_CONNECT_ERROR'/>.</t> | |||
QUIC connection, it <bcp14>MUST</bcp14> close the TCP connection. If the underl | <t>Correspondingly, if a proxy detects an error with the stream or the Q | |||
ying TCP | UIC | |||
implementation permits it, the proxy <bcp14>SHOULD</bcp14> send a TCP segment wi | connection, it <bcp14>MUST</bcp14> | |||
th the RST bit | close the TCP connection. If the proxy detects that the | |||
set.</t> | client has reset the stream or aborted reading from the stream, it <bcp | |||
14>MUST</bcp14> | ||||
close | ||||
the TCP connection. If the stream is reset or reading is aborted by the client, | ||||
a proxy <bcp14>SHOULD</bcp14> | ||||
perform the same operation on the other direction in order to | ||||
ensure that both directions of the stream are cancelled. In all these cases, if | ||||
the underlying TCP implementation permits it, the proxy <bcp14>SHOULD</ | ||||
bcp14> | ||||
send a TCP | ||||
segment with the RST bit set.</t> | ||||
<t>Since CONNECT creates a tunnel to an arbitrary server, proxies that s upport | <t>Since CONNECT creates a tunnel to an arbitrary server, proxies that s upport | |||
CONNECT <bcp14>SHOULD</bcp14> restrict its use to a set of known ports or a list | CONNECT <bcp14>SHOULD</bcp14> | |||
of safe | restrict its use to a set of known ports or a list of safe | |||
request targets; see <xref section="9.3.6" sectionFormat="of" target="RFCYYY4" f | request targets; see <xref section='9.3.6' sectionFormat='of' target='RFC9110'/> | |||
ormat="default"/> for more detail.</t> | for more details.</t> | |||
</section> | </section> | |||
<section anchor="http-upgrade" numbered="true" toc="default"> | <section anchor='http-upgrade'> | |||
<name>HTTP Upgrade</name> | <name>HTTP Upgrade</name> | |||
<t>HTTP/3 does not support the HTTP Upgrade mechanism (<xref section="7. | <t>HTTP/3 does not support the HTTP Upgrade mechanism (<xref section='7. | |||
8" sectionFormat="of" target="RFCYYY4" format="default"/>) or 101 (Switching Pro | 8' sectionFormat='of' target='RFC9110'/>) or the 101 (Switching Protocols) infor | |||
tocols) informational status code (<xref section="15.2.2" sectionFormat="of" tar | mational status code | |||
get="RFCYYY4" format="default"/>).</t> | (<xref section='15.2.2' sectionFormat='of' target='RFC9110'/>).</t> | |||
</section> | </section> | |||
<section anchor="server-push" numbered="true" toc="default"> | <section anchor='server-push'> | |||
<name>Server Push</name> | <name>Server Push</name><iref item='push ID' primary='true'/> | |||
<t>Server push is an interaction mode that permits a server to push a | <t>Server push is an interaction mode that permits a server to push a | |||
request-response exchange to a client in anticipation of the client making the | request-response exchange to a client in anticipation of the client making the | |||
indicated request. This trades off network usage against a potential latency | indicated request. This trades off network usage against a potential latency | |||
gain. HTTP/3 server push is similar to what is described in | gain. HTTP/3 server push is similar to what is described in | |||
<xref section="8.2" sectionFormat="of" target="RFC7540" format="default"/>, but | <xref section='8.2' sectionFormat='of' target='RFC9113'/>, but it uses different | |||
uses different mechanisms.</t> | mechanisms.</t> | |||
<t>Each server push is assigned a unique Push ID by the server. The Pus | <t>Each server push is assigned a unique push ID by the server. The pus | |||
h ID is | h ID is | |||
used to refer to the push in various contexts throughout the lifetime of the | used to refer to the push in various contexts throughout the lifetime of the | |||
HTTP/3 connection.</t> | HTTP/3 connection.</t> | |||
<t>The Push ID space begins at zero, and ends at a maximum value set by | <t>The push ID space begins at zero and ends at a maximum value set by t | |||
the | he | |||
MAX_PUSH_ID frame; see <xref target="frame-max-push-id" format="default"/>. In | <xref format='none' target='frame-max-push-id'>MAX_PUSH_ID</xref><iref item='MAX | |||
particular, a server is not | _PUSH_ID'/> frame. In particular, a server is not | |||
able to push until after the client sends a MAX_PUSH_ID frame. A client sends | able to push until after the client sends a <xref format='none' target='frame-ma | |||
MAX_PUSH_ID frames to control the number of pushes that a server can promise. A | x-push-id'>MAX_PUSH_ID</xref><iref item='MAX_PUSH_ID'/> frame. A client sends | |||
server <bcp14>SHOULD</bcp14> use Push IDs sequentially, beginning from zero. A | <xref format='none' target='frame-max-push-id'>MAX_PUSH_ID</xref><iref item='MAX | |||
client <bcp14>MUST</bcp14> | _PUSH_ID'/> frames to control the number of pushes that a server can promise. A | |||
treat receipt of a push stream as a connection error of type H3_ID_ERROR | server <bcp14>SHOULD</bcp14> | |||
(<xref target="errors" format="default"/>) when no MAX_PUSH_ID frame has been se | use push IDs sequentially, beginning from zero. A client <bcp14>MUST< | |||
nt or when the stream | /bcp14> | |||
references a Push ID that is greater than the maximum Push ID.</t> | ||||
<t>The Push ID is used in one or more PUSH_PROMISE frames (<xref target= | treat receipt of a <xref format='none' target='push-streams'>push stream</xref>< | |||
"frame-push-promise" format="default"/>) | iref item='push stream'/> as a <xref format='none' target='errors'>connection er | |||
that carry the header section of the request message. These frames are sent on | ror</xref><iref item='connection error'/> of type <xref format='none' target='H3 | |||
the request stream that generated the push. This allows the server push to be | _ID_ERROR'>H3_ID_ERROR</xref><iref item='H3_ID_ERROR'/> | |||
associated with a client request. When the same Push ID is promised on multiple | when no <xref format='none' target='frame-max-push-id'>MAX_PUSH_ID</xref><iref i | |||
request streams, the decompressed request field sections <bcp14>MUST</bcp14> con | tem='MAX_PUSH_ID'/> frame has been sent or when the stream | |||
tain the same | references a push ID that is greater than the maximum push ID.</t> | |||
fields in the same order, and both the name and the value in each field <bcp14>M | <t>The push ID is used in one or more <xref format='none' target='frame- | |||
UST</bcp14> be | push-promise'>PUSH_PROMISE</xref><iref item='PUSH_PROMISE'/> frames that carry t | |||
he control | ||||
data and header fields of the request message. These frames are sent on the | ||||
<xref format='none' target='request-streams'>request stream</xref><iref item='re | ||||
quest stream'/> that generated the push. This allows the server push to be | ||||
associated with a client request. When the same push ID is promised on multiple | ||||
<xref format='none' target='request-streams'>request streams</xref><iref item='r | ||||
equest stream'/>, the decompressed request field sections <bcp14>MUST</ | ||||
bcp14> | ||||
contain the same | ||||
fields in the same order, and both the name and the value in each field | ||||
<bcp14>MUST</bcp14> | ||||
be | ||||
identical.</t> | identical.</t> | |||
<t>The Push ID is then included with the push stream that ultimately ful | <t>The push ID is then included with the <xref format='none' target='pus | |||
fills | h-streams'>push stream</xref><iref item='push stream'/> that ultimately fulfills | |||
those promises; see <xref target="push-streams" format="default"/>. The push st | those promises. The <xref format='none' target='push-streams'>push stream</xref | |||
ream identifies the Push ID of | ><iref item='push stream'/> identifies the push ID of | |||
the promise that it fulfills, then contains a response to the promised request | the promise that it fulfills, then contains a response to the promised request | |||
as described in <xref target="request-response" format="default"/>.</t> | as described in <xref target='request-response'/>.</t> | |||
<t>Finally, the Push ID can be used in CANCEL_PUSH frames; see | <t>Finally, the push ID can be used in <xref format='none' target='frame | |||
<xref target="frame-cancel-push" format="default"/>. Clients use this frame to | -cancel-push'>CANCEL_PUSH</xref><iref item='CANCEL_PUSH'/> frames; see | |||
indicate they do not wish to | <xref target='frame-cancel-push'/>. Clients use this frame to indicate they do | |||
not wish to | ||||
receive a promised resource. Servers use this frame to indicate they will not | receive a promised resource. Servers use this frame to indicate they will not | |||
be fulfilling a previous promise.</t> | be fulfilling a previous promise.</t> | |||
<t>Not all requests can be pushed. A server <bcp14>MAY</bcp14> push req | <t>Not all requests can be pushed. A server <bcp14>MAY</bcp14> | |||
uests that have the | push requests that have the | |||
following properties:</t> | following properties:</t> | |||
<ul spacing="normal"> | <ul spacing='normal'> | |||
<li>cacheable; see <xref section="9.2.3" sectionFormat="of" target="RF | <li>cacheable; see <xref section='9.2.3' sectionFormat='of' target='RF | |||
CYYY4" format="default"/></li> | C9110'/></li> | |||
<li>safe; see <xref section="9.2.1" sectionFormat="of" target="RFCYYY4 | <li>safe; see <xref section='9.2.1' sectionFormat='of' target='RFC9110 | |||
" format="default"/></li> | '/></li> | |||
<li>does not include a request body or trailer section</li> | <li>does not include request content or a trailer section</li> | |||
</ul> | </ul> | |||
<t>The server <bcp14>MUST</bcp14> include a value in the ":authority" ps | <t>The server <bcp14>MUST</bcp14> | |||
eudo-header field for | include a value in the :authority pseudo-header field for | |||
which the server is authoritative. If the client has not yet validated the | which the server is authoritative. If the client has not yet validated the | |||
connection for the origin indicated by the pushed request, it <bcp14>MUST</bcp14 | connection for the origin indicated by the pushed request, it <bcp14>MU | |||
> perform the | ST</bcp14> | |||
perform the | ||||
same verification process it would do before sending a request for that origin | same verification process it would do before sending a request for that origin | |||
on the connection; see <xref target="connection-reuse" format="default"/>. If t | on the connection; see <xref target='connection-reuse'/>. If this verification | |||
his verification fails, | fails, | |||
the client <bcp14>MUST NOT</bcp14> consider the server authoritative for that or | the client <bcp14>MUST NOT</bcp14> | |||
igin.</t> | consider the server authoritative for that origin.</t> | |||
<t>Clients <bcp14>SHOULD</bcp14> send a CANCEL_PUSH frame upon receipt o | <t>Clients <bcp14>SHOULD</bcp14> | |||
f a PUSH_PROMISE frame | send a <xref format='none' target='frame-cancel-push'>CANCEL_PUSH</xref><iref i | |||
tem='CANCEL_PUSH'/> frame upon receipt of a <xref format='none' target='frame-pu | ||||
sh-promise'>PUSH_PROMISE</xref><iref item='PUSH_PROMISE'/> frame | ||||
carrying a request that is not cacheable, is not known to be safe, that | carrying a request that is not cacheable, is not known to be safe, that | |||
indicates the presence of a request body, or for which it does not consider the | indicates the presence of request content, or for which it does not consider the | |||
server authoritative. Any corresponding responses <bcp14>MUST NOT</bcp14> be us | server authoritative. Any corresponding responses <bcp14>MUST NOT</bcp | |||
ed or cached.</t> | 14> | |||
be used or cached.</t> | ||||
<t>Each pushed response is associated with one or more client requests. The push | <t>Each pushed response is associated with one or more client requests. The push | |||
is associated with the request stream on which the PUSH_PROMISE frame was | is associated with the <xref format='none' target='request-streams'>request stre am</xref><iref item='request stream'/> on which the <xref format='none' target=' frame-push-promise'>PUSH_PROMISE</xref><iref item='PUSH_PROMISE'/> frame was | |||
received. The same server push can be associated with additional client | received. The same server push can be associated with additional client | |||
requests using a PUSH_PROMISE frame with the same Push ID on multiple request | requests using a <xref format='none' target='frame-push-promise'>PUSH_PROMISE</x | |||
streams. These associations do not affect the operation of the protocol, but | ref><iref item='PUSH_PROMISE'/> frame with the same push ID on multiple <xref fo | |||
<bcp14>MAY</bcp14> be considered by user agents when deciding how to use pushed | rmat='none' target='request-streams'>request | |||
resources.</t> | streams</xref><iref item='request stream'/>. These associations do not affect t | |||
<t>Ordering of a PUSH_PROMISE frame in relation to certain parts of the | he operation of the protocol, but | |||
response is | they <bcp14>MAY</bcp14> | |||
important. The server <bcp14>SHOULD</bcp14> send PUSH_PROMISE frames prior to se | be considered by user agents when deciding how to use pushed resources.</t> | |||
nding HEADERS | <t>Ordering of a <xref format='none' target='frame-push-promise'>PUSH_PR | |||
or DATA frames that reference the promised responses. This reduces the chance | OMISE</xref><iref item='PUSH_PROMISE'/> frame in relation to certain parts of th | |||
e response is | ||||
important. The server <bcp14>SHOULD</bcp14> | ||||
send <xref format='none' target='frame-push-promise'>PUSH_PROMISE</xref><iref i | ||||
tem='PUSH_PROMISE'/> frames prior to sending <xref format='none' target='frame-h | ||||
eaders'>HEADERS</xref><iref item='HEADERS'/> | ||||
or <xref format='none' target='frame-data'>DATA</xref><iref item='DATA'/> frames | ||||
that reference the promised responses. This reduces the chance | ||||
that a client requests a resource that will be pushed by the server.</t> | that a client requests a resource that will be pushed by the server.</t> | |||
<t>Due to reordering, push stream data can arrive before the correspondi | <t>Due to reordering, <xref format='none' target='push-streams'>push str | |||
ng | eam</xref><iref item='push stream'/> data can arrive before the corresponding | |||
PUSH_PROMISE frame. When a client receives a new push stream with an | <xref format='none' target='frame-push-promise'>PUSH_PROMISE</xref><iref item='P | |||
as-yet-unknown Push ID, both the associated client request and the pushed | USH_PROMISE'/> frame. When a client receives a new <xref format='none' target=' | |||
push-streams'>push stream</xref><iref item='push stream'/> with an | ||||
as-yet-unknown push ID, both the associated client request and the pushed | ||||
request header fields are unknown. The client can buffer the stream data in | request header fields are unknown. The client can buffer the stream data in | |||
expectation of the matching PUSH_PROMISE. The client can use stream flow control | expectation of the matching <xref format='none' target='frame-push-promise'>PUSH | |||
(see <xref section="4.1" sectionFormat="of" target="RFCYYY1" format="default"/>) | _PROMISE</xref><iref item='PUSH_PROMISE'/>. The client can use stream flow contr | |||
to limit the amount of data a server may | ol | |||
commit to the pushed stream.</t> | (<xref section='4.1' sectionFormat='of' target='QUIC-TRANSPORT'/>) to limit the | |||
<t>Push stream data can also arrive after a client has canceled a push. | amount of data a server may | |||
In this | commit to the pushed stream. Clients <bcp14>SHOULD</bcp14> | |||
abort reading and discard data | ||||
already read from <xref format='none' target='push-streams'>push streams</xref>< | ||||
iref item='push stream'/> if no corresponding <xref format='none' target='frame- | ||||
push-promise'>PUSH_PROMISE</xref><iref item='PUSH_PROMISE'/> frame is | ||||
processed in a reasonable amount of time.</t> | ||||
<t>Push stream data can also arrive after a client has cancelled a push. | ||||
In this | ||||
case, the client can abort reading the stream with an error code of | case, the client can abort reading the stream with an error code of | |||
H3_REQUEST_CANCELLED. This asks the server not to transfer additional data and | <xref format='none' target='H3_REQUEST_CANCELLED'>H3_REQUEST_CANCELLED</xref><ir ef item='H3_REQUEST_CANCELLED'/>. This asks the server not to transfer additiona l data and | |||
indicates that it will be discarded upon receipt.</t> | indicates that it will be discarded upon receipt.</t> | |||
<t>Pushed responses that are cacheable (see <xref section="3" sectionFor mat="of" target="RFCYYY3" format="default"/>) can be | <t>Pushed responses that are cacheable (see <xref section='3' sectionFor mat='of' target='RFC9111'/>) can be | |||
stored by the client, if it implements an HTTP cache. Pushed responses are | stored by the client, if it implements an HTTP cache. Pushed responses are | |||
considered successfully validated on the origin server (e.g., if the "no-cache" | considered successfully validated on the origin server (e.g., if the "no-cache" | |||
cache response directive is present; see <xref section="5.2.2.3" sectionFormat=" of" target="RFCYYY3" format="default"/>) at the | cache response directive is present; see <xref section='5.2.2.4' sectionFormat=' of' target='RFC9111'/>) at the | |||
time the pushed response is received.</t> | time the pushed response is received.</t> | |||
<t>Pushed responses that are not cacheable <bcp14>MUST NOT</bcp14> be st | <t>Pushed responses that are not cacheable <bcp14>MUST NOT</bcp | |||
ored by any HTTP cache. | 14> | |||
They <bcp14>MAY</bcp14> be made available to the application separately.</t> | be stored by any HTTP cache. | |||
They <bcp14>MAY</bcp14> | ||||
be made available to the application separately.</t> | ||||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="connection-closure" numbered="true" toc="default"> | <section anchor='connection-closure'> | |||
<name>Connection Closure</name> | <name>Connection Closure</name> | |||
<t>Once established, an HTTP/3 connection can be used for many requests an d | <t>Once established, an HTTP/3 connection can be used for many requests an d | |||
responses over time until the connection is closed. Connection closure can | responses over time until the connection is closed. Connection closure can | |||
happen in any of several different ways.</t> | happen in any of several different ways.</t> | |||
<section anchor="idle-connections" numbered="true" toc="default"> | <section anchor='idle-connections'> | |||
<name>Idle Connections</name> | <name>Idle Connections</name> | |||
<t>Each QUIC endpoint declares an idle timeout during the handshake. If the QUIC | <t>Each QUIC endpoint declares an idle timeout during the handshake. If the QUIC | |||
connection remains idle (no packets received) for longer than this duration, the | connection remains idle (no packets received) for longer than this duration, the | |||
peer will assume that the connection has been closed. HTTP/3 implementations | peer will assume that the connection has been closed. HTTP/3 implementations | |||
will need to open a new HTTP/3 connection for new requests if the existing | will need to open a new HTTP/3 connection for new requests if the existing | |||
connection has been idle for longer than the idle timeout negotiated during the | connection has been idle for longer than the idle timeout negotiated during the | |||
QUIC handshake, and <bcp14>SHOULD</bcp14> do so if approaching the idle timeout; | QUIC handshake, and they <bcp14>SHOULD</bcp14> | |||
see <xref section="10.1" sectionFormat="of" target="RFCYYY1" format="default"/> | do so if approaching the idle timeout; see | |||
.</t> | <xref section='10.1' sectionFormat='of' target='QUIC-TRANSPORT'/>.</t> | |||
<t>HTTP clients are expected to request that the transport keep connecti ons open | <t>HTTP clients are expected to request that the transport keep connecti ons open | |||
while there are responses outstanding for requests or server pushes, as | while there are responses outstanding for requests or server pushes, as | |||
described in <xref section="10.1.2" sectionFormat="of" target="RFCYYY1" format=" default"/>. If the client is not | described in <xref section='10.1.2' sectionFormat='of' target='QUIC-TRANSPORT'/> . If the client is not | |||
expecting a response from the server, allowing an idle connection to time out is | expecting a response from the server, allowing an idle connection to time out is | |||
preferred over expending effort maintaining a connection that might not be | preferred over expending effort maintaining a connection that might not be | |||
needed. A gateway <bcp14>MAY</bcp14> maintain connections in anticipation of ne | needed. A gateway <bcp14>MAY</bcp14> | |||
ed rather than | maintain connections in anticipation of need rather than | |||
incur the latency cost of connection establishment to servers. Servers <bcp14>SH | incur the latency cost of connection establishment to servers. Servers | |||
OULD | <bcp14>SHOULD | |||
NOT</bcp14> actively keep connections open.</t> | NOT</bcp14> | |||
actively keep connections open.</t> | ||||
</section> | </section> | |||
<section anchor="connection-shutdown" numbered="true" toc="default"> | <section anchor='connection-shutdown'> | |||
<name>Connection Shutdown</name> | <name>Connection Shutdown</name> | |||
<t>Even when a connection is not idle, either endpoint can decide to sto p using the | <t>Even when a connection is not idle, either endpoint can decide to sto p using the | |||
connection and initiate a graceful connection close. Endpoints initiate the | connection and initiate a graceful connection close. Endpoints initiate the | |||
graceful shutdown of an HTTP/3 connection by sending a GOAWAY frame | graceful shutdown of an HTTP/3 connection by sending a <xref format='none' targe | |||
(<xref target="frame-goaway" format="default"/>). The GOAWAY frame contains an i | t='frame-goaway'>GOAWAY</xref><iref item='GOAWAY'/> frame. The <xref format='non | |||
dentifier that indicates to | e' target='frame-goaway'>GOAWAY</xref><iref item='GOAWAY'/> | |||
the receiver the range of requests or pushes that were or might be processed in | frame contains an identifier that indicates to the receiver the range of | |||
this connection. The server sends a client-initiated bidirectional Stream ID; | requests or pushes that were or might be processed in this connection. The | |||
the client sends a Push ID (<xref target="server-push" format="default"/>). Req | server sends a client-initiated bidirectional stream ID; the client sends a <xre | |||
uests or pushes with the | f format='none' target='server-push'>push | |||
indicated identifier or greater are rejected (<xref target="request-cancellation | ID</xref><iref item='push ID'/>. Requests or pushes with the indicated identifi | |||
" format="default"/>) by the | er or greater are rejected | |||
sender of the GOAWAY. This identifier <bcp14>MAY</bcp14> be zero if no requests | (<xref target='request-cancellation'/>) by the sender of the <xref format='none' | |||
or pushes were | target='frame-goaway'>GOAWAY</xref><iref item='GOAWAY'/>. This identifier | |||
processed.</t> | <bcp14>MAY</bcp14> | |||
<t>The information in the GOAWAY frame enables a client and server to ag | be | |||
ree on | zero if no requests or pushes were processed.</t> | |||
<t>The information in the <xref format='none' target='frame-goaway'>GOAW | ||||
AY</xref><iref item='GOAWAY'/> frame enables a client and server to agree on | ||||
which requests or pushes were accepted prior to the shutdown of the HTTP/3 | which requests or pushes were accepted prior to the shutdown of the HTTP/3 | |||
connection. Upon sending a GOAWAY frame, the endpoint <bcp14>SHOULD</bcp14> expl | connection. Upon sending a <xref format='none' target='frame-goaway'>GOAWAY</xre | |||
icitly cancel | f><iref item='GOAWAY'/> frame, the endpoint <bcp14>SHOULD</bcp14> | |||
(see <xref target="request-cancellation" format="default"/> and <xref target="fr | explicitly cancel | |||
ame-cancel-push" format="default"/>) any requests or pushes | (see Sections <xref format='counter' target='request-cancellation'/> and <xref f | |||
that have identifiers greater than or equal to that indicated, in order to clean | ormat='counter' target='frame-cancel-push'/>) any requests | |||
up transport state for the affected streams. The endpoint <bcp14>SHOULD</bcp14> | or pushes that have identifiers greater than or equal to the one indicated, in | |||
continue to do | order to clean up transport state for the affected streams. The endpoint | |||
so as more requests or pushes arrive.</t> | <bcp14>SHOULD</bcp14> | |||
<t>Endpoints <bcp14>MUST NOT</bcp14> initiate new requests or promise ne | ||||
w pushes on the connection | continue to do so as more requests or pushes arrive.</t> | |||
after receipt of a GOAWAY frame from the peer. Clients <bcp14>MAY</bcp14> estab | <t>Endpoints <bcp14>MUST NOT</bcp14> | |||
lish a new | initiate new requests or promise new pushes on the connection | |||
after receipt of a <xref format='none' target='frame-goaway'>GOAWAY</xref><iref | ||||
item='GOAWAY'/> frame from the peer. Clients <bcp14>MAY</bcp14> | ||||
establish a new | ||||
connection to send additional requests.</t> | connection to send additional requests.</t> | |||
<t>Some requests or pushes might already be in transit:</t> | <t>Some requests or pushes might already be in transit:</t> | |||
<ul spacing="normal"> | <ul spacing='normal'> | |||
<li> | <li> | |||
<t>Upon receipt of a GOAWAY frame, if the client has already sent re | <t>Upon receipt of a <xref format='none' target='frame-goaway'>GOAWA | |||
quests with | Y</xref><iref item='GOAWAY'/> frame, if the client has already sent requests wit | |||
a Stream ID greater than or equal to the identifier contained in the GOAWAY | h | |||
a stream ID greater than or equal to the identifier contained in the <xref forma | ||||
t='none' target='frame-goaway'>GOAWAY</xref><iref item='GOAWAY'/> | ||||
frame, those requests will not be processed. Clients can safely retry | frame, those requests will not be processed. Clients can safely retry | |||
unprocessed requests on a different HTTP connection. A client that is | unprocessed requests on a different HTTP connection. A client that is | |||
unable to retry requests loses all requests that are in flight when the | unable to retry requests loses all requests that are in flight when the | |||
server closes the connection. </t> | server closes the connection.</t> | |||
<t> | <t>Requests on stream IDs less than the stream ID in a <xref format= | |||
Requests on Stream IDs less than the Stream ID in a GOAWAY frame from the | 'none' target='frame-goaway'>GOAWAY</xref><iref item='GOAWAY'/> frame from the | |||
server might have been processed; their status cannot be known until a | server might have been processed; their status cannot be known until a | |||
response is received, the stream is reset individually, another GOAWAY is | response is received, the stream is reset individually, another <xref format='no | |||
received with a lower Stream ID than that of the request in question, | ne' target='frame-goaway'>GOAWAY</xref><iref item='GOAWAY'/> is | |||
or the connection terminates. </t> | received with a lower stream ID than that of the request in question, | |||
<t> | or the connection terminates.</t> | |||
Servers <bcp14>MAY</bcp14> reject individual requests on streams below the indic | <t>Servers <bcp14>MAY</bcp14> | |||
ated ID if | reject individual requests on streams below the indicated ID if | |||
these requests were not processed.</t> | these requests were not processed.</t> | |||
</li> | </li> | |||
<li>If a server receives a GOAWAY frame after having promised pushes w | <li>If a server receives a <xref format='none' target='frame-goaway'>G | |||
ith a Push | OAWAY</xref><iref item='GOAWAY'/> frame after having promised pushes with a <xre | |||
ID greater than or equal to the identifier contained in the GOAWAY frame, | f format='none' target='server-push'>push | |||
ID</xref><iref item='push ID'/> greater than or equal to the identifier containe | ||||
d in the <xref format='none' target='frame-goaway'>GOAWAY</xref><iref item='GOAW | ||||
AY'/> frame, | ||||
those pushes will not be accepted.</li> | those pushes will not be accepted.</li> | |||
</ul> | </ul> | |||
<t>Servers <bcp14>SHOULD</bcp14> send a GOAWAY frame when the closing of | <t>Servers <bcp14>SHOULD</bcp14> | |||
a connection is known | send a <xref format='none' target='frame-goaway'>GOAWAY</xref><iref item='GOAWA | |||
Y'/> frame when the closing of a connection is known | ||||
in advance, even if the advance notice is small, so that the remote peer can | in advance, even if the advance notice is small, so that the remote peer can | |||
know whether a request has been partially processed or not. For example, if an | know whether or not a request has been partially processed. For example, if an | |||
HTTP client sends a POST at the same time that a server closes a QUIC | HTTP client sends a POST at the same time that a server closes a QUIC | |||
connection, the client cannot know if the server started to process that POST | connection, the client cannot know if the server started to process that POST | |||
request if the server does not send a GOAWAY frame to indicate what streams it | request if the server does not send a <xref format='none' target='frame-goaway'> GOAWAY</xref><iref item='GOAWAY'/> frame to indicate what streams it | |||
might have acted on.</t> | might have acted on.</t> | |||
<t>An endpoint <bcp14>MAY</bcp14> send multiple GOAWAY frames indicating | <t>An endpoint <bcp14>MAY</bcp14> | |||
different identifiers, | send multiple <xref format='none' target='frame-goaway'>GOAWAY</xref><iref item | |||
but the identifier in each frame <bcp14>MUST NOT</bcp14> be greater than the ide | ='GOAWAY'/> frames indicating different identifiers, | |||
ntifier in any | but the identifier in each frame <bcp14>MUST NOT</bcp14> | |||
be greater than the identifier in any | ||||
previous frame, since clients might already have retried unprocessed requests on | previous frame, since clients might already have retried unprocessed requests on | |||
another HTTP connection. Receiving a GOAWAY containing a larger identifier than | another HTTP connection. Receiving a <xref format='none' target='frame-goaway'> | |||
previously received <bcp14>MUST</bcp14> be treated as a connection error of type | GOAWAY</xref><iref item='GOAWAY'/> containing a larger identifier than | |||
H3_ID_ERROR; | previously received <bcp14>MUST</bcp14> | |||
see <xref target="errors" format="default"/>.</t> | be treated as a <xref format='none' target='errors'>connection error</xref><ire | |||
f item='connection error'/> of type <xref format='none' target='H3_ID_ERROR'>H3_ | ||||
ID_ERROR</xref><iref item='H3_ID_ERROR'/>.</t> | ||||
<t>An endpoint that is attempting to gracefully shut down a connection c an send a | <t>An endpoint that is attempting to gracefully shut down a connection c an send a | |||
GOAWAY frame with a value set to the maximum possible value (2<sup>62</sup>-4 | <xref format='none' target='frame-goaway'>GOAWAY</xref><iref item='GOAWAY'/> fra me with a value set to the maximum possible value (2<sup>62</sup>-4 | |||
for servers, 2<sup>62</sup>-1 for clients). This ensures that the peer stops | for servers, 2<sup>62</sup>-1 for clients). This ensures that the peer stops | |||
creating new requests or pushes. After allowing time for any in-flight requests | creating new requests or pushes. After allowing time for any in-flight requests | |||
or pushes to arrive, the endpoint can send another GOAWAY frame indicating which | or pushes to arrive, the endpoint can send another <xref format='none' target='f rame-goaway'>GOAWAY</xref><iref item='GOAWAY'/> frame indicating which | |||
requests or pushes it might accept before the end of the connection. This | requests or pushes it might accept before the end of the connection. This | |||
ensures that a connection can be cleanly shut down without losing requests.</t> | ensures that a connection can be cleanly shut down without losing requests.</t> | |||
<t>A client has more flexibility in the value it chooses for the Push ID | <t>A client has more flexibility in the value it chooses for the Push ID | |||
in a | field in a | |||
GOAWAY that it sends. A value of 2<sup>62</sup>-1 indicates that the server can | <xref format='none' target='frame-goaway'>GOAWAY</xref><iref item='GOAWAY'/> tha | |||
t it sends. A value of 2<sup>62</sup>-1 indicates that the server can | ||||
continue fulfilling pushes that have already been promised. A smaller value | continue fulfilling pushes that have already been promised. A smaller value | |||
indicates the client will reject pushes with Push IDs greater than or equal to | indicates the client will reject pushes with push IDs greater than or equal to | |||
this value. Like the server, the client <bcp14>MAY</bcp14> send subsequent GOAW | this value. Like the server, the client <bcp14>MAY</bcp14> | |||
AY frames so | send subsequent <xref format='none' target='frame-goaway'>GOAWAY</xref><iref it | |||
long as the specified Push ID is no greater than any previously sent value.</t> | em='GOAWAY'/> frames so | |||
<t>Even when a GOAWAY indicates that a given request or push will not be | long as the specified <xref format='none' target='server-push'>push ID</xref><ir | |||
processed | ef item='push ID'/> is no greater than any previously sent value.</t> | |||
<t>Even when a <xref format='none' target='frame-goaway'>GOAWAY</xref><i | ||||
ref item='GOAWAY'/> indicates that a given request or push will not be processed | ||||
or accepted upon receipt, the underlying transport resources still exist. The | or accepted upon receipt, the underlying transport resources still exist. The | |||
endpoint that initiated these requests can cancel them to clean up transport | endpoint that initiated these requests can cancel them to clean up transport | |||
state.</t> | state.</t> | |||
<t>Once all accepted requests and pushes have been processed, the endpoi nt can | <t>Once all accepted requests and pushes have been processed, the endpoi nt can | |||
permit the connection to become idle, or <bcp14>MAY</bcp14> initiate an immediat | permit the connection to become idle, or it <bcp14>MAY</bcp14> | |||
e closure of | initiate an immediate closure of | |||
the connection. An endpoint that completes a graceful shutdown <bcp14>SHOULD</b | the connection. An endpoint that completes a graceful shutdown <bcp14> | |||
cp14> use the | SHOULD</bcp14> | |||
H3_NO_ERROR error code when closing the connection.</t> | use the | |||
<xref format='none' target='H3_NO_ERROR'>H3_NO_ERROR</xref><iref item='H3_NO_ERR | ||||
OR'/> error code when closing the connection.</t> | ||||
<t>If a client has consumed all available bidirectional stream IDs with requests, | <t>If a client has consumed all available bidirectional stream IDs with requests, | |||
the server need not send a GOAWAY frame, since the client is unable to make | the server need not send a <xref format='none' target='frame-goaway'>GOAWAY</xre f><iref item='GOAWAY'/> frame, since the client is unable to make | |||
further requests.</t> | further requests.</t> | |||
</section> | </section> | |||
<section anchor="immediate-application-closure" numbered="true" toc="defau lt"> | <section anchor='immediate-application-closure'> | |||
<name>Immediate Application Closure</name> | <name>Immediate Application Closure</name> | |||
<t>An HTTP/3 implementation can immediately close the QUIC connection at any time. | <t>An HTTP/3 implementation can immediately close the QUIC connection at any time. | |||
This results in sending a QUIC CONNECTION_CLOSE frame to the peer indicating | This results in sending a QUIC CONNECTION_CLOSE frame to the peer indicating | |||
that the application layer has terminated the connection. The application error | that the application layer has terminated the connection. The application error | |||
code in this frame indicates to the peer why the connection is being closed. | code in this frame indicates to the peer why the connection is being closed. | |||
See <xref target="errors" format="default"/> for error codes that can be used wh en closing a connection in | See <xref target='errors'/> for error codes that can be used when closing a conn ection in | |||
HTTP/3.</t> | HTTP/3.</t> | |||
<t>Before closing the connection, a GOAWAY frame <bcp14>MAY</bcp14> be s | <t>Before closing the connection, a <xref format='none' target='frame-go | |||
ent to allow the client to | away'>GOAWAY</xref><iref item='GOAWAY'/> frame <bcp14>MAY</bcp14> | |||
retry some requests. Including the GOAWAY frame in the same packet as the QUIC | be sent to allow the client to | |||
retry some requests. Including the <xref format='none' target='frame-goaway'>GO | ||||
AWAY</xref><iref item='GOAWAY'/> frame in the same packet as the QUIC | ||||
CONNECTION_CLOSE frame improves the chances of the frame being received by | CONNECTION_CLOSE frame improves the chances of the frame being received by | |||
clients.</t> | clients.</t> | |||
<t>If there are open streams that have not been explicitly closed, they are | <t>If there are open streams that have not been explicitly closed, they are | |||
implicitly closed when the connection is closed; see | implicitly closed when the connection is closed; see | |||
<xref section="10.2" sectionFormat="of" target="RFCYYY1" format="default"/>.</t> | <xref section='10.2' sectionFormat='of' target='QUIC-TRANSPORT'/>.</t> | |||
</section> | </section> | |||
<section anchor="transport-closure" numbered="true" toc="default"> | <section anchor='transport-closure'> | |||
<name>Transport Closure</name> | <name>Transport Closure</name> | |||
<t>For various reasons, the QUIC transport could indicate to the applica tion layer | <t>For various reasons, the QUIC transport could indicate to the applica tion layer | |||
that the connection has terminated. This might be due to an explicit closure | that the connection has terminated. This might be due to an explicit closure | |||
by the peer, a transport-level error, or a change in network topology that | by the peer, a transport-level error, or a change in network topology that | |||
interrupts connectivity.</t> | interrupts connectivity.</t> | |||
<t>If a connection terminates without a GOAWAY frame, clients <bcp14>MUS | <t>If a connection terminates without a <xref format='none' target='fram | |||
T</bcp14> assume that any | e-goaway'>GOAWAY</xref><iref item='GOAWAY'/> frame, clients <bcp14>MUST | |||
</bcp14> | ||||
assume that any | ||||
request that was sent, whether in whole or in part, might have been processed.</ t> | request that was sent, whether in whole or in part, might have been processed.</ t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="stream-mapping" numbered="true" toc="default"> | <section anchor='stream-mapping'> | |||
<name>Stream Mapping and Usage</name> | <name>Stream Mapping and Usage</name> | |||
<t>A QUIC stream provides reliable in-order delivery of bytes, but makes n o | <t>A QUIC stream provides reliable in-order delivery of bytes, but makes n o | |||
guarantees about order of delivery with regard to bytes on other streams. In | guarantees about order of delivery with regard to bytes on other streams. In | |||
version 1 of QUIC, the stream data containing HTTP frames is carried by QUIC | version 1 of QUIC, the stream data containing HTTP frames is carried by QUIC | |||
STREAM frames, but this framing is invisible to the HTTP framing layer. The | STREAM frames, but this framing is invisible to the HTTP framing layer. The | |||
transport layer buffers and orders received stream data, exposing a reliable | transport layer buffers and orders received stream data, exposing a reliable | |||
byte stream to the application. Although QUIC permits out-of-order delivery | byte stream to the application. Although QUIC permits out-of-order delivery | |||
within a stream, HTTP/3 does not make use of this feature.</t> | within a stream, HTTP/3 does not make use of this feature.</t> | |||
<t>QUIC streams can be either unidirectional, carrying data only from init iator to | <t>QUIC streams can be either unidirectional, carrying data only from init iator to | |||
receiver, or bidirectional. Streams can be initiated by either the client or | receiver, or bidirectional, carrying data in both directions. Streams can be | |||
the server. For more detail on QUIC streams, see | initiated by either the client or the server. For more detail on QUIC streams, | |||
<xref section="2" sectionFormat="of" target="RFCYYY1" format="default"/>.</t> | see <xref section='2' sectionFormat='of' target='QUIC-TRANSPORT'/>.</t> | |||
<t>When HTTP fields and data are sent over QUIC, the QUIC layer handles mo st of | <t>When HTTP fields and data are sent over QUIC, the QUIC layer handles mo st of | |||
the stream management. HTTP does not need to do any separate multiplexing when | the stream management. HTTP does not need to do any separate multiplexing when | |||
using QUIC - data sent over a QUIC stream always maps to a particular HTTP | using QUIC: data sent over a QUIC stream always maps to a particular HTTP | |||
transaction or to the entire HTTP/3 connection context.</t> | transaction or to the entire HTTP/3 connection context.</t> | |||
<section anchor="request-streams" numbered="true" toc="default"> | <section anchor='request-streams'> | |||
<name>Bidirectional Streams</name> | <name>Bidirectional Streams</name><iref item='request stream' primary='t | |||
rue'/> | ||||
<t>All client-initiated bidirectional streams are used for HTTP requests and | <t>All client-initiated bidirectional streams are used for HTTP requests and | |||
responses. A bidirectional stream ensures that the response can be readily | responses. A bidirectional stream ensures that the response can be readily | |||
correlated with the request. These streams are referred to as request streams.< /t> | correlated with the request. These streams are referred to as request streams.< /t> | |||
<t>This means that the client's first request occurs on QUIC stream 0, w ith | <t>This means that the client's first request occurs on QUIC stream 0, w ith | |||
subsequent requests on stream 4, 8, and so on. In order to permit these streams | subsequent requests on streams 4, 8, and so on. In order to permit these streams | |||
to open, an HTTP/3 server <bcp14>SHOULD</bcp14> configure non-zero minimum value | to open, an HTTP/3 server <bcp14>SHOULD</bcp14> | |||
s for the | configure non-zero minimum values for the | |||
number of permitted streams and the initial stream flow control window. So as | number of permitted streams and the initial stream flow-control window. So as | |||
to not unnecessarily limit parallelism, at least 100 request streams <bcp14>SHOU | to not unnecessarily limit parallelism, at least 100 request streams <b | |||
LD</bcp14> be | cp14>SHOULD</bcp14> | |||
be | ||||
permitted at a time.</t> | permitted at a time.</t> | |||
<t>HTTP/3 does not use server-initiated bidirectional streams, though an extension | <t>HTTP/3 does not use server-initiated bidirectional streams, though an extension | |||
could define a use for these streams. Clients <bcp14>MUST</bcp14> treat receipt | could define a use for these streams. Clients <bcp14>MUST</bcp14> | |||
of a | treat receipt of a | |||
server-initiated bidirectional stream as a connection error of type | server-initiated bidirectional stream as a <xref format='none' target='errors'>c | |||
H3_STREAM_CREATION_ERROR (<xref target="errors" format="default"/>) unless such | onnection error</xref><iref item='connection error'/> of type | |||
an extension has been | <xref format='none' target='H3_STREAM_CREATION_ERROR'>H3_STREAM_CREATION_ERROR</ | |||
xref><iref item='H3_STREAM_CREATION_ERROR'/> unless such an extension has been | ||||
negotiated.</t> | negotiated.</t> | |||
</section> | </section> | |||
<section anchor="unidirectional-streams" numbered="true" toc="default"> | <section anchor='unidirectional-streams'> | |||
<name>Unidirectional Streams</name> | <name>Unidirectional Streams</name> | |||
<t>Unidirectional streams, in either direction, are used for a range of purposes. | <t>Unidirectional streams, in either direction, are used for a range of purposes. | |||
The purpose is indicated by a stream type, which is sent as a variable-length | The purpose is indicated by a stream type, which is sent as a variable-length | |||
integer at the start of the stream. The format and structure of data that | integer at the start of the stream. The format and structure of data that | |||
follows this integer is determined by the stream type.</t> | follows this integer is determined by the stream type.</t> | |||
<figure anchor="fig-stream-header"> | <figure> | |||
<name>Unidirectional Stream Header</name> | <name>Unidirectional Stream Header</name> | |||
<artwork type="drawing" name="" align="left" alt=""><![CDATA[ | <artwork type='ascii-art'><![CDATA[ | |||
Unidirectional Stream Header { | Unidirectional Stream Header { | |||
Stream Type (i), | Stream Type (i), | |||
} | } | |||
]]></artwork> | ]]></artwork> | |||
</figure> | </figure> | |||
<t>Two stream types are defined in this document: control streams | <t>Two stream types are defined in this document: <xref format='none' ta | |||
(<xref target="control-streams" format="default"/>) and push streams (<xref targ | rget='control-streams'>control streams</xref><iref item='control stream'/> | |||
et="push-streams" format="default"/>). <xref target="RFCYYY2" format="default"/> | (<xref target='control-streams'/>) and <xref format='none' target='push-streams' | |||
defines | >push streams</xref><iref item='push stream'/> (<xref target='push-streams'/>). | |||
<xref target='RFC9204'/> defines | ||||
two additional stream types. Other stream types can be defined by extensions to | two additional stream types. Other stream types can be defined by extensions to | |||
HTTP/3; see <xref target="extensions" format="default"/> for more details. Some | HTTP/3; see <xref target='extensions'/> for more details. Some stream types are | |||
stream types are reserved | reserved | |||
(<xref target="stream-grease" format="default"/>).</t> | (<xref target='stream-grease'/>).</t> | |||
<t>The performance of HTTP/3 connections in the early phase of their lif etime is | <t>The performance of HTTP/3 connections in the early phase of their lif etime is | |||
sensitive to the creation and exchange of data on unidirectional streams. | sensitive to the creation and exchange of data on unidirectional streams. | |||
Endpoints that excessively restrict the number of streams or the flow control | Endpoints that excessively restrict the number of streams or the flow-control | |||
window of these streams will increase the chance that the remote peer reaches | window of these streams will increase the chance that the remote peer reaches | |||
the limit early and becomes blocked. In particular, implementations should | the limit early and becomes blocked. In particular, implementations should | |||
consider that remote peers may wish to exercise reserved stream behavior | consider that remote peers may wish to exercise reserved stream behavior | |||
(<xref target="stream-grease" format="default"/>) with some of the unidirectiona | (<xref target='stream-grease'/>) with some of the unidirectional streams they ar | |||
l streams they are permitted | e permitted | |||
to use. To avoid blocking, the transport parameters sent by both clients and | to use.</t> | |||
servers <bcp14>MUST</bcp14> allow the peer to create at least one unidirectional | <t>Each endpoint needs to create at least one unidirectional stream for | |||
stream for the | the HTTP | |||
HTTP control stream plus the number of unidirectional streams required by | <xref format='none' target='control-streams'>control stream</xref><iref item='co | |||
mandatory extensions (three being the minimum number required for the base | ntrol stream'/>. QPACK requires two additional unidirectional streams, and other | |||
HTTP/3 protocol and QPACK), and <bcp14>SHOULD</bcp14> provide at least 1,024 byt | extensions might require further streams. Therefore, the transport parameters | |||
es of flow | sent by both clients and servers <bcp14>MUST</bcp14> | |||
control credit to each stream.</t> | allow the peer to create at least three | |||
unidirectional streams. These transport parameters <bcp14>SHOULD</bcp14 | ||||
> | ||||
also provide at least | ||||
1,024 bytes of flow-control credit to each unidirectional stream.</t> | ||||
<t>Note that an endpoint is not required to grant additional credits to create more | <t>Note that an endpoint is not required to grant additional credits to create more | |||
unidirectional streams if its peer consumes all the initial credits before | unidirectional streams if its peer consumes all the initial credits before | |||
creating the critical unidirectional streams. Endpoints <bcp14>SHOULD</bcp14> cr | creating the critical unidirectional streams. Endpoints <bcp14>SHOULD</ | |||
eate the HTTP | bcp14> | |||
control stream as well as the unidirectional streams required by mandatory | create the HTTP | |||
<xref format='none' target='control-streams'>control stream</xref><iref item='co | ||||
ntrol stream'/> as well as the unidirectional streams required by mandatory | ||||
extensions (such as the QPACK encoder and decoder streams) first, and then | extensions (such as the QPACK encoder and decoder streams) first, and then | |||
create additional streams as allowed by their peer.</t> | create additional streams as allowed by their peer.</t> | |||
<t>If the stream header indicates a stream type that is not supported by the | <t>If the stream header indicates a stream type that is not supported by the | |||
recipient, the remainder of the stream cannot be consumed as the semantics are | recipient, the remainder of the stream cannot be consumed as the semantics are | |||
unknown. Recipients of unknown stream types <bcp14>MAY</bcp14> abort reading of | unknown. Recipients of unknown stream types <bcp14>MUST</bcp14> | |||
the stream with | either abort reading of the | |||
an error code of H3_STREAM_CREATION_ERROR or a reserved error code | stream or discard incoming data without further processing. If reading is | |||
(<xref target="http-error-codes" format="default"/>), but <bcp14>MUST NOT</bcp14 | aborted, the recipient <bcp14>SHOULD</bcp14> | |||
> consider such streams to be a connection | use the <xref format='none' target='H3_STREAM_CREATION_ERROR'>H3_STREAM_CREATIO | |||
error of any kind.</t> | N_ERROR</xref><iref item='H3_STREAM_CREATION_ERROR'/> error code or a | |||
<t>Implementations <bcp14>MAY</bcp14> send stream types before knowing w | reserved error code (<xref target='http-error-codes'/>). The recipient | |||
hether the peer supports | <bcp14>MUST NOT</bcp14> | |||
consider | ||||
unknown stream types to be a <xref format='none' target='errors'>connection erro | ||||
r</xref><iref item='connection error'/> of any kind.</t> | ||||
<t>As certain stream types can affect connection state, a recipient | ||||
<bcp14>SHOULD NOT</bcp14> | ||||
discard data from incoming unidirectional streams prior to reading the stream | ||||
type.</t> | ||||
<t>Implementations <bcp14>MAY</bcp14> | ||||
send stream types before knowing whether the peer supports | ||||
them. However, stream types that could modify the state or semantics of | them. However, stream types that could modify the state or semantics of | |||
existing protocol components, including QPACK or other extensions, <bcp14>MUST N | existing protocol components, including QPACK or other extensions, <bcp | |||
OT</bcp14> be | 14>MUST NOT</bcp14> | |||
be | ||||
sent until the peer is known to support them.</t> | sent until the peer is known to support them.</t> | |||
<t>A sender can close or reset a unidirectional stream unless otherwise specified. | <t>A sender can close or reset a unidirectional stream unless otherwise specified. | |||
A receiver <bcp14>MUST</bcp14> tolerate unidirectional streams being closed or r | A receiver <bcp14>MUST</bcp14> | |||
eset prior to | tolerate unidirectional streams being closed or reset prior to | |||
the reception of the unidirectional stream header.</t> | the reception of the unidirectional stream header.</t> | |||
<section anchor="control-streams" numbered="true" toc="default"> | <section anchor='control-streams'> | |||
<name>Control Streams</name> | <name>Control Streams</name><iref item='control stream' primary='true' | |||
/> | ||||
<t>A control stream is indicated by a stream type of 0x00. Data on th is stream | <t>A control stream is indicated by a stream type of 0x00. Data on th is stream | |||
consists of HTTP/3 frames, as defined in <xref target="frames" format="default"/ | consists of HTTP/3 frames, as defined in <xref target='frames'/>.</t> | |||
>.</t> | <t>Each side <bcp14>MUST</bcp14> | |||
<t>Each side <bcp14>MUST</bcp14> initiate a single control stream at t | initiate a single control stream at the beginning of the | |||
he beginning of the | connection and send its <xref format='none' target='frame-settings'>SETTINGS</xr | |||
connection and send its SETTINGS frame as the first frame on this stream. If | ef><iref item='SETTINGS'/> frame as the first frame on this stream. If | |||
the first frame of the control stream is any other frame type, this <bcp14>MUST< | the first frame of the control stream is any other frame type, this < | |||
/bcp14> be | bcp14>MUST</bcp14> | |||
treated as a connection error of type H3_MISSING_SETTINGS. Only one control | be | |||
treated as a <xref format='none' target='errors'>connection error</xref><iref it | ||||
em='connection error'/> of type <xref format='none' target='H3_MISSING_SETTINGS' | ||||
>H3_MISSING_SETTINGS</xref><iref item='H3_MISSING_SETTINGS'/>. Only one control | ||||
stream per peer is permitted; receipt of a second stream claiming to be a | stream per peer is permitted; receipt of a second stream claiming to be a | |||
control stream <bcp14>MUST</bcp14> be treated as a connection error of type | control stream <bcp14>MUST</bcp14> | |||
H3_STREAM_CREATION_ERROR. The sender <bcp14>MUST NOT</bcp14> close the control | be treated as a <xref format='none' target='errors'>connection error</xref><ire | |||
stream, and the | f item='connection error'/> of type | |||
receiver <bcp14>MUST NOT</bcp14> request that the sender close the control strea | <xref format='none' target='H3_STREAM_CREATION_ERROR'>H3_STREAM_CREATION_ERROR</ | |||
m. If either | xref><iref item='H3_STREAM_CREATION_ERROR'/>. The sender <bcp14>MUST | |||
control stream is closed at any point, this <bcp14>MUST</bcp14> be treated as a | NOT</bcp14> | |||
connection | close the control stream, and the | |||
error of type H3_CLOSED_CRITICAL_STREAM. Connection errors are described in | receiver <bcp14>MUST NOT</bcp14> | |||
<xref target="errors" format="default"/>.</t> | request that the sender close the control stream. If either | |||
control stream is closed at any point, this <bcp14>MUST</bcp14> | ||||
be treated as a <xref format='none' target='errors'>connection | ||||
error</xref><iref item='connection error'/> of type <xref format='none' target=' | ||||
H3_CLOSED_CRITICAL_STREAM'>H3_CLOSED_CRITICAL_STREAM</xref><iref item='H3_CLOSED | ||||
_CRITICAL_STREAM'/>. Connection errors are described in | ||||
<xref target='errors'/>.</t> | ||||
<t>Because the contents of the control stream are used to manage the b ehavior of | <t>Because the contents of the control stream are used to manage the b ehavior of | |||
other streams, endpoints <bcp14>SHOULD</bcp14> provide enough flow control credi | other streams, endpoints <bcp14>SHOULD</bcp14> | |||
t to keep the | provide enough flow-control credit to keep the | |||
peer's control stream from becoming blocked.</t> | peer's control stream from becoming blocked.</t> | |||
<t>A pair of unidirectional streams is used rather than a single bidir ectional | <t>A pair of unidirectional streams is used rather than a single bidir ectional | |||
stream. This allows either peer to send data as soon as it is able. Depending | stream. This allows either peer to send data as soon as it is able. Depending | |||
on whether 0-RTT is available on the QUIC connection, either client or server | on whether 0-RTT is available on the QUIC connection, either client or server | |||
might be able to send stream data first.</t> | might be able to send stream data first.</t> | |||
</section> | </section> | |||
<section anchor="push-streams" numbered="true" toc="default"> | <section anchor='push-streams'> | |||
<name>Push Streams</name> | <name>Push Streams</name><iref item='push stream' primary='true'/> | |||
<t>Server push is an optional feature introduced in HTTP/2 that allows a server to | <t>Server push is an optional feature introduced in HTTP/2 that allows a server to | |||
initiate a response before a request has been made. See <xref target="server-pu sh" format="default"/> for | initiate a response before a request has been made. See <xref target='server-pu sh'/> for | |||
more details.</t> | more details.</t> | |||
<t>A push stream is indicated by a stream type of 0x01, followed by th e Push ID | <t>A push stream is indicated by a stream type of 0x01, followed by th e <xref format='none' target='server-push'>push ID</xref><iref item='push ID'/> | |||
of the promise that it fulfills, encoded as a variable-length integer. The | of the promise that it fulfills, encoded as a variable-length integer. The | |||
remaining data on this stream consists of HTTP/3 frames, as defined in | remaining data on this stream consists of HTTP/3 frames, as defined in | |||
<xref target="frames" format="default"/>, and fulfills a promised server push by zero or more interim HTTP | <xref target='frames'/>, and fulfills a promised server push by zero or more int erim HTTP | |||
responses followed by a single final HTTP response, as defined in | responses followed by a single final HTTP response, as defined in | |||
<xref target="request-response" format="default"/>. Server push and Push IDs ar | <xref target='request-response'/>. Server push and push IDs are described in | |||
e described in | <xref target='server-push'/>.</t> | |||
<xref target="server-push" format="default"/>.</t> | <t>Only servers can push; if a server receives a client-initiated push | |||
<t>Only servers can push; if a server receives a client-initiated push | stream, this <bcp14>MUST</bcp14> | |||
stream, this | be treated as a <xref format='none' target='errors'>connection error</xref><ire | |||
<bcp14>MUST</bcp14> be treated as a connection error of type H3_STREAM_CREATION_ | f item='connection error'/> of type <xref format='none' target='H3_STREAM_CREATI | |||
ERROR; see | ON_ERROR'>H3_STREAM_CREATION_ERROR</xref><iref item='H3_STREAM_CREATION_ERROR'/> | |||
<xref target="errors" format="default"/>.</t> | .</t> | |||
<figure anchor="fig-push-stream-header"> | <figure> | |||
<name>Push Stream Header</name> | <name>Push Stream Header</name> | |||
<artwork type="drawing" name="" align="left" alt=""><![CDATA[ | <artwork type='ascii-art'><![CDATA[ | |||
Push Stream Header { | Push Stream Header { | |||
Stream Type (i) = 0x01, | Stream Type (i) = 0x01, | |||
Push ID (i), | Push ID (i), | |||
} | } | |||
]]></artwork> | ]]></artwork> | |||
</figure> | </figure> | |||
<t>Each Push ID <bcp14>MUST</bcp14> only be used once in a push stream | <t>A client <bcp14>SHOULD NOT</bcp14> | |||
header. If a push stream | abort reading on a push stream prior to reading the push | |||
header includes a Push ID that was used in another push stream header, the | stream header, as this could lead to disagreement between client and server on | |||
client <bcp14>MUST</bcp14> treat this as a connection error of type H3_ID_ERROR; | which push IDs have already been consumed.</t> | |||
see | <t>Each <xref format='none' target='server-push'>push ID</xref><iref i | |||
<xref target="errors" format="default"/>.</t> | tem='push ID'/> <bcp14>MUST</bcp14> | |||
only be used once in a push stream header. If a client detects | ||||
that a push stream header includes a <xref format='none' target='server-push'>pu | ||||
sh ID</xref><iref item='push ID'/> that was used in another push | ||||
stream header, the client <bcp14>MUST</bcp14> | ||||
treat this as a <xref format='none' target='errors'>connection error</xref><ire | ||||
f item='connection error'/> of type | ||||
<xref format='none' target='H3_ID_ERROR'>H3_ID_ERROR</xref><iref item='H3_ID_ERR | ||||
OR'/>.</t> | ||||
</section> | </section> | |||
<section anchor="stream-grease" numbered="true" toc="default"> | <section anchor='stream-grease'> | |||
<name>Reserved Stream Types</name> | <name>Reserved Stream Types</name> | |||
<t>Stream types of the format <tt>0x1f * N + 0x21</tt> for non-negativ e integer values of | <t>Stream types of the format <tt>0x1f * N + 0x21</tt> for non-negativ e integer values of | |||
N are reserved to exercise the requirement that unknown types be ignored. These | <tt>N</tt> are reserved to exercise the requirement that unknown types be ignore | |||
streams have no semantics, and can be sent when application-layer padding is | d. | |||
desired. They <bcp14>MAY</bcp14> also be sent on connections where no data is cu | These streams have no semantics, and they can be sent when application-layer | |||
rrently being | padding is desired. They <bcp14>MAY</bcp14> | |||
transferred. Endpoints <bcp14>MUST NOT</bcp14> consider these streams to have an | also be sent on connections where no data is | |||
y meaning upon | currently being transferred. Endpoints <bcp14>MUST NOT</bcp14> | |||
receipt.</t> | consider these streams to have | |||
any meaning upon receipt.</t> | ||||
<t>The payload and length of the stream are selected in any manner the sending | <t>The payload and length of the stream are selected in any manner the sending | |||
implementation chooses. When sending a reserved stream type, the implementation | implementation chooses. When sending a reserved stream type, the implementation | |||
<bcp14>MAY</bcp14> either terminate the stream cleanly or reset it. When resett | <bcp14>MAY</bcp14> | |||
ing the stream, | either terminate the stream cleanly or reset it. When resetting the stream, | |||
either the H3_NO_ERROR error code or a reserved error code | either the <xref format='none' target='H3_NO_ERROR'>H3_NO_ERROR</xref><iref item | |||
(<xref target="http-error-codes" format="default"/>) <bcp14>SHOULD</bcp14> be us | ='H3_NO_ERROR'/> error code or a reserved error code | |||
ed.</t> | (<xref target='http-error-codes'/>) <bcp14>SHOULD</bcp14> | |||
be used.</t> | ||||
</section> | </section> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="http-framing-layer" numbered="true" toc="default"> | <section anchor='http-framing-layer'> | |||
<name>HTTP Framing Layer</name> | <name>HTTP Framing Layer</name> | |||
<t>HTTP frames are carried on QUIC streams, as described in <xref target=" | <t>HTTP frames are carried on QUIC streams, as described in <xref target=' | |||
stream-mapping" format="default"/>. | stream-mapping'/>. | |||
HTTP/3 defines three stream types: control stream, request stream, and push | HTTP/3 defines three stream types: <xref format='none' target='control-streams'> | |||
stream. This section describes HTTP/3 frame formats and their permitted stream | control stream</xref><iref item='control stream'/>, <xref format='none' target=' | |||
types; see <xref target="stream-frame-mapping" format="default"/> for an overvie | request-streams'>request stream</xref><iref item='request stream'/>, and <xref f | |||
w. A comparison between | ormat='none' target='push-streams'>push | |||
HTTP/2 and HTTP/3 frames is provided in <xref target="h2-frames" format="default | stream</xref><iref item='push stream'/>. This section describes HTTP/3 frame for | |||
"/>.</t> | mats and their permitted stream | |||
<table anchor="stream-frame-mapping" align="center"> | types; see <xref target='stream-frame-mapping'/> for an overview. A comparison | |||
between | ||||
HTTP/2 and HTTP/3 frames is provided in <xref target='h2-frames'/>.</t> | ||||
<table anchor='stream-frame-mapping'> | ||||
<name>HTTP/3 Frames and Stream Type Overview</name> | <name>HTTP/3 Frames and Stream Type Overview</name> | |||
<thead> | <thead> | |||
<tr> | <tr> | |||
<th align="left">Frame</th> | <th align='left'>Frame</th> | |||
<th align="left">Control Stream</th> | <th align='left'>Control Stream</th> | |||
<th align="left">Request Stream</th> | <th align='left'>Request Stream</th> | |||
<th align="left">Push Stream</th> | <th align='left'>Push Stream</th> | |||
<th align="left">Section</th> | <th align='left'>Section</th> | |||
</tr> | </tr> | |||
</thead> | </thead> | |||
<tbody> | <tbody> | |||
<tr> | <tr> | |||
<td align="left">DATA</td> | <td align='left'><xref format='none' target='frame-data'>DATA</xref> | |||
<td align="left">No</td> | <iref item='DATA'/></td> | |||
<td align="left">Yes</td> | <td align='left'>No</td> | |||
<td align="left">Yes</td> | <td align='left'>Yes</td> | |||
<td align="left"> | <td align='left'>Yes</td> | |||
<xref target="frame-data" format="default"/></td> | <td align='left'><xref target='frame-data'/></td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">HEADERS</td> | <td align='left'><xref format='none' target='frame-headers'>HEADERS< | |||
<td align="left">No</td> | /xref><iref item='HEADERS'/></td> | |||
<td align="left">Yes</td> | <td align='left'>No</td> | |||
<td align="left">Yes</td> | <td align='left'>Yes</td> | |||
<td align="left"> | <td align='left'>Yes</td> | |||
<xref target="frame-headers" format="default"/></td> | <td align='left'><xref target='frame-headers'/></td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">CANCEL_PUSH</td> | <td align='left'><xref format='none' target='frame-cancel-push'>CANC | |||
<td align="left">Yes</td> | EL_PUSH</xref><iref item='CANCEL_PUSH'/></td> | |||
<td align="left">No</td> | <td align='left'>Yes</td> | |||
<td align="left">No</td> | <td align='left'>No</td> | |||
<td align="left"> | <td align='left'>No</td> | |||
<xref target="frame-cancel-push" format="default"/></td> | <td align='left'><xref target='frame-cancel-push'/></td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">SETTINGS</td> | <td align='left'><xref format='none' target='frame-settings'>SETTING | |||
<td align="left">Yes (1)</td> | S</xref><iref item='SETTINGS'/></td> | |||
<td align="left">No</td> | <td align='left'>Yes (1)</td> | |||
<td align="left">No</td> | <td align='left'>No</td> | |||
<td align="left"> | <td align='left'>No</td> | |||
<xref target="frame-settings" format="default"/></td> | <td align='left'><xref target='frame-settings'/></td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">PUSH_PROMISE</td> | <td align='left'><xref format='none' target='frame-push-promise'>PUS | |||
<td align="left">No</td> | H_PROMISE</xref><iref item='PUSH_PROMISE'/></td> | |||
<td align="left">Yes</td> | <td align='left'>No</td> | |||
<td align="left">No</td> | <td align='left'>Yes</td> | |||
<td align="left"> | <td align='left'>No</td> | |||
<xref target="frame-push-promise" format="default"/></td> | <td align='left'><xref target='frame-push-promise'/></td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">GOAWAY</td> | <td align='left'><xref format='none' target='frame-goaway'>GOAWAY</x | |||
<td align="left">Yes</td> | ref><iref item='GOAWAY'/></td> | |||
<td align="left">No</td> | <td align='left'>Yes</td> | |||
<td align="left">No</td> | <td align='left'>No</td> | |||
<td align="left"> | <td align='left'>No</td> | |||
<xref target="frame-goaway" format="default"/></td> | <td align='left'><xref target='frame-goaway'/></td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">MAX_PUSH_ID</td> | <td align='left'><xref format='none' target='frame-max-push-id'>MAX_ | |||
<td align="left">Yes</td> | PUSH_ID</xref><iref item='MAX_PUSH_ID'/></td> | |||
<td align="left">No</td> | <td align='left'>Yes</td> | |||
<td align="left">No</td> | <td align='left'>No</td> | |||
<td align="left"> | <td align='left'>No</td> | |||
<xref target="frame-max-push-id" format="default"/></td> | <td align='left'><xref target='frame-max-push-id'/></td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">Reserved</td> | <td align='left'>Reserved</td> | |||
<td align="left">Yes</td> | <td align='left'>Yes</td> | |||
<td align="left">Yes</td> | <td align='left'>Yes</td> | |||
<td align="left">Yes</td> | <td align='left'>Yes</td> | |||
<td align="left"> | <td align='left'><xref target='frame-reserved'/></td> | |||
<xref target="frame-reserved" format="default"/></td> | ||||
</tr> | </tr> | |||
</tbody> | </tbody> | |||
</table> | </table> | |||
<t>The SETTINGS frame can only occur as the first frame of a Control strea | <t>The <xref format='none' target='frame-settings'>SETTINGS</xref><iref it | |||
m; this | em='SETTINGS'/> frame can only occur as the first frame of a Control stream; thi | |||
is indicated in <xref target="stream-frame-mapping" format="default"/> with a (1 | s | |||
). Specific guidance | is indicated in <xref target='stream-frame-mapping'/> with a (1). Specific guid | |||
ance | ||||
is provided in the relevant section.</t> | is provided in the relevant section.</t> | |||
<t>Note that, unlike QUIC frames, HTTP/3 frames can span multiple packets. </t> | <t>Note that, unlike QUIC frames, HTTP/3 frames can span multiple packets. </t> | |||
<section anchor="frame-layout" numbered="true" toc="default"> | <section anchor='frame-layout'> | |||
<name>Frame Layout</name> | <name>Frame Layout</name> | |||
<t>All frames have the following format:</t> | <t>All frames have the following format:</t> | |||
<figure anchor="fig-frame"> | <figure> | |||
<name>HTTP/3 Frame Format</name> | <name>HTTP/3 Frame Format</name> | |||
<artwork type="drawing" name="" align="left" alt=""><![CDATA[ | <artwork type='ascii-art'><![CDATA[ | |||
HTTP/3 Frame Format { | HTTP/3 Frame Format { | |||
Type (i), | Type (i), | |||
Length (i), | Length (i), | |||
Frame Payload (..), | Frame Payload (..), | |||
} | } | |||
]]></artwork> | ]]></artwork> | |||
</figure> | </figure> | |||
<t>A frame includes the following fields:</t> | <t>A frame includes the following fields:</t> | |||
<dl> | <dl> | |||
<dt> | <dt>Type:</dt> | |||
Type: </dt> | ||||
<dd> | <dd> | |||
<t>A variable-length integer that identifies the frame type.</t> | <t>A variable-length integer that identifies the frame type.</t> | |||
</dd> | </dd> | |||
<dt> | <dt>Length:</dt> | |||
Length: </dt> | ||||
<dd> | <dd> | |||
<t>A variable-length integer that describes the length in bytes of | <t>A variable-length integer that describes the length in bytes of | |||
the Frame Payload.</t> | the Frame Payload.</t> | |||
</dd> | </dd> | |||
<dt> | <dt>Frame Payload:</dt> | |||
Frame Payload: </dt> | ||||
<dd> | <dd> | |||
<t>A payload, the semantics of which are determined by the Type fiel d.</t> | <t>A payload, the semantics of which are determined by the Type fiel d.</t> | |||
</dd> | </dd> | |||
</dl> | </dl> | |||
<t>Each frame's payload <bcp14>MUST</bcp14> contain exactly the fields i | <t>Each frame's payload <bcp14>MUST</bcp14> | |||
dentified in its | contain exactly the fields identified in its | |||
description. A frame payload that contains additional bytes after the | description. A frame payload that contains additional bytes after the | |||
identified fields or a frame payload that terminates before the end of the | identified fields or a frame payload that terminates before the end of the | |||
identified fields <bcp14>MUST</bcp14> be treated as a connection error of type | identified fields <bcp14>MUST</bcp14> | |||
H3_FRAME_ERROR; see <xref target="errors" format="default"/>. In particular, re | be treated as a <xref format='none' target='errors'>connection error</xref><ire | |||
dundant length encodings <bcp14>MUST</bcp14> | f item='connection error'/> of type | |||
be verified to be self-consistent; see <xref target="frame-parsing" format="defa | <xref format='none' target='H3_FRAME_ERROR'>H3_FRAME_ERROR</xref><iref item='H3_ | |||
ult"/>.</t> | FRAME_ERROR'/>. In particular, redundant length encodings <bcp14>MUST< | |||
/bcp14> | ||||
be verified to be self-consistent; see <xref target='frame-parsing'/>.</t> | ||||
<t>When a stream terminates cleanly, if the last frame on the stream was truncated, | <t>When a stream terminates cleanly, if the last frame on the stream was truncated, | |||
this <bcp14>MUST</bcp14> be treated as a connection error of type H3_FRAME_ERROR | this <bcp14>MUST</bcp14> | |||
; see | be treated as a <xref format='none' target='errors'>connection error</xref><ire | |||
<xref target="errors" format="default"/>. Streams that terminate abruptly may be | f item='connection error'/> of type <xref format='none' target='H3_FRAME_ERROR'> | |||
reset at any point in a | H3_FRAME_ERROR</xref><iref item='H3_FRAME_ERROR'/>. Streams that | |||
frame.</t> | terminate abruptly may be reset at any point in a frame.</t> | |||
</section> | </section> | |||
<section anchor="frames" numbered="true" toc="default"> | <section anchor='frames'> | |||
<name>Frame Definitions</name> | <name>Frame Definitions</name> | |||
<section anchor="frame-data" numbered="true" toc="default"> | <section anchor='frame-data'> | |||
<name>DATA</name> | <name>DATA</name><iref item='DATA' primary='true'/> | |||
<t>DATA frames (type=0x0) convey arbitrary, variable-length sequences | <t>DATA frames (type=0x00) convey arbitrary, variable-length sequences | |||
of bytes | of bytes | |||
associated with HTTP request or response content.</t> | associated with HTTP request or response content.</t> | |||
<t>DATA frames <bcp14>MUST</bcp14> be associated with an HTTP request | <t>DATA frames <bcp14>MUST</bcp14> | |||
or response. If a DATA | be associated with an HTTP request or response. If a DATA | |||
frame is received on a control stream, the recipient <bcp14>MUST</bcp14> respond | frame is received on a <xref format='none' target='control-streams'>control stre | |||
with a | am</xref><iref item='control stream'/>, the recipient <bcp14>MUST</bc | |||
connection error of type H3_FRAME_UNEXPECTED; see <xref target="errors" format=" | p14> | |||
default"/>.</t> | respond with a | |||
<figure anchor="fig-data"> | <xref format='none' target='errors'>connection error</xref><iref item='connectio | |||
n error'/> of type <xref format='none' target='H3_FRAME_UNEXPECTED'>H3_FRAME_UNE | ||||
XPECTED</xref><iref item='H3_FRAME_UNEXPECTED'/>.</t> | ||||
<figure> | ||||
<name>DATA Frame</name> | <name>DATA Frame</name> | |||
<artwork type="drawing" name="" align="left" alt=""><![CDATA[ | <artwork type='ascii-art'><![CDATA[ | |||
DATA Frame { | DATA Frame { | |||
Type (i) = 0x0, | Type (i) = 0x00, | |||
Length (i), | Length (i), | |||
Data (..), | Data (..), | |||
} | } | |||
]]></artwork> | ]]></artwork> | |||
</figure> | </figure> | |||
</section> | </section> | |||
<section anchor="frame-headers" numbered="true" toc="default"> | <section anchor='frame-headers'> | |||
<name>HEADERS</name> | <name>HEADERS</name><iref item='HEADERS' primary='true'/> | |||
<t>The HEADERS frame (type=0x1) is used to carry an HTTP field section | <t>The HEADERS frame (type=0x01) is used to carry an HTTP field sectio | |||
, encoded | n that is | |||
using QPACK. See <xref target="RFCYYY2" format="default"/> for more details.</t> | encoded using QPACK. See <xref target='RFC9204'/> for more details.</t> | |||
<figure anchor="fig-headers"> | <figure> | |||
<name>HEADERS Frame</name> | <name>HEADERS Frame</name> | |||
<artwork type="drawing" name="" align="left" alt=""><![CDATA[ | <artwork type='ascii-art'><![CDATA[ | |||
HEADERS Frame { | HEADERS Frame { | |||
Type (i) = 0x1, | Type (i) = 0x01, | |||
Length (i), | Length (i), | |||
Encoded Field Section (..), | Encoded Field Section (..), | |||
} | } | |||
]]></artwork> | ]]></artwork> | |||
</figure> | </figure> | |||
<t>HEADERS frames can only be sent on request or push streams. If a H | <t>HEADERS frames can only be sent on <xref format='none' target='requ | |||
EADERS frame | est-streams'>request streams</xref><iref item='request stream'/> or <xref format | |||
is received on a control stream, the recipient <bcp14>MUST</bcp14> respond with | ='none' target='push-streams'>push streams</xref><iref item='push stream'/>. If | |||
a connection | a | |||
error (<xref target="errors" format="default"/>) of type H3_FRAME_UNEXPECTED.</t | HEADERS frame is received on a <xref format='none' target='control-streams'>cont | |||
> | rol stream</xref><iref item='control stream'/>, the recipient <bcp14> | |||
MUST</bcp14> | ||||
respond with a | ||||
<xref format='none' target='errors'>connection error</xref><iref item='connectio | ||||
n error'/> of type <xref format='none' target='H3_FRAME_UNEXPECTED'>H3_FRAME_UNE | ||||
XPECTED</xref><iref item='H3_FRAME_UNEXPECTED'/>.</t> | ||||
</section> | </section> | |||
<section anchor="frame-cancel-push" numbered="true" toc="default"> | <section anchor='frame-cancel-push'> | |||
<name>CANCEL_PUSH</name> | <name>CANCEL_PUSH</name><iref item='CANCEL_PUSH' primary='true'/> | |||
<t>The CANCEL_PUSH frame (type=0x3) is used to request cancellation of | <t>The CANCEL_PUSH frame (type=0x03) is used to request cancellation o | |||
a server | f a server | |||
push prior to the push stream being received. The CANCEL_PUSH frame identifies | push prior to the <xref format='none' target='push-streams'>push stream</xref><i | |||
a server push by Push ID (see <xref target="server-push" format="default"/>), en | ref item='push stream'/> being received. The CANCEL_PUSH frame identifies | |||
coded as a variable-length | a server push by <xref format='none' target='server-push'>push ID</xref><iref it | |||
em='push ID'/> (see <xref target='server-push'/>), encoded as a variable-length | ||||
integer.</t> | integer.</t> | |||
<t>When a client sends CANCEL_PUSH, it is indicating that it does not | <t>When a client sends a CANCEL_PUSH frame, it is indicating that it d | |||
wish to | oes not wish | |||
receive the promised resource. The server <bcp14>SHOULD</bcp14> abort sending t | to receive the promised resource. The server <bcp14>SHOULD</bcp14> | |||
he resource, | abort sending the resource, | |||
but the mechanism to do so depends on the state of the corresponding push | but the mechanism to do so depends on the state of the corresponding <xref forma | |||
stream. If the server has not yet created a push stream, it does not create | t='none' target='push-streams'>push | |||
one. If the push stream is open, the server <bcp14>SHOULD</bcp14> abruptly term | stream</xref><iref item='push stream'/>. If the server has not yet created a <x | |||
inate that | ref format='none' target='push-streams'>push stream</xref><iref item='push strea | |||
stream. If the push stream has already ended, the server <bcp14>MAY</bcp14> sti | m'/>, it does not create | |||
ll abruptly | one. If the <xref format='none' target='push-streams'>push stream</xref><iref i | |||
terminate the stream or <bcp14>MAY</bcp14> take no action.</t> | tem='push stream'/> is open, the server <bcp14>SHOULD</bcp14> | |||
<t>A server sends CANCEL_PUSH to indicate that it will not be fulfilli | abruptly terminate that | |||
ng a promise | stream. If the <xref format='none' target='push-streams'>push stream</xref><ire | |||
which was previously sent. The client cannot expect the corresponding promise | f item='push stream'/> has already ended, the server <bcp14>MAY</bcp1 | |||
to be fulfilled, unless it has already received and processed the promised | 4> | |||
response. Regardless of whether a push stream has been opened, a server | still abruptly | |||
<bcp14>SHOULD</bcp14> send a CANCEL_PUSH frame when it determines that promise w | terminate the stream or <bcp14>MAY</bcp14> | |||
ill not be | take no action.</t> | |||
fulfilled. If a stream has already been opened, the server can | <t>A server sends a CANCEL_PUSH frame to indicate that it will not be | |||
abort sending on the stream with an error code of H3_REQUEST_CANCELLED.</t> | fulfilling a | |||
<t>Sending a CANCEL_PUSH frame has no direct effect on the state of ex | promise that was previously sent. The client cannot expect the corresponding | |||
isting push | promise to be fulfilled, unless it has already received and processed the | |||
streams. A client <bcp14>SHOULD NOT</bcp14> send a CANCEL_PUSH frame when it has | promised response. Regardless of whether a <xref format='none' target='push-stre | |||
already | ams'>push stream</xref><iref item='push stream'/> has been opened, a server | |||
received a corresponding push stream. A push stream could arrive after a client | <bcp14>SHOULD</bcp14> | |||
send a CANCEL_PUSH frame when it determines that promise will not be | ||||
fulfilled. If a stream has already been opened, the server can abort sending on | ||||
the stream with an error code of <xref format='none' target='H3_REQUEST_CANCELLE | ||||
D'>H3_REQUEST_CANCELLED</xref><iref item='H3_REQUEST_CANCELLED'/>.</t> | ||||
<t>Sending a CANCEL_PUSH frame has no direct effect on the state of ex | ||||
isting <xref format='none' target='push-streams'>push | ||||
streams</xref><iref item='push stream'/>. A client <bcp14>SHOULD NOT< | ||||
/bcp14> | ||||
send a CANCEL_PUSH frame when it has already | ||||
received a corresponding <xref format='none' target='push-streams'>push stream</ | ||||
xref><iref item='push stream'/>. A <xref format='none' target='push-streams'>pu | ||||
sh stream</xref><iref item='push stream'/> could arrive after a client | ||||
has sent a CANCEL_PUSH frame, because a server might not have processed the | has sent a CANCEL_PUSH frame, because a server might not have processed the | |||
CANCEL_PUSH. The client <bcp14>SHOULD</bcp14> abort reading the stream with an e | CANCEL_PUSH. The client <bcp14>SHOULD</bcp14> | |||
rror code of | abort reading the stream with an error code of | |||
H3_REQUEST_CANCELLED.</t> | <xref format='none' target='H3_REQUEST_CANCELLED'>H3_REQUEST_CANCELLED</xref><ir | |||
<t>A CANCEL_PUSH frame is sent on the control stream. Receiving a CAN | ef item='H3_REQUEST_CANCELLED'/>.</t> | |||
CEL_PUSH | <t>A CANCEL_PUSH frame is sent on the <xref format='none' target='cont | |||
frame on a stream other than the control stream <bcp14>MUST</bcp14> be treated a | rol-streams'>control stream</xref><iref item='control stream'/>. Receiving a CA | |||
s a connection | NCEL_PUSH | |||
error of type H3_FRAME_UNEXPECTED.</t> | frame on a stream other than the <xref format='none' target='control-streams'>co | |||
<figure anchor="fig-cancel-push"> | ntrol stream</xref><iref item='control stream'/> <bcp14>MUST</bcp14> | |||
be treated as a <xref format='none' target='errors'>connection | ||||
error</xref><iref item='connection error'/> of type <xref format='none' target=' | ||||
H3_FRAME_UNEXPECTED'>H3_FRAME_UNEXPECTED</xref><iref item='H3_FRAME_UNEXPECTED'/ | ||||
>.</t> | ||||
<figure> | ||||
<name>CANCEL_PUSH Frame</name> | <name>CANCEL_PUSH Frame</name> | |||
<artwork type="drawing" name="" align="left" alt=""><![CDATA[ | <artwork type='ascii-art'><![CDATA[ | |||
CANCEL_PUSH Frame { | CANCEL_PUSH Frame { | |||
Type (i) = 0x3, | Type (i) = 0x03, | |||
Length (i), | Length (i), | |||
Push ID (i), | Push ID (i), | |||
} | } | |||
]]></artwork> | ]]></artwork> | |||
</figure> | </figure> | |||
<t>The CANCEL_PUSH frame carries a Push ID encoded as a variable-lengt | <t>The CANCEL_PUSH frame carries a <xref format='none' target='server- | |||
h integer. | push'>push ID</xref><iref item='push ID'/> encoded as a variable-length integer. | |||
The Push ID identifies the server push that is being cancelled; see | The Push ID field identifies the server push that is being cancelled; see | |||
<xref target="server-push" format="default"/>. If a CANCEL_PUSH frame is receiv | <xref target='server-push'/>. If a CANCEL_PUSH frame is received that reference | |||
ed that references a Push ID | s a <xref format='none' target='server-push'>push ID</xref><iref item='push ID'/ | |||
greater than currently allowed on the connection, this <bcp14>MUST</bcp14> be tr | > | |||
eated as a | greater than currently allowed on the connection, this <bcp14>MUST</b | |||
connection error of type H3_ID_ERROR.</t> | cp14> | |||
<t>If the client receives a CANCEL_PUSH frame, that frame might identi | be treated as a | |||
fy a Push ID | <xref format='none' target='errors'>connection error</xref><iref item='connectio | |||
that has not yet been mentioned by a PUSH_PROMISE frame due to reordering. If a | n error'/> of type <xref format='none' target='H3_ID_ERROR'>H3_ID_ERROR</xref><i | |||
server receives a CANCEL_PUSH frame for a Push ID that has not yet been | ref item='H3_ID_ERROR'/>.</t> | |||
mentioned by a PUSH_PROMISE frame, this <bcp14>MUST</bcp14> be treated as a conn | <t>If the client receives a CANCEL_PUSH frame, that frame might identi | |||
ection error of | fy a <xref format='none' target='server-push'>push ID</xref><iref item='push ID' | |||
type H3_ID_ERROR.</t> | /> | |||
that has not yet been mentioned by a <xref format='none' target='frame-push-prom | ||||
ise'>PUSH_PROMISE</xref><iref item='PUSH_PROMISE'/> frame due to reordering. If | ||||
a | ||||
server receives a CANCEL_PUSH frame for a <xref format='none' target='server-pus | ||||
h'>push ID</xref><iref item='push ID'/> that has not yet been | ||||
mentioned by a <xref format='none' target='frame-push-promise'>PUSH_PROMISE</xre | ||||
f><iref item='PUSH_PROMISE'/> frame, this <bcp14>MUST</bcp14> | ||||
be treated as a <xref format='none' target='errors'>connection error</xref><ire | ||||
f item='connection error'/> of | ||||
type <xref format='none' target='H3_ID_ERROR'>H3_ID_ERROR</xref><iref item='H3_I | ||||
D_ERROR'/>.</t> | ||||
</section> | </section> | |||
<section anchor="frame-settings" numbered="true" toc="default"> | <section anchor='frame-settings'> | |||
<name>SETTINGS</name> | <name>SETTINGS</name><iref item='SETTINGS' primary='true'/> | |||
<t>The SETTINGS frame (type=0x4) conveys configuration parameters that | <t>The SETTINGS frame (type=0x04) conveys configuration parameters tha | |||
affect how | t affect how | |||
endpoints communicate, such as preferences and constraints on peer behavior. | endpoints communicate, such as preferences and constraints on peer behavior. | |||
Individually, a SETTINGS parameter can also be referred to as a "setting"; the | Individually, a SETTINGS parameter can also be referred to as a "setting"; the | |||
identifier and value of each setting parameter can be referred to as a "setting | identifier and value of each setting parameter can be referred to as a "setting | |||
identifier" and a "setting value".</t> | identifier" and a "setting value".</t> | |||
<t>SETTINGS frames always apply to an entire HTTP/3 connection, never a single | <t>SETTINGS frames always apply to an entire HTTP/3 connection, never a single | |||
stream. A SETTINGS frame <bcp14>MUST</bcp14> be sent as the first frame of each | stream. A SETTINGS frame <bcp14>MUST</bcp14> | |||
control stream | be sent as the first frame of each <xref format='none' target='control-streams' | |||
(see <xref target="control-streams" format="default"/>) by each peer, and <bcp14 | >control stream</xref><iref item='control stream'/> | |||
>MUST NOT</bcp14> be sent subsequently. If an | (see <xref target='control-streams'/>) by each peer, and it <bcp14>MU | |||
endpoint receives a second SETTINGS frame on the control stream, the endpoint | ST NOT</bcp14> | |||
<bcp14>MUST</bcp14> respond with a connection error of type H3_FRAME_UNEXPECTED. | be sent subsequently. If | |||
</t> | an endpoint receives a second SETTINGS frame on the <xref format='none' target=' | |||
<t>SETTINGS frames <bcp14>MUST NOT</bcp14> be sent on any stream other | control-streams'>control stream</xref><iref item='control stream'/>, the endpoin | |||
than the control stream. | t <bcp14>MUST</bcp14> | |||
If an endpoint receives a SETTINGS frame on a different stream, the endpoint | respond with a <xref format='none' target='errors'>connection error</xref><iref | |||
<bcp14>MUST</bcp14> respond with a connection error of type H3_FRAME_UNEXPECTED. | item='connection error'/> of type <xref format='none' target='H3_FRAME_UNEXPECT | |||
</t> | ED'>H3_FRAME_UNEXPECTED</xref><iref item='H3_FRAME_UNEXPECTED'/>.</t> | |||
<t>SETTINGS frames <bcp14>MUST NOT</bcp14> | ||||
be sent on any stream other than the <xref format='none' target='control-stream | ||||
s'>control stream</xref><iref item='control stream'/>. | ||||
If an endpoint receives a SETTINGS frame on a different stream, the endpoint | ||||
<bcp14>MUST</bcp14> | ||||
respond with a <xref format='none' target='errors'>connection error</xref><iref | ||||
item='connection error'/> of type <xref format='none' target='H3_FRAME_UNEXPECT | ||||
ED'>H3_FRAME_UNEXPECTED</xref><iref item='H3_FRAME_UNEXPECTED'/>.</t> | ||||
<t>SETTINGS parameters are not negotiated; they describe characteristi cs of the | <t>SETTINGS parameters are not negotiated; they describe characteristi cs of the | |||
sending peer that can be used by the receiving peer. However, a negotiation | sending peer that can be used by the receiving peer. However, a negotiation | |||
can be implied by the use of SETTINGS - each peer uses SETTINGS to advertise a | can be implied by the use of SETTINGS: each peer uses SETTINGS to advertise a | |||
set of supported values. The definition of the setting would describe how each | set of supported values. The definition of the setting would describe how each | |||
peer combines the two sets to conclude which choice will be used. SETTINGS does | peer combines the two sets to conclude which choice will be used. SETTINGS does | |||
not provide a mechanism to identify when the choice takes effect.</t> | not provide a mechanism to identify when the choice takes effect.</t> | |||
<t>Different values for the same parameter can be advertised by each p eer. For | <t>Different values for the same parameter can be advertised by each p eer. For | |||
example, a client might be willing to consume a very large response field | example, a client might be willing to consume a very large response field | |||
section, while servers are more cautious about request size.</t> | section, while servers are more cautious about request size.</t> | |||
<t>The same setting identifier <bcp14>MUST NOT</bcp14> occur more than | <t>The same setting identifier <bcp14>MUST NOT</bcp14> | |||
once in the SETTINGS frame. | occur more than once in the SETTINGS frame. | |||
A receiver <bcp14>MAY</bcp14> treat the presence of duplicate setting identifier | A receiver <bcp14>MAY</bcp14> | |||
s as a | treat the presence of duplicate setting identifiers as a | |||
connection error of type H3_SETTINGS_ERROR.</t> | <xref format='none' target='errors'>connection error</xref><iref item='connectio | |||
n error'/> of type <xref format='none' target='H3_SETTINGS_ERROR'>H3_SETTINGS_ER | ||||
ROR</xref><iref item='H3_SETTINGS_ERROR'/>.</t> | ||||
<t>The payload of a SETTINGS frame consists of zero or more parameters . Each | <t>The payload of a SETTINGS frame consists of zero or more parameters . Each | |||
parameter consists of a setting identifier and a value, both encoded as QUIC | parameter consists of a setting identifier and a value, both encoded as QUIC | |||
variable-length integers.</t> | variable-length integers.</t> | |||
<figure anchor="fig-ext-settings"> | <figure> | |||
<name>SETTINGS Frame</name> | <name>SETTINGS Frame</name> | |||
<artwork type="drawing" name="" align="left" alt=""><![CDATA[ | <artwork type='ascii-art'><![CDATA[ | |||
Setting { | Setting { | |||
Identifier (i), | Identifier (i), | |||
Value (i), | Value (i), | |||
} | } | |||
SETTINGS Frame { | SETTINGS Frame { | |||
Type (i) = 0x4, | Type (i) = 0x04, | |||
Length (i), | Length (i), | |||
Setting (..) ..., | Setting (..) ..., | |||
} | } | |||
]]></artwork> | ]]></artwork> | |||
</figure> | </figure> | |||
<t>An implementation <bcp14>MUST</bcp14> ignore any parameter with an | <t>An implementation <bcp14>MUST</bcp14> | |||
identifier it does | ignore any parameter with an identifier it does | |||
not understand.</t> | not understand.</t> | |||
<section anchor="settings-parameters" numbered="true" toc="default"> | <section anchor='settings-parameters'> | |||
<name>Defined SETTINGS Parameters</name> | <name>Defined SETTINGS Parameters</name> | |||
<t>The following settings are defined in HTTP/3:</t> | <t>The following settings are defined in HTTP/3:</t> | |||
<dl> | <dl> | |||
<dt> | <dt><xref format='none' target='SETTINGS_MAX_FIELD_SECTION_SIZE'>S | |||
SETTINGS_MAX_FIELD_SECTION_SIZE (0x6): </dt> | ETTINGS_MAX_FIELD_SECTION_SIZE</xref> (0x06)<iref item='SETTINGS_MAX_FIELD_SECTI | |||
ON_SIZE'/>:</dt> | ||||
<dd> | <dd> | |||
<t>The default value is unlimited. See <xref target="header-siz e-constraints" format="default"/> for usage.</t> | <t anchor='SETTINGS_MAX_FIELD_SECTION_SIZE'>The default value is unlimited. See <xref target='header-size-constraints'/> for usage.</t> | |||
</dd> | </dd> | |||
</dl> | </dl> | |||
<t>Setting identifiers of the format <tt>0x1f * N + 0x21</tt> for no n-negative integer | <t>Setting identifiers of the format <tt>0x1f * N + 0x21</tt> for no n-negative integer | |||
values of N are reserved to exercise the requirement that unknown identifiers be | values of <tt>N</tt> are reserved to exercise the requirement that unknown ident | |||
ignored. Such settings have no defined meaning. Endpoints <bcp14>SHOULD</bcp14> | ifiers | |||
include at | be ignored. Such settings have no defined meaning. Endpoints <bcp1 | |||
least one such setting in their SETTINGS frame. Endpoints <bcp14>MUST NOT</bcp14 | 4>SHOULD</bcp14> | |||
> consider such | include at | |||
least one such setting in their SETTINGS frame. Endpoints <bcp14>MU | ||||
ST NOT</bcp14> | ||||
consider such | ||||
settings to have any meaning upon receipt.</t> | settings to have any meaning upon receipt.</t> | |||
<t>Because the setting has no defined meaning, the value of the sett ing can be any | <t>Because the setting has no defined meaning, the value of the sett ing can be any | |||
value the implementation selects.</t> | value the implementation selects.</t> | |||
<t>Setting identifiers which were defined in <xref target="RFC7540" | <t>Setting identifiers that were defined in <xref target='RFC9113'/> | |||
format="default"/> where there is no | where there is no | |||
corresponding HTTP/3 setting have also been reserved (<xref target="iana-setting | corresponding HTTP/3 setting have also been reserved (<xref target='iana-setting | |||
s" format="default"/>). These | s'/>). These | |||
reserved settings <bcp14>MUST NOT</bcp14> be sent, and their receipt <bcp14>MUST | reserved settings <bcp14>MUST NOT</bcp14> | |||
</bcp14> be treated as a | be sent, and their receipt <bcp14>MUST</bcp14> | |||
connection error of type H3_SETTINGS_ERROR.</t> | be treated as a | |||
<t>Additional settings can be defined by extensions to HTTP/3; see < | <xref format='none' target='errors'>connection error</xref><iref item='connectio | |||
xref target="extensions" format="default"/> | n error'/> of type <xref format='none' target='H3_SETTINGS_ERROR'>H3_SETTINGS_ER | |||
ROR</xref><iref item='H3_SETTINGS_ERROR'/>.</t> | ||||
<t>Additional settings can be defined by extensions to HTTP/3; see < | ||||
xref target='extensions'/> | ||||
for more details.</t> | for more details.</t> | |||
</section> | </section> | |||
<section anchor="settings-initialization" numbered="true" toc="default "> | <section anchor='settings-initialization'> | |||
<name>Initialization</name> | <name>Initialization</name> | |||
<t>An HTTP implementation <bcp14>MUST NOT</bcp14> send frames or req | <t>An HTTP implementation <bcp14>MUST NOT</bcp14> | |||
uests that would be invalid | send frames or requests that would be invalid | |||
based on its current understanding of the peer's settings.</t> | based on its current understanding of the peer's settings.</t> | |||
<t>All settings begin at an initial value. Each endpoint <bcp14>SHO | <t>All settings begin at an initial value. Each endpoint | |||
ULD</bcp14> use these initial | <bcp14>SHOULD</bcp14> | |||
use these initial | ||||
values to send messages before the peer's SETTINGS frame has arrived, as packets | values to send messages before the peer's SETTINGS frame has arrived, as packets | |||
carrying the settings can be lost or delayed. When the SETTINGS frame arrives, | carrying the settings can be lost or delayed. When the SETTINGS frame arrives, | |||
any settings are changed to their new values.</t> | any settings are changed to their new values.</t> | |||
<t>This removes the need to wait for the SETTINGS frame before sendi ng messages. | <t>This removes the need to wait for the SETTINGS frame before sendi ng messages. | |||
Endpoints <bcp14>MUST NOT</bcp14> require any data to be received from the peer | Endpoints <bcp14>MUST NOT</bcp14> | |||
prior to | require any data to be received from the peer prior to | |||
sending the SETTINGS frame; settings <bcp14>MUST</bcp14> be sent as soon as the | sending the SETTINGS frame; settings <bcp14>MUST</bcp14> | |||
transport is | be sent as soon as the transport is | |||
ready to send data.</t> | ready to send data.</t> | |||
<t>For servers, the initial value of each client setting is the defa ult value.</t> | <t>For servers, the initial value of each client setting is the defa ult value.</t> | |||
<t>For clients using a 1-RTT QUIC connection, the initial value of e ach server | <t>For clients using a 1-RTT QUIC connection, the initial value of e ach server | |||
setting is the default value. 1-RTT keys will always become available prior to | setting is the default value. 1-RTT keys will always become available prior to | |||
the packet containing SETTINGS being processed by QUIC, even if the server sends | the packet containing SETTINGS being processed by QUIC, even if the server sends | |||
SETTINGS immediately. Clients <bcp14>SHOULD NOT</bcp14> wait indefinitely for S | SETTINGS immediately. Clients <bcp14>SHOULD NOT</bcp14> | |||
ETTINGS to | wait indefinitely for SETTINGS to | |||
arrive before sending requests, but <bcp14>SHOULD</bcp14> process received datag | arrive before sending requests, but they <bcp14>SHOULD</bcp14> | |||
rams in order | process received datagrams in | |||
to increase the likelihood of processing SETTINGS before sending the first | order to increase the likelihood of processing SETTINGS before sending the first | |||
request.</t> | request.</t> | |||
<t>When a 0-RTT QUIC connection is being used, the initial value of each server | <t>When a 0-RTT QUIC connection is being used, the initial value of each server | |||
setting is the value used in the previous session. Clients <bcp14>SHOULD</bcp14> | setting is the value used in the previous session. Clients <bcp14>S | |||
store the | HOULD</bcp14> | |||
store the | ||||
settings the server provided in the HTTP/3 connection where resumption | settings the server provided in the HTTP/3 connection where resumption | |||
information was provided, but <bcp14>MAY</bcp14> opt not to store settings in ce | information was provided, but they <bcp14>MAY</bcp14> | |||
rtain cases | opt not to store settings in certain | |||
(e.g., if the session ticket is received before the SETTINGS frame). A client | cases (e.g., if the session ticket is received before the SETTINGS frame). A | |||
<bcp14>MUST</bcp14> comply with stored settings -- or default values, if no valu | client <bcp14>MUST</bcp14> | |||
es are stored | comply with stored settings -- or default values if no values are | |||
comply with those values.</t> | stored -- when attempting 0-RTT. Once a server has provided new settings, | |||
<t>A server can remember the settings that it advertised, or store a | clients <bcp14>MUST</bcp14> | |||
n | comply with those values.</t> | |||
<t>A server can remember the settings that it advertised or store an | ||||
integrity-protected copy of the values in the ticket and recover the information | integrity-protected copy of the values in the ticket and recover the information | |||
when accepting 0-RTT data. A server uses the HTTP/3 settings values in | when accepting 0-RTT data. A server uses the HTTP/3 settings values in | |||
determining whether to accept 0-RTT data. If the server cannot determine that | determining whether to accept 0-RTT data. If the server cannot determine that | |||
the settings remembered by a client are compatible with its current settings, it | the settings remembered by a client are compatible with its current settings, it | |||
<bcp14>MUST NOT</bcp14> accept 0-RTT data. Remembered settings are compatible i | <bcp14>MUST NOT</bcp14> | |||
f a client | accept 0-RTT data. Remembered settings are compatible if a client | |||
complying with those settings would not violate the server's current settings.</ t> | complying with those settings would not violate the server's current settings.</ t> | |||
<t>A server <bcp14>MAY</bcp14> accept 0-RTT and subsequently provide | <t>A server <bcp14>MAY</bcp14> | |||
different settings in its | accept 0-RTT and subsequently provide different settings in its | |||
SETTINGS frame. If 0-RTT data is accepted by the server, its SETTINGS frame <bcp | SETTINGS frame. If 0-RTT data is accepted by the server, its SETTINGS frame | |||
14>MUST | <bcp14>MUST | |||
NOT</bcp14> reduce any limits or alter any values that might be violated by the | NOT</bcp14> | |||
client | reduce any limits or alter any values that might be violated by the client | |||
with its 0-RTT data. The server <bcp14>MUST</bcp14> include all settings that d | with its 0-RTT data. The server <bcp14>MUST</bcp14> | |||
iffer from | include all settings that differ from | |||
their default values. If a server accepts 0-RTT but then sends settings that | their default values. If a server accepts 0-RTT but then sends settings that | |||
are not compatible with the previously specified settings, this <bcp14>MUST</bcp | are not compatible with the previously specified settings, this <bc | |||
14> be treated | p14>MUST</bcp14> | |||
as a connection error of type H3_SETTINGS_ERROR. If a server accepts 0-RTT but | be treated | |||
as a <xref format='none' target='errors'>connection error</xref><iref item='conn | ||||
ection error'/> of type <xref format='none' target='H3_SETTINGS_ERROR'>H3_SETTIN | ||||
GS_ERROR</xref><iref item='H3_SETTINGS_ERROR'/>. If a server accepts 0-RTT but | ||||
then sends a SETTINGS frame that omits a setting value that the client | then sends a SETTINGS frame that omits a setting value that the client | |||
understands (apart from reserved setting identifiers) that was previously | understands (apart from reserved setting identifiers) that was previously | |||
specified to have a non-default value, this <bcp14>MUST</bcp14> be treated as a | specified to have a non-default value, this <bcp14>MUST</bcp14> | |||
connection | be treated as a <xref format='none' target='errors'>connection | |||
error of type H3_SETTINGS_ERROR.</t> | error</xref><iref item='connection error'/> of type <xref format='none' target=' | |||
H3_SETTINGS_ERROR'>H3_SETTINGS_ERROR</xref><iref item='H3_SETTINGS_ERROR'/>.</t> | ||||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="frame-push-promise" numbered="true" toc="default"> | <section anchor='frame-push-promise'> | |||
<name>PUSH_PROMISE</name> | <name>PUSH_PROMISE</name><iref item='PUSH_PROMISE' primary='true'/> | |||
<t>The PUSH_PROMISE frame (type=0x5) is used to carry a promised reque | <t>The PUSH_PROMISE frame (type=0x05) is used to carry a promised requ | |||
st header | est header | |||
section from server to client on a request stream, as in HTTP/2.</t> | section from server to client on a <xref format='none' target='request-streams'> | |||
<figure anchor="fig-push-promise"> | request stream</xref><iref item='request stream'/>.</t> | |||
<figure> | ||||
<name>PUSH_PROMISE Frame</name> | <name>PUSH_PROMISE Frame</name> | |||
<artwork type="drawing" name="" align="left" alt=""><![CDATA[ | <artwork type='ascii-art'><![CDATA[ | |||
PUSH_PROMISE Frame { | PUSH_PROMISE Frame { | |||
Type (i) = 0x5, | Type (i) = 0x05, | |||
Length (i), | Length (i), | |||
Push ID (i), | Push ID (i), | |||
Encoded Field Section (..), | Encoded Field Section (..), | |||
} | } | |||
]]></artwork> | ]]></artwork> | |||
</figure> | </figure> | |||
<t>The payload consists of:</t> | <t>The payload consists of:</t> | |||
<dl> | <dl> | |||
<dt> | <dt>Push ID:</dt> | |||
Push ID: </dt> | ||||
<dd> | <dd> | |||
<t>A variable-length integer that identifies the server push opera | <t>A variable-length integer that identifies the server push opera | |||
tion. A Push | tion. A <xref format='none' target='server-push'>push | |||
ID is used in push stream headers (<xref target="server-push" format="default"/> | ID</xref><iref item='push ID'/> is used in <xref format='none' target='push-stre | |||
) and CANCEL_PUSH frames | ams'>push stream</xref><iref item='push stream'/> headers (<xref target='server- | |||
(<xref target="frame-cancel-push" format="default"/>).</t> | push'/>) and <xref format='none' target='frame-cancel-push'>CANCEL_PUSH</xref><i | |||
ref item='CANCEL_PUSH'/> frames.</t> | ||||
</dd> | </dd> | |||
<dt> | <dt>Encoded Field Section:</dt> | |||
Encoded Field Section: </dt> | ||||
<dd> | <dd> | |||
<t>QPACK-encoded request header fields for the promised response. | <t>QPACK-encoded request header fields for the promised response. | |||
See <xref target="RFCYYY2" format="default"/> | See | |||
for more details.</t> | <xref target='RFC9204'/> for more details.</t> | |||
</dd> | </dd> | |||
</dl> | </dl> | |||
<t>A server <bcp14>MUST NOT</bcp14> use a Push ID that is larger than | <t>A server <bcp14>MUST NOT</bcp14> | |||
the client has provided in a | use a <xref format='none' target='server-push'>push ID</xref><iref item='push I | |||
MAX_PUSH_ID frame (<xref target="frame-max-push-id" format="default"/>). A clien | D'/> that is larger than the client has provided in a | |||
t <bcp14>MUST</bcp14> treat receipt of a | <xref format='none' target='frame-max-push-id'>MAX_PUSH_ID</xref><iref item='MAX | |||
PUSH_PROMISE frame that contains a larger Push ID than the client has advertised | _PUSH_ID'/> frame (<xref target='frame-max-push-id'/>). A client <bcp | |||
as a connection error of H3_ID_ERROR.</t> | 14>MUST</bcp14> | |||
<t>A server <bcp14>MAY</bcp14> use the same Push ID in multiple PUSH_P | treat receipt of a | |||
ROMISE frames. If so, the | PUSH_PROMISE frame that contains a larger <xref format='none' target='server-pus | |||
decompressed request header sets <bcp14>MUST</bcp14> contain the same fields in | h'>push ID</xref><iref item='push ID'/> than the client has advertised | |||
the same order, | as a <xref format='none' target='errors'>connection error</xref><iref item='conn | |||
and both the name and the value in each field <bcp14>MUST</bcp14> be exact match | ection error'/> of <xref format='none' target='H3_ID_ERROR'>H3_ID_ERROR</xref><i | |||
es. Clients | ref item='H3_ID_ERROR'/>.</t> | |||
<bcp14>SHOULD</bcp14> compare the request header sections for resources promised | <t>A server <bcp14>MAY</bcp14> | |||
multiple | use the same <xref format='none' target='server-push'>push ID</xref><iref item= | |||
times. If a client receives a Push ID that has already been promised and detects | 'push ID'/> in multiple PUSH_PROMISE frames. If so, the | |||
a mismatch, it <bcp14>MUST</bcp14> respond with a connection error of type | decompressed request header sets <bcp14>MUST</bcp14> | |||
H3_GENERAL_PROTOCOL_ERROR. If the decompressed field sections match exactly, the | contain the same fields in the same order, | |||
client <bcp14>SHOULD</bcp14> associate the pushed content with each stream on wh | and both the name and the value in each field <bcp14>MUST</bcp14> | |||
ich a | be exact matches. Clients <bcp14>SHOULD</bcp14> | |||
compare the request header sections for resources promised multiple | ||||
times. If a client receives a <xref format='none' target='server-push'>push ID</ | ||||
xref><iref item='push ID'/> that has already been promised and detects | ||||
a mismatch, it <bcp14>MUST</bcp14> | ||||
respond with a <xref format='none' target='errors'>connection error</xref><iref | ||||
item='connection error'/> of type | ||||
<xref format='none' target='H3_GENERAL_PROTOCOL_ERROR'>H3_GENERAL_PROTOCOL_ERROR | ||||
</xref><iref item='H3_GENERAL_PROTOCOL_ERROR'/>. If the decompressed field secti | ||||
ons match exactly, the | ||||
client <bcp14>SHOULD</bcp14> | ||||
associate the pushed content with each stream on which a | ||||
PUSH_PROMISE frame was received.</t> | PUSH_PROMISE frame was received.</t> | |||
<t>Allowing duplicate references to the same Push ID is primarily to r | <t>Allowing duplicate references to the same <xref format='none' targe | |||
educe | t='server-push'>push ID</xref><iref item='push ID'/> is primarily to reduce | |||
duplication caused by concurrent requests. A server <bcp14>SHOULD</bcp14> avoid | duplication caused by concurrent requests. A server <bcp14>SHOULD</b | |||
reusing a Push | cp14> | |||
ID over a long period. Clients are likely to consume server push responses and | avoid reusing a <xref format='none' target='server-push'>push | |||
ID</xref><iref item='push ID'/> over a long period. Clients are likely to consu | ||||
me server push responses and | ||||
not retain them for reuse over time. Clients that see a PUSH_PROMISE frame that | not retain them for reuse over time. Clients that see a PUSH_PROMISE frame that | |||
uses a Push ID that they have already consumed and discarded are forced to | uses a <xref format='none' target='server-push'>push ID</xref><iref item='push I D'/> that they have already consumed and discarded are forced to | |||
ignore the promise.</t> | ignore the promise.</t> | |||
<t>If a PUSH_PROMISE frame is received on the control stream, the clie | <t>If a PUSH_PROMISE frame is received on the <xref format='none' targ | |||
nt <bcp14>MUST</bcp14> | et='control-streams'>control stream</xref><iref item='control stream'/>, the cli | |||
respond with a connection error of type H3_FRAME_UNEXPECTED; see <xref target="e | ent <bcp14>MUST</bcp14> | |||
rrors" format="default"/>.</t> | ||||
<t>A client <bcp14>MUST NOT</bcp14> send a PUSH_PROMISE frame. A serv | respond with a <xref format='none' target='errors'>connection error</xref><iref | |||
er <bcp14>MUST</bcp14> treat the receipt of | item='connection error'/> of type <xref format='none' target='H3_FRAME_UNEXPECTE | |||
a PUSH_PROMISE frame as a connection error of type H3_FRAME_UNEXPECTED; see | D'>H3_FRAME_UNEXPECTED</xref><iref item='H3_FRAME_UNEXPECTED'/>.</t> | |||
<xref target="errors" format="default"/>.</t> | <t>A client <bcp14>MUST NOT</bcp14> | |||
<t>See <xref target="server-push" format="default"/> for a description | send a PUSH_PROMISE frame. A server <bcp14>MUST</bcp14> | |||
of the overall server push mechanism.</t> | treat the receipt of | |||
a PUSH_PROMISE frame as a <xref format='none' target='errors'>connection error</ | ||||
xref><iref item='connection error'/> of type <xref format='none' target='H3_FRAM | ||||
E_UNEXPECTED'>H3_FRAME_UNEXPECTED</xref><iref item='H3_FRAME_UNEXPECTED'/>.</t> | ||||
<t>See <xref target='server-push'/> for a description of the overall s | ||||
erver push mechanism.</t> | ||||
</section> | </section> | |||
<section anchor="frame-goaway" numbered="true" toc="default"> | <section anchor='frame-goaway'> | |||
<name>GOAWAY</name> | <name>GOAWAY</name><iref item='GOAWAY' primary='true'/> | |||
<t>The GOAWAY frame (type=0x7) is used to initiate graceful shutdown o | <t>The GOAWAY frame (type=0x07) is used to initiate graceful shutdown | |||
f an HTTP/3 | of an HTTP/3 | |||
connection by either endpoint. GOAWAY allows an endpoint to stop accepting new | connection by either endpoint. GOAWAY allows an endpoint to stop accepting new | |||
requests or pushes while still finishing processing of previously received | requests or pushes while still finishing processing of previously received | |||
requests and pushes. This enables administrative actions, like server | requests and pushes. This enables administrative actions, like server | |||
maintenance. GOAWAY by itself does not close a connection.</t> | maintenance. GOAWAY by itself does not close a connection.</t> | |||
<figure anchor="fig-goaway"> | <figure> | |||
<name>GOAWAY Frame</name> | <name>GOAWAY Frame</name> | |||
<artwork type="drawing" name="" align="left" alt=""><![CDATA[ | <artwork type='ascii-art'><![CDATA[ | |||
GOAWAY Frame { | GOAWAY Frame { | |||
Type (i) = 0x7, | Type (i) = 0x07, | |||
Length (i), | Length (i), | |||
Stream ID/Push ID (..), | Stream ID/Push ID (i), | |||
} | } | |||
]]></artwork> | ]]></artwork> | |||
</figure> | </figure> | |||
<t>The GOAWAY frame is always sent on the control stream. In the serv | <t>The GOAWAY frame is always sent on the <xref format='none' target=' | |||
er to client | control-streams'>control stream</xref><iref item='control stream'/>. In the ser | |||
direction, it carries a QUIC Stream ID for a client-initiated bidirectional | ver-to-client | |||
stream encoded as a variable-length integer. A client <bcp14>MUST</bcp14> treat | direction, it carries a QUIC stream ID for a client-initiated bidirectional | |||
receipt of a | stream encoded as a variable-length integer. A client <bcp14>MUST</b | |||
GOAWAY frame containing a Stream ID of any other type as a connection error of | cp14> | |||
type H3_ID_ERROR.</t> | treat receipt of a | |||
<t>In the client to server direction, the GOAWAY frame carries a Push | GOAWAY frame containing a stream ID of any other type as a <xref format='none' t | |||
ID encoded as | arget='errors'>connection error</xref><iref item='connection error'/> of | |||
type <xref format='none' target='H3_ID_ERROR'>H3_ID_ERROR</xref><iref item='H3_I | ||||
D_ERROR'/>.</t> | ||||
<t>In the client-to-server direction, the GOAWAY frame carries a <xref | ||||
format='none' target='server-push'>push ID</xref><iref item='push ID'/> encoded | ||||
as | ||||
a variable-length integer.</t> | a variable-length integer.</t> | |||
<t>The GOAWAY frame applies to the entire connection, not a specific s tream. A | <t>The GOAWAY frame applies to the entire connection, not a specific s tream. A | |||
client <bcp14>MUST</bcp14> treat a GOAWAY frame on a stream other than the contr | client <bcp14>MUST</bcp14> | |||
ol stream as a | treat a GOAWAY frame on a stream other than the <xref format='none' target='con | |||
connection error of type H3_FRAME_UNEXPECTED; see <xref target="errors" format=" | trol-streams'>control stream</xref><iref item='control stream'/> as a | |||
default"/>.</t> | <xref format='none' target='errors'>connection error</xref><iref item='connectio | |||
<t>See <xref target="connection-shutdown" format="default"/> for more | n error'/> of type <xref format='none' target='H3_FRAME_UNEXPECTED'>H3_FRAME_UNE | |||
information on the use of the GOAWAY frame.</t> | XPECTED</xref><iref item='H3_FRAME_UNEXPECTED'/>.</t> | |||
<t>See <xref target='connection-shutdown'/> for more information on th | ||||
e use of the GOAWAY frame.</t> | ||||
</section> | </section> | |||
<section anchor="frame-max-push-id" numbered="true" toc="default"> | <section anchor='frame-max-push-id'> | |||
<name>MAX_PUSH_ID</name> | <name>MAX_PUSH_ID</name><iref item='MAX_PUSH_ID' primary='true'/> | |||
<t>The MAX_PUSH_ID frame (type=0xd) is used by clients to control the | <t>The MAX_PUSH_ID frame (type=0x0d) is used by clients to control the | |||
number of | number of | |||
server pushes that the server can initiate. This sets the maximum value for a | server pushes that the server can initiate. This sets the maximum value for a | |||
Push ID that the server can use in PUSH_PROMISE and CANCEL_PUSH frames. | <xref format='none' target='server-push'>push ID</xref><iref item='push ID'/> th | |||
Consequently, this also limits the number of push streams that the server can | at the server can use in <xref format='none' target='frame-push-promise'>PUSH_PR | |||
OMISE</xref><iref item='PUSH_PROMISE'/> and <xref format='none' target='frame-ca | ||||
ncel-push'>CANCEL_PUSH</xref><iref item='CANCEL_PUSH'/> frames. | ||||
Consequently, this also limits the number of <xref format='none' target='push-st | ||||
reams'>push streams</xref><iref item='push stream'/> that the server can | ||||
initiate in addition to the limit maintained by the QUIC transport.</t> | initiate in addition to the limit maintained by the QUIC transport.</t> | |||
<t>The MAX_PUSH_ID frame is always sent on the control stream. Receip | <t>The MAX_PUSH_ID frame is always sent on the <xref format='none' tar | |||
t of a | get='control-streams'>control stream</xref><iref item='control stream'/>. Recei | |||
MAX_PUSH_ID frame on any other stream <bcp14>MUST</bcp14> be treated as a connec | pt of a | |||
tion error of | MAX_PUSH_ID frame on any other stream <bcp14>MUST</bcp14> | |||
type H3_FRAME_UNEXPECTED.</t> | be treated as a <xref format='none' target='errors'>connection error</xref><ire | |||
<t>A server <bcp14>MUST NOT</bcp14> send a MAX_PUSH_ID frame. A clien | f item='connection error'/> of | |||
t <bcp14>MUST</bcp14> treat the receipt of | type <xref format='none' target='H3_FRAME_UNEXPECTED'>H3_FRAME_UNEXPECTED</xref> | |||
a MAX_PUSH_ID frame as a connection error of type H3_FRAME_UNEXPECTED.</t> | <iref item='H3_FRAME_UNEXPECTED'/>.</t> | |||
<t>The maximum Push ID is unset when an HTTP/3 connection is created, | <t>A server <bcp14>MUST NOT</bcp14> | |||
meaning that | send a MAX_PUSH_ID frame. A client <bcp14>MUST</bcp14> | |||
treat the receipt of | ||||
a MAX_PUSH_ID frame as a <xref format='none' target='errors'>connection error</x | ||||
ref><iref item='connection error'/> of type <xref format='none' target='H3_FRAME | ||||
_UNEXPECTED'>H3_FRAME_UNEXPECTED</xref><iref item='H3_FRAME_UNEXPECTED'/>.</t> | ||||
<t>The maximum <xref format='none' target='server-push'>push ID</xref> | ||||
<iref item='push ID'/> is unset when an HTTP/3 connection is created, meaning th | ||||
at | ||||
a server cannot push until it receives a MAX_PUSH_ID frame. A client that | a server cannot push until it receives a MAX_PUSH_ID frame. A client that | |||
wishes to manage the number of promised server pushes can increase the maximum | wishes to manage the number of promised server pushes can increase the maximum | |||
Push ID by sending MAX_PUSH_ID frames as the server fulfills or cancels server | <xref format='none' target='server-push'>push ID</xref><iref item='push ID'/> by sending MAX_PUSH_ID frames as the server fulfills or cancels server | |||
pushes.</t> | pushes.</t> | |||
<figure anchor="fig-max-push"> | <figure> | |||
<name>MAX_PUSH_ID Frame</name> | <name>MAX_PUSH_ID Frame</name> | |||
<artwork type="drawing" name="" align="left" alt=""><![CDATA[ | <artwork type='ascii-art'><![CDATA[ | |||
MAX_PUSH_ID Frame { | MAX_PUSH_ID Frame { | |||
Type (i) = 0xd, | Type (i) = 0x0d, | |||
Length (i), | Length (i), | |||
Push ID (i), | Push ID (i), | |||
} | } | |||
]]></artwork> | ]]></artwork> | |||
</figure> | </figure> | |||
<t>The MAX_PUSH_ID frame carries a single variable-length integer that identifies | <t>The MAX_PUSH_ID frame carries a single variable-length integer that identifies | |||
the maximum value for a Push ID that the server can use; see <xref target="serve | the maximum value for a <xref format='none' target='server-push'>push ID</xref>< | |||
r-push" format="default"/>. A | iref item='push ID'/> that the server can use; see <xref target='server-push'/>. | |||
MAX_PUSH_ID frame cannot reduce the maximum Push ID; receipt of a MAX_PUSH_ID | A | |||
frame that contains a smaller value than previously received <bcp14>MUST</bcp14> | MAX_PUSH_ID frame cannot reduce the maximum <xref format='none' target='server-p | |||
be treated as | ush'>push ID</xref><iref item='push ID'/>; receipt of a MAX_PUSH_ID | |||
a connection error of type H3_ID_ERROR.</t> | frame that contains a smaller value than previously received <bcp14>M | |||
UST</bcp14> | ||||
be treated as | ||||
a <xref format='none' target='errors'>connection error</xref><iref item='connect | ||||
ion error'/> of type <xref format='none' target='H3_ID_ERROR'>H3_ID_ERROR</xref> | ||||
<iref item='H3_ID_ERROR'/>.</t> | ||||
</section> | </section> | |||
<section anchor="frame-reserved" numbered="true" toc="default"> | <section anchor='frame-reserved'> | |||
<name>Reserved Frame Types</name> | <name>Reserved Frame Types</name> | |||
<t>Frame types of the format <tt>0x1f * N + 0x21</tt> for non-negative | <t>Frame types of the format <tt>0x1f * N + 0x21</tt> for non-negative | |||
integer values of N | integer values of | |||
are reserved to exercise the requirement that unknown types be ignored | <tt>N</tt> are reserved to exercise the requirement that unknown types be ignore | |||
(<xref target="extensions" format="default"/>). These frames have no semantics, | d | |||
and <bcp14>MAY</bcp14> be sent on any stream | (<xref target='extensions'/>). These frames have no semantics, and they | |||
where frames are allowed to be sent. This enables their use for | <bcp14>MAY</bcp14> | |||
application-layer padding. Endpoints <bcp14>MUST NOT</bcp14> consider these fra | be sent on any | |||
mes to have any | stream where frames are allowed to be sent. This enables their use for | |||
application-layer padding. Endpoints <bcp14>MUST NOT</bcp14> | ||||
consider these frames to have any | ||||
meaning upon receipt.</t> | meaning upon receipt.</t> | |||
<t>The payload and length of the frames are selected in any manner the | <t>The payload and length of the frames are selected in any manner the | |||
implementation chooses.</t> | implementation chooses.</t> | |||
<t>Frame types that were used in HTTP/2 where there is no correspondin g HTTP/3 | <t>Frame types that were used in HTTP/2 where there is no correspondin g HTTP/3 | |||
frame have also been reserved (<xref target="iana-frames" format="default"/>). | frame have also been reserved (<xref target='iana-frames'/>). These frame types | |||
These frame types <bcp14>MUST NOT</bcp14> be | <bcp14>MUST NOT</bcp14> | |||
sent, and their receipt <bcp14>MUST</bcp14> be treated as a connection error of | be | |||
type | sent, and their receipt <bcp14>MUST</bcp14> | |||
H3_FRAME_UNEXPECTED.</t> | be treated as a <xref format='none' target='errors'>connection error</xref><ire | |||
f item='connection error'/> of type | ||||
<xref format='none' target='H3_FRAME_UNEXPECTED'>H3_FRAME_UNEXPECTED</xref><iref | ||||
item='H3_FRAME_UNEXPECTED'/>.</t> | ||||
</section> | </section> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="errors" numbered="true" toc="default"> | <section anchor='errors'> | |||
<name>Error Handling</name> | <name>Error Handling</name><iref item='connection error' primary='true'/>< | |||
iref item='stream error' primary='true'/> | ||||
<t>When a stream cannot be completed successfully, QUIC allows the applica tion to | <t>When a stream cannot be completed successfully, QUIC allows the applica tion to | |||
abruptly terminate (reset) that stream and communicate a reason; see <xref secti on="2.4" sectionFormat="of" target="RFCYYY1" format="default"/>. This is referre d to as a "stream error." An HTTP/3 | abruptly terminate (reset) that stream and communicate a reason; see <xref secti on='2.4' sectionFormat='of' target='QUIC-TRANSPORT'/>. This is referred to as a "stream error". An HTTP/3 | |||
implementation can decide to close a QUIC stream and communicate the type of | implementation can decide to close a QUIC stream and communicate the type of | |||
error. Wire encodings of error codes are defined in <xref target="http-error-cod | error. Wire encodings of error codes are defined in <xref target='http-error-cod | |||
es" format="default"/>. | es'/>. | |||
Stream errors are distinct from HTTP status codes which indicate error | Stream errors are distinct from HTTP status codes that indicate error | |||
conditions. Stream errors indicate that the sender did not transfer or consume | conditions. Stream errors indicate that the sender did not transfer or consume | |||
the full request or response, while HTTP status codes indicate the result of a | the full request or response, while HTTP status codes indicate the result of a | |||
request that was successfully received.</t> | request that was successfully received.</t> | |||
<t>If an entire connection needs to be terminated, QUIC similarly provides | <t>If an entire connection needs to be terminated, QUIC similarly provides | |||
mechanisms to communicate a reason; see <xref section="5.3" sectionFormat="of" t | mechanisms to communicate a reason; see <xref section='5.3' sectionFormat='of' t | |||
arget="RFCYYY1" format="default"/>. This | arget='QUIC-TRANSPORT'/>. This | |||
is referred to as a "connection error." Similar to stream errors, an HTTP/3 | is referred to as a "connection error". Similar to stream errors, an HTTP/3 | |||
implementation can terminate a QUIC connection and communicate the reason using | implementation can terminate a QUIC connection and communicate the reason using | |||
an error code from <xref target="http-error-codes" format="default"/>.</t> | an error code from <xref target='http-error-codes'/>.</t> | |||
<t>Although the reasons for closing streams and connections are called "er | <t>Although the reasons for closing streams and connections are called "er | |||
rors," | rors", | |||
these actions do not necessarily indicate a problem with the connection or | these actions do not necessarily indicate a problem with the connection or | |||
either implementation. For example, a stream can be reset if the requested | either implementation. For example, a stream can be reset if the requested | |||
resource is no longer needed.</t> | resource is no longer needed.</t> | |||
<t>An endpoint <bcp14>MAY</bcp14> choose to treat a stream error as a conn | <t>An endpoint <bcp14>MAY</bcp14> | |||
ection error under | choose to treat a stream error as a connection error under | |||
certain circumstances, closing the entire connection in response to a condition | certain circumstances, closing the entire connection in response to a condition | |||
on a single stream. Implementations need to consider the impact on outstanding | on a single stream. Implementations need to consider the impact on outstanding | |||
requests before making this choice.</t> | requests before making this choice.</t> | |||
<t>Because new error codes can be defined without negotiation (see <xref t arget="extensions" format="default"/>), | <t>Because new error codes can be defined without negotiation (see <xref t arget='extensions'/>), | |||
use of an error code in an unexpected context or receipt of an unknown error | use of an error code in an unexpected context or receipt of an unknown error | |||
code <bcp14>MUST</bcp14> be treated as equivalent to H3_NO_ERROR. However, clos | code <bcp14>MUST</bcp14> | |||
ing a stream | be treated as equivalent to <xref format='none' target='H3_NO_ERROR'>H3_NO_ERRO | |||
R</xref><iref item='H3_NO_ERROR'/>. However, closing a stream | ||||
can have other effects regardless of the error code; for example, see | can have other effects regardless of the error code; for example, see | |||
<xref target="request-response" format="default"/>.</t> | <xref target='request-response'/>.</t> | |||
<section anchor="http-error-codes" numbered="true" toc="default"> | <section anchor='http-error-codes'> | |||
<name>HTTP/3 Error Codes</name> | <name>HTTP/3 Error Codes</name> | |||
<t>The following error codes are defined for use when abruptly terminati ng streams, | <t>The following error codes are defined for use when abruptly terminati ng streams, | |||
aborting reading of streams, or immediately closing HTTP/3 connections.</t> | aborting reading of streams, or immediately closing HTTP/3 connections.</t> | |||
<dl> | <dl> | |||
<dt> | <dt><xref format='none' target='H3_NO_ERROR'>H3_NO_ERROR</xref> (0x010 | |||
H3_NO_ERROR (0x100): </dt> | 0)<iref item='H3_NO_ERROR'/>:</dt> | |||
<dd> | <dd> | |||
<t>No error. This is used when the connection or stream needs to be closed, but | <t anchor='H3_NO_ERROR'>No error. This is used when the connection or stream needs to be closed, but | |||
there is no error to signal.</t> | there is no error to signal.</t> | |||
</dd> | </dd> | |||
<dt> | <dt><xref format='none' target='H3_GENERAL_PROTOCOL_ERROR'>H3_GENERAL_ | |||
H3_GENERAL_PROTOCOL_ERROR (0x101): </dt> | PROTOCOL_ERROR</xref> (0x0101)<iref item='H3_GENERAL_PROTOCOL_ERROR'/>:</dt> | |||
<dd> | <dd> | |||
<t>Peer violated protocol requirements in a way that does not match | <t anchor='H3_GENERAL_PROTOCOL_ERROR'>Peer violated protocol require | |||
a more | ments in a way that does not match a more | |||
specific error code, or endpoint declines to use the more specific error code.</ | specific error code or endpoint declines to use the more specific error code.</t | |||
t> | > | |||
</dd> | </dd> | |||
<dt> | <dt><xref format='none' target='H3_INTERNAL_ERROR'>H3_INTERNAL_ERROR</ | |||
H3_INTERNAL_ERROR (0x102): </dt> | xref> (0x0102)<iref item='H3_INTERNAL_ERROR'/>:</dt> | |||
<dd> | <dd> | |||
<t>An internal error has occurred in the HTTP stack.</t> | <t anchor='H3_INTERNAL_ERROR'>An internal error has occurred in the HTTP stack.</t> | |||
</dd> | </dd> | |||
<dt> | <dt><xref format='none' target='H3_STREAM_CREATION_ERROR'>H3_STREAM_CR | |||
H3_STREAM_CREATION_ERROR (0x103): </dt> | EATION_ERROR</xref> (0x0103)<iref item='H3_STREAM_CREATION_ERROR'/>:</dt> | |||
<dd> | <dd> | |||
<t>The endpoint detected that its peer created a stream that it will not accept.</t> | <t anchor='H3_STREAM_CREATION_ERROR'>The endpoint detected that its peer created a stream that it will not accept.</t> | |||
</dd> | </dd> | |||
<dt> | <dt><xref format='none' target='H3_CLOSED_CRITICAL_STREAM'>H3_CLOSED_C | |||
H3_CLOSED_CRITICAL_STREAM (0x104): </dt> | RITICAL_STREAM</xref> (0x0104)<iref item='H3_CLOSED_CRITICAL_STREAM'/>:</dt> | |||
<dd> | <dd> | |||
<t>A stream required by the HTTP/3 connection was closed or reset.</ t> | <t anchor='H3_CLOSED_CRITICAL_STREAM'>A stream required by the HTTP/ 3 connection was closed or reset.</t> | |||
</dd> | </dd> | |||
<dt> | <dt><xref format='none' target='H3_FRAME_UNEXPECTED'>H3_FRAME_UNEXPECT | |||
H3_FRAME_UNEXPECTED (0x105): </dt> | ED</xref> (0x0105)<iref item='H3_FRAME_UNEXPECTED'/>:</dt> | |||
<dd> | <dd> | |||
<t>A frame was received that was not permitted in the current state or on the | <t anchor='H3_FRAME_UNEXPECTED'>A frame was received that was not pe rmitted in the current state or on the | |||
current stream.</t> | current stream.</t> | |||
</dd> | </dd> | |||
<dt> | <dt><xref format='none' target='H3_FRAME_ERROR'>H3_FRAME_ERROR</xref> | |||
H3_FRAME_ERROR (0x106): </dt> | (0x0106)<iref item='H3_FRAME_ERROR'/>:</dt> | |||
<dd> | <dd> | |||
<t>A frame that fails to satisfy layout requirements or with an inva lid size | <t anchor='H3_FRAME_ERROR'>A frame that fails to satisfy layout requ irements or with an invalid size | |||
was received.</t> | was received.</t> | |||
</dd> | </dd> | |||
<dt> | <dt><xref format='none' target='H3_EXCESSIVE_LOAD'>H3_EXCESSIVE_LOAD</ | |||
H3_EXCESSIVE_LOAD (0x107): </dt> | xref> (0x0107)<iref item='H3_EXCESSIVE_LOAD'/>:</dt> | |||
<dd> | <dd> | |||
<t>The endpoint detected that its peer is exhibiting a behavior that might be | <t anchor='H3_EXCESSIVE_LOAD'>The endpoint detected that its peer is exhibiting a behavior that might be | |||
generating excessive load.</t> | generating excessive load.</t> | |||
</dd> | </dd> | |||
<dt> | <dt><xref format='none' target='H3_ID_ERROR'>H3_ID_ERROR</xref> (0x010 | |||
H3_ID_ERROR (0x108): </dt> | 8)<iref item='H3_ID_ERROR'/>:</dt> | |||
<dd> | <dd> | |||
<t>A Stream ID or Push ID was used incorrectly, such as exceeding a limit, | <t anchor='H3_ID_ERROR'>A stream ID or <xref format='none' target='s erver-push'>push ID</xref><iref item='push ID'/> was used incorrectly, such as e xceeding a limit, | |||
reducing a limit, or being reused.</t> | reducing a limit, or being reused.</t> | |||
</dd> | </dd> | |||
<dt> | <dt><xref format='none' target='H3_SETTINGS_ERROR'>H3_SETTINGS_ERROR</ | |||
H3_SETTINGS_ERROR (0x109): </dt> | xref> (0x0109)<iref item='H3_SETTINGS_ERROR'/>:</dt> | |||
<dd> | <dd> | |||
<t>An endpoint detected an error in the payload of a SETTINGS frame. </t> | <t anchor='H3_SETTINGS_ERROR'>An endpoint detected an error in the p ayload of a <xref format='none' target='frame-settings'>SETTINGS</xref><iref ite m='SETTINGS'/> frame.</t> | |||
</dd> | </dd> | |||
<dt> | <dt><xref format='none' target='H3_MISSING_SETTINGS'>H3_MISSING_SETTIN | |||
H3_MISSING_SETTINGS (0x10a): </dt> | GS</xref> (0x010a)<iref item='H3_MISSING_SETTINGS'/>:</dt> | |||
<dd> | <dd> | |||
<t>No SETTINGS frame was received at the beginning of the control st ream.</t> | <t anchor='H3_MISSING_SETTINGS'>No <xref format='none' target='frame -settings'>SETTINGS</xref><iref item='SETTINGS'/> frame was received at the begi nning of the <xref format='none' target='control-streams'>control stream</xref>< iref item='control stream'/>.</t> | |||
</dd> | </dd> | |||
<dt> | <dt><xref format='none' target='H3_REQUEST_REJECTED'>H3_REQUEST_REJECT | |||
H3_REQUEST_REJECTED (0x10b): </dt> | ED</xref> (0x010b)<iref item='H3_REQUEST_REJECTED'/>:</dt> | |||
<dd> | <dd> | |||
<t>A server rejected a request without performing any application pr ocessing.</t> | <t anchor='H3_REQUEST_REJECTED'>A server rejected a request without performing any application processing.</t> | |||
</dd> | </dd> | |||
<dt> | <dt><xref format='none' target='H3_REQUEST_CANCELLED'>H3_REQUEST_CANCE | |||
H3_REQUEST_CANCELLED (0x10c): </dt> | LLED</xref> (0x010c)<iref item='H3_REQUEST_CANCELLED'/>:</dt> | |||
<dd> | <dd> | |||
<t>The request or its response (including pushed response) is cancel led.</t> | <t anchor='H3_REQUEST_CANCELLED'>The request or its response (includ ing pushed response) is cancelled.</t> | |||
</dd> | </dd> | |||
<dt> | <dt><xref format='none' target='H3_REQUEST_INCOMPLETE'>H3_REQUEST_INCO | |||
H3_REQUEST_INCOMPLETE (0x10d): </dt> | MPLETE</xref> (0x010d)<iref item='H3_REQUEST_INCOMPLETE'/>:</dt> | |||
<dd> | <dd> | |||
<t>The client's stream terminated without containing a fully-formed request.</t> | <t anchor='H3_REQUEST_INCOMPLETE'>The client's stream terminated wit hout containing a fully formed request.</t> | |||
</dd> | </dd> | |||
<dt> | <dt><xref format='none' target='H3_MESSAGE_ERROR'>H3_MESSAGE_ERROR</xr | |||
H3_MESSAGE_ERROR (0x10e): </dt> | ef> (0x010e)<iref item='H3_MESSAGE_ERROR'/>:</dt> | |||
<dd> | <dd> | |||
<t>An HTTP message was malformed and cannot be processed.</t> | <t anchor='H3_MESSAGE_ERROR'>An HTTP message was <xref format='none' target='malformed'>malformed</xref><iref item='malformed'/> and cannot be proce ssed.</t> | |||
</dd> | </dd> | |||
<dt> | <dt><xref format='none' target='H3_CONNECT_ERROR'>H3_CONNECT_ERROR</xr | |||
H3_CONNECT_ERROR (0x10f): </dt> | ef> (0x010f)<iref item='H3_CONNECT_ERROR'/>:</dt> | |||
<dd> | <dd> | |||
<t>The TCP connection established in response to a CONNECT request w as reset or | <t anchor='H3_CONNECT_ERROR'>The TCP connection established in respo nse to a CONNECT request was reset or | |||
abnormally closed.</t> | abnormally closed.</t> | |||
</dd> | </dd> | |||
<dt> | <dt><xref format='none' target='H3_VERSION_FALLBACK'>H3_VERSION_FALLBA | |||
H3_VERSION_FALLBACK (0x110): </dt> | CK</xref> (0x0110)<iref item='H3_VERSION_FALLBACK'/>:</dt> | |||
<dd> | <dd> | |||
<t>The requested operation cannot be served over HTTP/3. The peer s hould | <t anchor='H3_VERSION_FALLBACK'>The requested operation cannot be se rved over HTTP/3. The peer should | |||
retry over HTTP/1.1.</t> | retry over HTTP/1.1.</t> | |||
</dd> | </dd> | |||
</dl> | </dl> | |||
<t>Error codes of the format <tt>0x1f * N + 0x21</tt> for non-negative i | <t>Error codes of the format <tt>0x1f * N + 0x21</tt> for non-negative i | |||
nteger values of N | nteger values of | |||
are reserved to exercise the requirement that unknown error codes be treated as | <tt>N</tt> are reserved to exercise the requirement that unknown error codes be | |||
equivalent to H3_NO_ERROR (<xref target="extensions" format="default"/>). Implem | treated | |||
entations <bcp14>SHOULD</bcp14> select an | as equivalent to <xref format='none' target='H3_NO_ERROR'>H3_NO_ERROR</xref><ire | |||
f item='H3_NO_ERROR'/> (<xref target='extensions'/>). Implementations < | ||||
bcp14>SHOULD</bcp14> | ||||
select an | ||||
error code from this space with some probability when they would have sent | error code from this space with some probability when they would have sent | |||
H3_NO_ERROR.</t> | <xref format='none' target='H3_NO_ERROR'>H3_NO_ERROR</xref><iref item='H3_NO_ERR OR'/>.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="extensions" numbered="true" toc="default"> | <section anchor='extensions'> | |||
<name>Extensions to HTTP/3</name> | <name>Extensions to HTTP/3</name> | |||
<t>HTTP/3 permits extension of the protocol. Within the limitations descr ibed in | <t>HTTP/3 permits extension of the protocol. Within the limitations descr ibed in | |||
this section, protocol extensions can be used to provide additional services or | this section, protocol extensions can be used to provide additional services or | |||
alter any aspect of the protocol. Extensions are effective only within the | alter any aspect of the protocol. Extensions are effective only within the | |||
scope of a single HTTP/3 connection.</t> | scope of a single HTTP/3 connection.</t> | |||
<t>This applies to the protocol elements defined in this document. This d oes not | <t>This applies to the protocol elements defined in this document. This d oes not | |||
affect the existing options for extending HTTP, such as defining new methods, | affect the existing options for extending HTTP, such as defining new methods, | |||
status codes, or fields.</t> | status codes, or fields.</t> | |||
<t>Extensions are permitted to use new frame types (<xref target="frames" | <t>Extensions are permitted to use new frame types (<xref target='frames'/ | |||
format="default"/>), new settings | >), new settings | |||
(<xref target="settings-parameters" format="default"/>), new error codes (<xref | (<xref target='settings-parameters'/>), new error codes (<xref target='errors'/> | |||
target="errors" format="default"/>), or new unidirectional | ), or new unidirectional | |||
stream types (<xref target="unidirectional-streams" format="default"/>). Regist | stream types (<xref target='unidirectional-streams'/>). Registries are establis | |||
ries are established for | hed for | |||
managing these extension points: frame types (<xref target="iana-frames" format= | managing these extension points: frame types (<xref target='iana-frames'/>), set | |||
"default"/>), settings | tings | |||
(<xref target="iana-settings" format="default"/>), error codes (<xref target="ia | (<xref target='iana-settings'/>), error codes (<xref target='iana-error-codes'/> | |||
na-error-codes" format="default"/>), and stream types | ), and stream types | |||
(<xref target="iana-stream-types" format="default"/>).</t> | (<xref target='iana-stream-types'/>).</t> | |||
<t>Implementations <bcp14>MUST</bcp14> ignore unknown or unsupported value | <t>Implementations <bcp14>MUST</bcp14> | |||
s in all extensible | ignore unknown or unsupported values in all extensible | |||
protocol elements. Implementations <bcp14>MUST</bcp14> discard frames and abort | protocol elements. Implementations <bcp14>MUST</bcp14> | |||
reading on | discard data or abort reading on | |||
unidirectional streams that have unknown or unsupported types. This means that | unidirectional streams that have unknown or unsupported types. This means that | |||
any of these extension points can be safely used by extensions without prior | any of these extension points can be safely used by extensions without prior | |||
arrangement or negotiation. However, where a known frame type is required to be | arrangement or negotiation. However, where a known frame type is required to be | |||
in a specific location, such as the SETTINGS frame as the first frame of the | in a specific location, such as the <xref format='none' target='frame-settings'> | |||
control stream (see <xref target="control-streams" format="default"/>), an unkno | SETTINGS</xref><iref item='SETTINGS'/> frame as the first frame of the | |||
wn frame type does not satisfy | <xref format='none' target='control-streams'>control stream</xref><iref item='co | |||
that requirement and <bcp14>SHOULD</bcp14> be treated as an error.</t> | ntrol stream'/> (see <xref target='control-streams'/>), an unknown frame type do | |||
<t>Extensions that could change the semantics of existing protocol compone | es not satisfy | |||
nts <bcp14>MUST</bcp14> | that requirement and <bcp14>SHOULD</bcp14> | |||
be treated as an error.</t> | ||||
<t>Extensions that could change the semantics of existing protocol compone | ||||
nts <bcp14>MUST</bcp14> | ||||
be negotiated before being used. For example, an extension that changes the | be negotiated before being used. For example, an extension that changes the | |||
layout of the HEADERS frame cannot be used until the peer has given a positive | layout of the <xref format='none' target='frame-headers'>HEADERS</xref><iref ite m='HEADERS'/> frame cannot be used until the peer has given a positive | |||
signal that this is acceptable. Coordinating when such a revised layout comes | signal that this is acceptable. Coordinating when such a revised layout comes | |||
into effect could prove complex. As such, allocating new identifiers for | into effect could prove complex. As such, allocating new identifiers for | |||
new definitions of existing protocol elements is likely to be more effective.</t > | new definitions of existing protocol elements is likely to be more effective.</t > | |||
<t>This document does not mandate a specific method for negotiating the us e of an | <t>This document does not mandate a specific method for negotiating the us e of an | |||
extension but notes that a setting (<xref target="settings-parameters" format="d | extension, but it notes that a setting (<xref target='settings-parameters'/>) co | |||
efault"/>) could be used for | uld be used | |||
that purpose. If both peers set a value that indicates willingness to use the | for that purpose. If both peers set a value that indicates willingness to use | |||
extension, then the extension can be used. If a setting is used for extension | the extension, then the extension can be used. If a setting is used for | |||
negotiation, the default value <bcp14>MUST</bcp14> be defined in such a fashion | extension negotiation, the default value <bcp14>MUST</bcp14> | |||
that the | be defined in such a fashion that | |||
extension is disabled if the setting is omitted.</t> | the extension is disabled if the setting is omitted.</t> | |||
</section> | </section> | |||
<section anchor="security-considerations" numbered="true" toc="default"> | <section anchor='security-considerations'> | |||
<name>Security Considerations</name> | <name>Security Considerations</name> | |||
<t>The security considerations of HTTP/3 should be comparable to those of HTTP/2 | <t>The security considerations of HTTP/3 should be comparable to those of HTTP/2 | |||
with TLS. However, many of the considerations from <xref section="10" sectionFo | with TLS. However, many of the considerations from <xref section='10' sectionFo | |||
rmat="of" target="RFC7540" format="default"/> | rmat='of' target='RFC9113'/> | |||
apply to <xref target="RFCYYY1" format="default"/> and are discussed in that doc | apply to <xref target='QUIC-TRANSPORT'/> and are discussed in that document.</t> | |||
ument.</t> | <section anchor='server-authority'> | |||
<section anchor="server-authority" numbered="true" toc="default"> | ||||
<name>Server Authority</name> | <name>Server Authority</name> | |||
<t>HTTP/3 relies on the HTTP definition of authority. The security consi derations | <t>HTTP/3 relies on the HTTP definition of authority. The security consi derations | |||
of establishing authority are discussed in <xref section="17.1" sectionFormat="o f" target="RFCYYY4" format="default"/>.</t> | of establishing authority are discussed in <xref section='17.1' sectionFormat='o f' target='RFC9110'/>.</t> | |||
</section> | </section> | |||
<section anchor="cross-protocol-attacks" numbered="true" toc="default"> | <section anchor='cross-protocol-attacks'> | |||
<name>Cross-Protocol Attacks</name> | <name>Cross-Protocol Attacks</name> | |||
<t>The use of ALPN in the TLS and QUIC handshakes establishes the target | <t>The use of ALPN in the TLS and QUIC handshakes establishes the target | |||
application protocol before application-layer bytes are processed. This ensures | application protocol before application-layer bytes are processed. This ensures | |||
that endpoints have strong assurances that peers are using the same protocol.</t > | that endpoints have strong assurances that peers are using the same protocol.</t > | |||
<t>This does not guarantee protection from all cross-protocol attacks. < xref section="21.5" sectionFormat="of" target="RFCYYY1" format="default"/> descr ibes some ways in which the plaintext of QUIC | <t>This does not guarantee protection from all cross-protocol attacks. < xref section='21.5' sectionFormat='of' target='QUIC-TRANSPORT'/> describes some ways in which the plaintext of QUIC | |||
packets can be used to perform request forgery against endpoints that don't use | packets can be used to perform request forgery against endpoints that don't use | |||
authenticated transports.</t> | authenticated transports.</t> | |||
</section> | </section> | |||
<section anchor="intermediary-encapsulation-attacks" numbered="true" toc=" | <section anchor='intermediary-encapsulation-attacks'> | |||
default"> | <name>Intermediary-Encapsulation Attacks</name> | |||
<name>Intermediary Encapsulation Attacks</name> | ||||
<t>The HTTP/3 field encoding allows the expression of names that are not valid | <t>The HTTP/3 field encoding allows the expression of names that are not valid | |||
field names in the syntax used by HTTP (<xref section="5.1" sectionFormat="of" t | field names in the syntax used by HTTP (<xref section='5.1' sectionFormat='of' t | |||
arget="RFCYYY4" format="default"/>). | arget='RFC9110'/>). Requests or | |||
Requests or responses containing invalid field names <bcp14>MUST</bcp14> be trea | responses containing invalid field names <bcp14>MUST</bcp14> | |||
ted as | be treated as <xref format='none' target='malformed'>malformed</xref><iref item | |||
malformed (<xref target="malformed" format="default"/>). An intermediary theref | ='malformed'/>. | |||
ore cannot translate an HTTP/3 | Therefore, an intermediary cannot translate an HTTP/3 request or response | |||
request or response containing an invalid field name into an HTTP/1.1 message.</ | containing an invalid field name into an HTTP/1.1 message.</t> | |||
t> | ||||
<t>Similarly, HTTP/3 can transport field values that are not valid. Whil e most | <t>Similarly, HTTP/3 can transport field values that are not valid. Whil e most | |||
values that can be encoded will not alter field parsing, carriage return (CR, | values that can be encoded will not alter field parsing, carriage return (ASCII | |||
ASCII 0xd), line feed (LF, ASCII 0xa), and the zero character (NUL, ASCII 0x0) | 0x0d), line feed (ASCII 0x0a), and the null character (ASCII 0x00) might be | |||
might be exploited by an attacker if they are translated verbatim. Any request | exploited by an attacker if they are translated verbatim. Any request or | |||
or response that contains a character not permitted in a field value <bcp14>MUST | response that contains a character not permitted in a field value <bcp1 | |||
</bcp14> be | 4>MUST</bcp14> | |||
treated as malformed (<xref target="malformed" format="default"/>). Valid chara | be | |||
cters are defined by the | treated as <xref format='none' target='malformed'>malformed</xref><iref item='ma | |||
"field-content" ABNF rule in <xref section="5.5" sectionFormat="of" target="RFCY | lformed'/>. Valid characters are defined by the | |||
YY4" format="default"/>.</t> | "field-content" ABNF rule in <xref section='5.5' sectionFormat='of' target='RFC9 | |||
110'/>.</t> | ||||
</section> | </section> | |||
<section anchor="cacheability-of-pushed-responses" numbered="true" toc="de fault"> | <section anchor='cacheability-of-pushed-responses'> | |||
<name>Cacheability of Pushed Responses</name> | <name>Cacheability of Pushed Responses</name> | |||
<t>Pushed responses do not have an explicit request from the client; the request is | <t>Pushed responses do not have an explicit request from the client; the request is | |||
provided by the server in the PUSH_PROMISE frame.</t> | provided by the server in the <xref format='none' target='frame-push-promise'>PU SH_PROMISE</xref><iref item='PUSH_PROMISE'/> frame.</t> | |||
<t>Caching responses that are pushed is possible based on the guidance p rovided by | <t>Caching responses that are pushed is possible based on the guidance p rovided by | |||
the origin server in the Cache-Control header field. However, this can cause | the origin server in the Cache-Control header field. However, this can cause | |||
issues if a single server hosts more than one tenant. For example, a server | issues if a single server hosts more than one tenant. For example, a server | |||
might offer multiple users each a small portion of its URI space.</t> | might offer multiple users each a small portion of its URI space.</t> | |||
<t>Where multiple tenants share space on the same server, that server <b | <t>Where multiple tenants share space on the same server, that server | |||
cp14>MUST</bcp14> ensure | <bcp14>MUST</bcp14> | |||
ensure | ||||
that tenants are not able to push representations of resources that they do not | that tenants are not able to push representations of resources that they do not | |||
have authority over. Failure to enforce this would allow a tenant to provide a | have authority over. Failure to enforce this would allow a tenant to provide a | |||
representation that would be served out of cache, overriding the actual | representation that would be served out of cache, overriding the actual | |||
representation that the authoritative tenant provides.</t> | representation that the authoritative tenant provides.</t> | |||
<t>Clients are required to reject pushed responses for which an origin s erver is | <t>Clients are required to reject pushed responses for which an origin s erver is | |||
not authoritative; see <xref target="server-push" format="default"/>.</t> | not authoritative; see <xref target='server-push'/>.</t> | |||
</section> | </section> | |||
<section anchor="denial-of-service-considerations" numbered="true" toc="de fault"> | <section anchor='denial-of-service-considerations'> | |||
<name>Denial-of-Service Considerations</name> | <name>Denial-of-Service Considerations</name> | |||
<t>An HTTP/3 connection can demand a greater commitment of resources to operate | <t>An HTTP/3 connection can demand a greater commitment of resources to operate | |||
than an HTTP/1.1 or HTTP/2 connection. The use of field compression and flow | than an HTTP/1.1 or HTTP/2 connection. The use of field compression and flow | |||
control depend on a commitment of resources for storing a greater amount of | control depend on a commitment of resources for storing a greater amount of | |||
state. Settings for these features ensure that memory commitments for these | state. Settings for these features ensure that memory commitments for these | |||
features are strictly bounded.</t> | features are strictly bounded.</t> | |||
<t>The number of PUSH_PROMISE frames is constrained in a similar fashion | <t>The number of <xref format='none' target='frame-push-promise'>PUSH_PR | |||
. A client | OMISE</xref><iref item='PUSH_PROMISE'/> frames is constrained in a similar fashi | |||
that accepts server push <bcp14>SHOULD</bcp14> limit the number of Push IDs it i | on. A client | |||
ssues at a | that accepts server push <bcp14>SHOULD</bcp14> | |||
limit the number of push IDs it issues at a | ||||
time.</t> | time.</t> | |||
<t>Processing capacity cannot be guarded as effectively as state capacit y.</t> | <t>Processing capacity cannot be guarded as effectively as state capacit y.</t> | |||
<t>The ability to send undefined protocol elements that the peer is requ ired to | <t>The ability to send undefined protocol elements that the peer is requ ired to | |||
ignore can be abused to cause a peer to expend additional processing time. This | ignore can be abused to cause a peer to expend additional processing time. This | |||
might be done by setting multiple undefined SETTINGS parameters, unknown frame | might be done by setting multiple undefined <xref format='none' target='frame-se ttings'>SETTINGS</xref><iref item='SETTINGS'/> parameters, unknown frame | |||
types, or unknown stream types. Note, however, that some uses are entirely | types, or unknown stream types. Note, however, that some uses are entirely | |||
legitimate, such as optional-to-understand extensions and padding to increase | legitimate, such as optional-to-understand extensions and padding to increase | |||
resistance to traffic analysis.</t> | resistance to traffic analysis.</t> | |||
<t>Compression of field sections also offers some opportunities to waste processing | <t>Compression of field sections also offers some opportunities to waste processing | |||
resources; see <xref section="7" sectionFormat="of" target="RFCYYY2" format="def ault"/> for more details on potential abuses.</t> | resources; see <xref section='7' sectionFormat='of' target='RFC9204'/> for more details on potential abuses.</t> | |||
<t>All these features -- i.e., server push, unknown protocol elements, f ield | <t>All these features -- i.e., server push, unknown protocol elements, f ield | |||
compression -- have legitimate uses. These features become a burden only when | compression -- have legitimate uses. These features become a burden only when | |||
they are used unnecessarily or to excess.</t> | they are used unnecessarily or to excess.</t> | |||
<t>An endpoint that does not monitor such behavior exposes itself to a r isk of | <t>An endpoint that does not monitor such behavior exposes itself to a r isk of | |||
denial-of-service attack. Implementations <bcp14>SHOULD</bcp14> track the use o | denial-of-service attack. Implementations <bcp14>SHOULD</bcp14> | |||
f these | track the use of these | |||
features and set limits on their use. An endpoint <bcp14>MAY</bcp14> treat acti | features and set limits on their use. An endpoint <bcp14>MAY</bcp14> | |||
vity that is | treat activity that is | |||
suspicious as a connection error of type H3_EXCESSIVE_LOAD (<xref target="errors | suspicious as a <xref format='none' target='errors'>connection error</xref><iref | |||
" format="default"/>), but | item='connection error'/> of type <xref format='none' target='H3_EXCESSIVE_LOAD | |||
'>H3_EXCESSIVE_LOAD</xref><iref item='H3_EXCESSIVE_LOAD'/>, but | ||||
false positives will result in disrupting valid connections and requests.</t> | false positives will result in disrupting valid connections and requests.</t> | |||
<section anchor="limits-on-field-section-size" numbered="true" toc="defa ult"> | <section anchor='limits-on-field-section-size'> | |||
<name>Limits on Field Section Size</name> | <name>Limits on Field Section Size</name> | |||
<t>A large field section (<xref target="request-response" format="defa ult"/>) can cause an implementation to | <t>A large field section (<xref target='request-response'/>) can cause an implementation to | |||
commit a large amount of state. Header fields that are critical for routing can | commit a large amount of state. Header fields that are critical for routing can | |||
appear toward the end of a header section, which prevents streaming of the | appear toward the end of a header section, which prevents streaming of the | |||
header section to its ultimate destination. This ordering and other reasons, | header section to its ultimate destination. This ordering and other reasons, | |||
such as ensuring cache correctness, mean that an endpoint likely needs to buffer | such as ensuring cache correctness, mean that an endpoint likely needs to buffer | |||
the entire header section. Since there is no hard limit to the size of a field | the entire header section. Since there is no hard limit to the size of a field | |||
section, some endpoints could be forced to commit a large amount of available | section, some endpoints could be forced to commit a large amount of available | |||
memory for header fields.</t> | memory for header fields.</t> | |||
<t>An endpoint can use the SETTINGS_MAX_FIELD_SECTION_SIZE | <t>An endpoint can use the <xref format='none' target='SETTINGS_MAX_FI | |||
(<xref target="header-size-constraints" format="default"/>) setting to advise pe | ELD_SECTION_SIZE'>SETTINGS_MAX_FIELD_SECTION_SIZE</xref><iref item='SETTINGS_MAX | |||
ers of limits that might apply | _FIELD_SECTION_SIZE'/> | |||
on the size of field sections. This setting is only advisory, so endpoints <bcp1 | (<xref target='header-size-constraints'/>) setting to advise peers of limits tha | |||
4>MAY</bcp14> | t might apply | |||
on the size of field sections. This setting is only advisory, so endpoints | ||||
<bcp14>MAY</bcp14> | ||||
choose to send field sections that exceed this limit and risk having the request | choose to send field sections that exceed this limit and risk having the request | |||
or response being treated as malformed. This setting is specific to an HTTP/3 | or response being treated as <xref format='none' target='malformed'>malformed</x ref><iref item='malformed'/>. This setting is specific to an HTTP/3 | |||
connection, so any request or response could encounter a hop with a lower, | connection, so any request or response could encounter a hop with a lower, | |||
unknown limit. An intermediary can attempt to avoid this problem by passing on | unknown limit. An intermediary can attempt to avoid this problem by passing on | |||
values presented by different peers, but they are not obligated to do so.</t> | values presented by different peers, but they are not obligated to do so.</t> | |||
<t>A server that receives a larger field section than it is willing to handle can | <t>A server that receives a larger field section than it is willing to handle can | |||
send an HTTP 431 (Request Header Fields Too Large) status code (<xref target="RF C6585" format="default"/>). | send an HTTP 431 (Request Header Fields Too Large) status code (<xref target='RF C6585'/>). | |||
A client can discard responses that it cannot process.</t> | A client can discard responses that it cannot process.</t> | |||
</section> | </section> | |||
<section anchor="connect-issues" numbered="true" toc="default"> | <section anchor='connect-issues'> | |||
<name>CONNECT Issues</name> | <name>CONNECT Issues</name> | |||
<t>The CONNECT method can be used to create disproportionate load on a proxy, since | <t>The CONNECT method can be used to create disproportionate load on a proxy, since | |||
stream creation is relatively inexpensive when compared to the creation and | stream creation is relatively inexpensive when compared to the creation and | |||
maintenance of a TCP connection. Therefore, a proxy that supports CONNECT might | maintenance of a TCP connection. Therefore, a proxy that supports CONNECT might | |||
be more conservative in the number of simultaneous requests it accepts.</t> | be more conservative in the number of simultaneous requests it accepts.</t> | |||
<t>A proxy might also maintain some resources for a TCP connection bey ond the | <t>A proxy might also maintain some resources for a TCP connection bey ond the | |||
closing of the stream that carries the CONNECT request, since the outgoing TCP | closing of the stream that carries the CONNECT request, since the outgoing TCP | |||
connection remains in the TIME_WAIT state. To account for this, a proxy might | connection remains in the TIME_WAIT state. To account for this, a proxy might | |||
delay increasing the QUIC stream limits for some time after a TCP connection | delay increasing the QUIC stream limits for some time after a TCP connection | |||
terminates.</t> | terminates.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="use-of-compression" numbered="true" toc="default"> | <section anchor='use-of-compression'> | |||
<name>Use of Compression</name> | <name>Use of Compression</name> | |||
<t>Compression can allow an attacker to recover secret data when it is c ompressed | <t>Compression can allow an attacker to recover secret data when it is c ompressed | |||
in the same context as data under attacker control. HTTP/3 enables compression | in the same context as data under attacker control. HTTP/3 enables compression | |||
of fields (<xref target="header-formatting" format="default"/>); the following c | of fields (<xref target='header-formatting'/>); the following concerns also appl | |||
oncerns also apply to the use | y to the use | |||
of HTTP compressed content-codings; see <xref section="8.4.1" sectionFormat="of" | of HTTP compressed content-codings; see <xref section='8.4.1' sectionFormat='of' | |||
target="RFCYYY4" format="default"/>.</t> | target='RFC9110'/>.</t> | |||
<t>There are demonstrable attacks on compression that exploit the charac teristics | <t>There are demonstrable attacks on compression that exploit the charac teristics | |||
of the web (e.g., <xref target="BREACH" format="default"/>). The attacker induc es multiple requests | of the web (e.g., <xref target='BREACH'/>). The attacker induces multiple reque sts | |||
containing varying plaintext, observing the length of the resulting ciphertext | containing varying plaintext, observing the length of the resulting ciphertext | |||
in each, which reveals a shorter length when a guess about the secret is | in each, which reveals a shorter length when a guess about the secret is | |||
correct.</t> | correct.</t> | |||
<t>Implementations communicating on a secure channel <bcp14>MUST NOT</bc | <t>Implementations communicating on a secure channel <bcp14>MUS | |||
p14> compress content that | T NOT</bcp14> | |||
compress content that | ||||
includes both confidential and attacker-controlled data unless separate | includes both confidential and attacker-controlled data unless separate | |||
compression contexts are used for each source of data. Compression <bcp14>MUST | compression contexts are used for each source of data. Compression <bc | |||
NOT</bcp14> be | p14>MUST NOT</bcp14> | |||
be | ||||
used if the source of data cannot be reliably determined.</t> | used if the source of data cannot be reliably determined.</t> | |||
<t>Further considerations regarding the compression of field sections ar e | <t>Further considerations regarding the compression of field sections ar e | |||
described in <xref target="RFCYYY2" format="default"/>.</t> | described in <xref target='RFC9204'/>.</t> | |||
</section> | </section> | |||
<section anchor="padding-and-traffic-analysis" numbered="true" toc="defaul t"> | <section anchor='padding-and-traffic-analysis'> | |||
<name>Padding and Traffic Analysis</name> | <name>Padding and Traffic Analysis</name> | |||
<t>Padding can be used to obscure the exact size of frame content and is provided | <t>Padding can be used to obscure the exact size of frame content and is provided | |||
to mitigate specific attacks within HTTP, for example, attacks where compressed | to mitigate specific attacks within HTTP, for example, attacks where compressed | |||
content includes both attacker-controlled plaintext and secret data (e.g., | content includes both attacker-controlled plaintext and secret data (e.g., | |||
<xref target="BREACH" format="default"/>).</t> | <xref target='BREACH'/>).</t> | |||
<t>Where HTTP/2 employs PADDING frames and Padding fields in other frame s to make a | <t>Where HTTP/2 employs PADDING frames and Padding fields in other frame s to make a | |||
connection more resistant to traffic analysis, HTTP/3 can either rely on | connection more resistant to traffic analysis, HTTP/3 can either rely on | |||
transport-layer padding or employ the reserved frame and stream types discussed | transport-layer padding or employ the reserved frame and stream types discussed | |||
in <xref target="frame-reserved" format="default"/> and <xref target="stream-gre | in Sections <xref format='counter' target='frame-reserved'/> and <xref format='c | |||
ase" format="default"/>. These methods of padding produce | ounter' target='stream-grease'/>. These methods of | |||
different results in terms of the granularity of padding, how padding is | padding produce different results in terms of the granularity of padding, how | |||
arranged in relation to the information that is being protected, whether padding | padding is arranged in relation to the information that is being protected, | |||
is applied in the case of packet loss, and how an implementation might control | whether padding is applied in the case of packet loss, and how an implementation | |||
padding.</t> | might control padding.</t> | |||
<t>Reserved stream types can be used to give the appearance of sending t raffic even | <t>Reserved stream types can be used to give the appearance of sending t raffic even | |||
when the connection is idle. Because HTTP traffic often occurs in bursts, | when the connection is idle. Because HTTP traffic often occurs in bursts, | |||
apparent traffic can be used to obscure the timing or duration of such bursts, | apparent traffic can be used to obscure the timing or duration of such bursts, | |||
even to the point of appearing to send a constant stream of data. However, as | even to the point of appearing to send a constant stream of data. However, as | |||
such traffic is still flow controlled by the receiver, a failure to promptly | such traffic is still flow controlled by the receiver, a failure to promptly | |||
drain such streams and provide additional flow control credit can limit the | drain such streams and provide additional flow-control credit can limit the | |||
sender's ability to send real traffic.</t> | sender's ability to send real traffic.</t> | |||
<t>To mitigate attacks that rely on compression, disabling or limiting c ompression | <t>To mitigate attacks that rely on compression, disabling or limiting c ompression | |||
might be preferable to padding as a countermeasure.</t> | might be preferable to padding as a countermeasure.</t> | |||
<t>Use of padding can result in less protection than might seem immediat ely | <t>Use of padding can result in less protection than might seem immediat ely | |||
obvious. Redundant padding could even be counterproductive. At best, padding | obvious. Redundant padding could even be counterproductive. At best, padding | |||
only makes it more difficult for an attacker to infer length information by | only makes it more difficult for an attacker to infer length information by | |||
increasing the number of frames an attacker has to observe. Incorrectly | increasing the number of frames an attacker has to observe. Incorrectly | |||
implemented padding schemes can be easily defeated. In particular, randomized | implemented padding schemes can be easily defeated. In particular, randomized | |||
padding with a predictable distribution provides very little protection; | padding with a predictable distribution provides very little protection; | |||
similarly, padding payloads to a fixed size exposes information as payload sizes | similarly, padding payloads to a fixed size exposes information as payload sizes | |||
cross the fixed-sized boundary, which could be possible if an attacker can | cross the fixed-sized boundary, which could be possible if an attacker can | |||
control plaintext.</t> | control plaintext.</t> | |||
</section> | </section> | |||
<section anchor="frame-parsing" numbered="true" toc="default"> | <section anchor='frame-parsing'> | |||
<name>Frame Parsing</name> | <name>Frame Parsing</name> | |||
<t>Several protocol elements contain nested length elements, typically i n the form | <t>Several protocol elements contain nested length elements, typically i n the form | |||
of frames with an explicit length containing variable-length integers. This | of frames with an explicit length containing variable-length integers. This | |||
could pose a security risk to an incautious implementer. An implementation <bcp | could pose a security risk to an incautious implementer. An implementation | |||
14>MUST</bcp14> | <bcp14>MUST</bcp14> | |||
ensure that the length of a frame exactly matches the length of the fields it | ensure that the length of a frame exactly matches the length of the fields it | |||
contains.</t> | contains.</t> | |||
</section> | </section> | |||
<section anchor="early-data" numbered="true" toc="default"> | <section anchor='early-data'> | |||
<name>Early Data</name> | <name>Early Data</name> | |||
<t>The use of 0-RTT with HTTP/3 creates an exposure to replay attack. T he | <t>The use of 0-RTT with HTTP/3 creates an exposure to replay attack. T he | |||
anti-replay mitigations in <xref target="RFC8470" format="default"/> <bcp14>MUST | anti-replay mitigations in <xref target='HTTP-REPLAY'/> <bcp14>MUST</bc | |||
</bcp14> be applied when using | p14> | |||
HTTP/3 with 0-RTT. When applying <xref target="RFC8470" format="default"/> to H | be applied when using | |||
TTP/3, references to the | HTTP/3 with 0-RTT. When applying <xref target='HTTP-REPLAY'/> to HTTP/3, refere | |||
nces to the | ||||
TLS layer refer to the handshake performed within QUIC, while all references to | TLS layer refer to the handshake performed within QUIC, while all references to | |||
application data refer to the contents of streams.</t> | application data refer to the contents of streams.</t> | |||
</section> | </section> | |||
<section anchor="migration" numbered="true" toc="default"> | <section anchor='migration'> | |||
<name>Migration</name> | <name>Migration</name> | |||
<t>Certain HTTP implementations use the client address for logging or | <t>Certain HTTP implementations use the client address for logging or | |||
access-control purposes. Since a QUIC client's address might change during a | access-control purposes. Since a QUIC client's address might change during a | |||
connection (and future versions might support simultaneous use of multiple | connection (and future versions might support simultaneous use of multiple | |||
addresses), such implementations will need to either actively retrieve the | addresses), such implementations will need to either actively retrieve the | |||
client's current address or addresses when they are relevant or explicitly | client's current address or addresses when they are relevant or explicitly | |||
accept that the original address might change.</t> | accept that the original address might change.</t> | |||
</section> | </section> | |||
<section anchor="privacy-considerations" numbered="true" toc="default"> | <section anchor='privacy-considerations'> | |||
<name>Privacy Considerations</name> | <name>Privacy Considerations</name> | |||
<t>Several characteristics of HTTP/3 provide an observer an opportunity to | <t>Several characteristics of HTTP/3 provide an observer an opportunity to | |||
correlate actions of a single client or server over time. These include the | correlate actions of a single client or server over time. These include the | |||
value of settings, the timing of reactions to stimulus, and the handling of any | value of settings, the timing of reactions to stimulus, and the handling of any | |||
features that are controlled by settings.</t> | features that are controlled by settings.</t> | |||
<t>As far as these create observable differences in behavior, they could be used as | <t>As far as these create observable differences in behavior, they could be used as | |||
a basis for fingerprinting a specific client.</t> | a basis for fingerprinting a specific client.</t> | |||
<t>HTTP/3's preference for using a single QUIC connection allows correla tion of a | <t>HTTP/3's preference for using a single QUIC connection allows correla tion of a | |||
user's activity on a site. Reusing connections for different origins allows | user's activity on a site. Reusing connections for different origins allows | |||
for correlation of activity across those origins.</t> | for correlation of activity across those origins.</t> | |||
<t>Several features of QUIC solicit immediate responses and can be used by an | <t>Several features of QUIC solicit immediate responses and can be used by an | |||
endpoint to measure latency to their peer; this might have privacy implications | endpoint to measure latency to their peer; this might have privacy implications | |||
in certain scenarios.</t> | in certain scenarios.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="iana-considerations" numbered="true" toc="default"> | <section anchor='iana-considerations'> | |||
<name>IANA Considerations</name> | <name>IANA Considerations</name> | |||
<t>This document registers a new ALPN protocol ID (<xref target="iana-alpn | <t>This document registers a new ALPN protocol ID (<xref target='iana-alpn | |||
" format="default"/>) and creates new | '/>) and creates new | |||
registries that manage the assignment of codepoints in HTTP/3.</t> | registries that manage the assignment of code points in HTTP/3.</t> | |||
<section anchor="iana-alpn" numbered="true" toc="default"> | <section anchor='iana-alpn'> | |||
<name>Registration of HTTP/3 Identification String</name> | <name>Registration of HTTP/3 Identification String</name> | |||
<t>This document creates a new registration for the identification of | <t>This document creates a new registration for the identification of | |||
HTTP/3 in the "Application Layer Protocol Negotiation (ALPN) | HTTP/3 in the "TLS Application-Layer Protocol Negotiation (ALPN) | |||
Protocol IDs" registry established in <xref target="RFC7301" format="default"/>. | Protocol IDs" registry established in <xref target='RFC7301'/>.</t> | |||
</t> | ||||
<t>The "h3" string identifies HTTP/3:</t> | <t>The "h3" string identifies HTTP/3:</t> | |||
<dl> | <dl> | |||
<dt> | <dt>Protocol:</dt> | |||
Protocol: </dt> | ||||
<dd> | <dd> | |||
<t>HTTP/3</t> | <t>HTTP/3</t> | |||
</dd> | </dd> | |||
<dt> | <dt>Identification Sequence:</dt> | |||
Identification Sequence: </dt> | ||||
<dd> | <dd> | |||
<t>0x68 0x33 ("h3")</t> | <t>0x68 0x33 ("h3")</t> | |||
</dd> | </dd> | |||
<dt> | <dt>Specification:</dt> | |||
Specification: </dt> | ||||
<dd> | <dd> | |||
<t>This document</t> | <t>This document</t> | |||
</dd> | </dd> | |||
</dl> | </dl> | |||
</section> | </section> | |||
<section anchor="iana-policy" numbered="true" toc="default"> | <section anchor='iana-policy'> | |||
<name>New Registries</name> | <name>New Registries</name> | |||
<t>New registries created in this document operate under the QUIC regist ration | <t>New registries created in this document operate under the QUIC regist ration | |||
policy documented in <xref section="22.1" sectionFormat="of" target="RFCYYY1" fo | policy documented in <xref section='22.1' sectionFormat='of' target='QUIC-TRANSP | |||
rmat="default"/>. These registries all | ORT'/>. These registries all | |||
include the common set of fields listed in <xref section="22.1.1" sectionFormat= | include the common set of fields listed in <xref section='22.1.1' sectionFormat= | |||
"of" target="RFCYYY1" format="default"/>. | 'of' target='QUIC-TRANSPORT'/>. | |||
These registries [<bcp14>SHALL</bcp14> be/are] collected under a "Hypertext Tran | These registries are collected under the "Hypertext Transfer Protocol version 3 | |||
sfer Protocol | (HTTP/3)" heading.</t> | |||
version 3 (HTTP/3) Parameters" heading.</t> | <t>The initial allocations in these registries are all assigned permanen | |||
<t>The initial allocations in these registries created in this document | t status | |||
are all | and list a change controller of the IETF and a contact of the HTTP working group | |||
assigned permanent status and list a change controller of the IETF and a contact | (ietf-http-wg@w3.org).</t> | |||
of the HTTP working group (ietf-http-wg@w3.org).</t> | <section anchor='iana-frames'> | |||
<section anchor="iana-frames" numbered="true" toc="default"> | ||||
<name>Frame Types</name> | <name>Frame Types</name> | |||
<t>This document establishes a registry for HTTP/3 frame type codes. T he "HTTP/3 | <t>This document establishes a registry for HTTP/3 frame type codes. T he "HTTP/3 | |||
Frame Type" registry governs a 62-bit space. This registry follows the QUIC | Frame Types" registry governs a 62-bit space. This registry follows the QUIC | |||
registry policy; see <xref target="iana-policy" format="default"/>. Permanent r | registry policy; see <xref target='iana-policy'/>. Permanent registrations in t | |||
egistrations in this registry | his registry | |||
are assigned using the Specification Required policy (<xref target="RFC8126" for | are assigned using the Specification Required policy (<xref target='RFC8126'/>), | |||
mat="default"/>), except for | except for | |||
values between 0x00 and 0x3f (in hexadecimal; inclusive), which are assigned | values between 0x00 and 0x3f (in hexadecimal; inclusive), which are assigned | |||
using Standards Action or IESG Approval as defined in | using Standards Action or IESG Approval as defined in | |||
Sections <xref target="RFC8126" section="4.9" sectionFormat="bare" format="defau lt"/> and <xref target="RFC8126" section="4.10" sectionFormat="bare" format="def ault"/> of <xref target="RFC8126" format="default"/>.</t> | Sections <xref section='4.9' sectionFormat='bare' target='RFC8126'/> and <xref s ection='4.10' sectionFormat='bare' target='RFC8126'/> of <xref target='RFC8126'/ >.</t> | |||
<t>While this registry is separate from the "HTTP/2 Frame Type" regist ry defined in | <t>While this registry is separate from the "HTTP/2 Frame Type" regist ry defined in | |||
<xref target="RFC7540" format="default"/>, it is preferable that the assignments | <xref target='RFC9113'/>, it is preferable that the assignments parallel each ot | |||
parallel each other where the | her where the | |||
code spaces overlap. If an entry is present in only one registry, every effort | code spaces overlap. If an entry is present in only one registry, every effort | |||
<bcp14>SHOULD</bcp14> be made to avoid assigning the corresponding value to an u | <bcp14>SHOULD</bcp14> | |||
nrelated | be made to avoid assigning the corresponding value to an unrelated | |||
operation. Expert reviewers <bcp14>MAY</bcp14> reject unrelated registrations w | operation. Expert reviewers <bcp14>MAY</bcp14> | |||
hich would | reject unrelated registrations that would | |||
conflict with the same value in the corresponding registry.</t> | conflict with the same value in the corresponding registry.</t> | |||
<t>In addition to common fields as described in <xref target="iana-pol | <t>In addition to common fields as described in <xref target='iana-pol | |||
icy" format="default"/>, permanent | icy'/>, permanent | |||
registrations in this registry <bcp14>MUST</bcp14> include the following field:< | registrations in this registry <bcp14>MUST</bcp14> | |||
/t> | include the following field:</t> | |||
<dl> | <dl> | |||
<dt> | <dt>Frame Type:</dt> | |||
Frame Type: </dt> | ||||
<dd> | <dd> | |||
<t>A name or label for the frame type.</t> | <t>A name or label for the frame type.</t> | |||
</dd> | </dd> | |||
</dl> | </dl> | |||
<t>Specifications of frame types <bcp14>MUST</bcp14> include a descrip | <t>Specifications of frame types <bcp14>MUST</bcp14> | |||
tion of the frame layout and | include a description of the frame layout and | |||
its semantics, including any parts of the frame that are conditionally present.< /t> | its semantics, including any parts of the frame that are conditionally present.< /t> | |||
<t>The entries in <xref target="iana-frame-table" format="default"/> a | <t>The entries in <xref target='iana-frame-table'/> are registered by | |||
re registered by this document.</t> | this document.</t> | |||
<table anchor="iana-frame-table" align="center"> | <table anchor='iana-frame-table'> | |||
<name>Initial HTTP/3 Frame Types</name> | <name>Initial HTTP/3 Frame Types</name> | |||
<thead> | <thead> | |||
<tr> | <tr> | |||
<th align="left">Frame Type</th> | <th align='left'>Frame Type</th> | |||
<th align="center">Value</th> | <th align='center'>Value</th> | |||
<th align="left">Specification</th> | <th align='left'>Specification</th> | |||
</tr> | </tr> | |||
</thead> | </thead> | |||
<tbody> | <tbody> | |||
<tr> | <tr> | |||
<td align="left">DATA</td> | <td align='left'><xref format='none' target='frame-data'>DATA</x | |||
<td align="center">0x0</td> | ref><iref item='DATA'/></td> | |||
<td align="left"> | <td align='center'>0x00</td> | |||
<xref target="frame-data" format="default"/></td> | <td align='left'><xref target='frame-data'/></td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">HEADERS</td> | <td align='left'><xref format='none' target='frame-headers'>HEAD | |||
<td align="center">0x1</td> | ERS</xref><iref item='HEADERS'/></td> | |||
<td align="left"> | <td align='center'>0x01</td> | |||
<xref target="frame-headers" format="default"/></td> | <td align='left'><xref target='frame-headers'/></td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">Reserved</td> | <td align='left'>Reserved</td> | |||
<td align="center">0x2</td> | <td align='center'>0x02</td> | |||
<td align="left">N/A</td> | <td align='left'>This document</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">CANCEL_PUSH</td> | <td align='left'><xref format='none' target='frame-cancel-push'> | |||
<td align="center">0x3</td> | CANCEL_PUSH</xref><iref item='CANCEL_PUSH'/></td> | |||
<td align="left"> | <td align='center'>0x03</td> | |||
<xref target="frame-cancel-push" format="default"/></td> | <td align='left'><xref target='frame-cancel-push'/></td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">SETTINGS</td> | <td align='left'><xref format='none' target='frame-settings'>SET | |||
<td align="center">0x4</td> | TINGS</xref><iref item='SETTINGS'/></td> | |||
<td align="left"> | <td align='center'>0x04</td> | |||
<xref target="frame-settings" format="default"/></td> | <td align='left'><xref target='frame-settings'/></td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">PUSH_PROMISE</td> | <td align='left'><xref format='none' target='frame-push-promise' | |||
<td align="center">0x5</td> | >PUSH_PROMISE</xref><iref item='PUSH_PROMISE'/></td> | |||
<td align="left"> | <td align='center'>0x05</td> | |||
<xref target="frame-push-promise" format="default"/></td> | <td align='left'><xref target='frame-push-promise'/></td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">Reserved</td> | <td align='left'>Reserved</td> | |||
<td align="center">0x6</td> | <td align='center'>0x06</td> | |||
<td align="left">N/A</td> | <td align='left'>This document</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">GOAWAY</td> | <td align='left'><xref format='none' target='frame-goaway'>GOAWA | |||
<td align="center">0x7</td> | Y</xref><iref item='GOAWAY'/></td> | |||
<td align="left"> | <td align='center'>0x07</td> | |||
<xref target="frame-goaway" format="default"/></td> | <td align='left'><xref target='frame-goaway'/></td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">Reserved</td> | <td align='left'>Reserved</td> | |||
<td align="center">0x8</td> | <td align='center'>0x08</td> | |||
<td align="left">N/A</td> | <td align='left'>This document</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">Reserved</td> | <td align='left'>Reserved</td> | |||
<td align="center">0x9</td> | <td align='center'>0x09</td> | |||
<td align="left">N/A</td> | <td align='left'>This document</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">MAX_PUSH_ID</td> | <td align='left'><xref format='none' target='frame-max-push-id'> | |||
<td align="center">0xd</td> | MAX_PUSH_ID</xref><iref item='MAX_PUSH_ID'/></td> | |||
<td align="left"> | <td align='center'>0x0d</td> | |||
<xref target="frame-max-push-id" format="default"/></td> | <td align='left'><xref target='frame-max-push-id'/></td> | |||
</tr> | </tr> | |||
</tbody> | </tbody> | |||
</table> | </table> | |||
<t>Each code of the format <tt>0x1f * N + 0x21</tt> for non-negative i | <t>Each code of the format <tt>0x1f * N + 0x21</tt> for non-negative i | |||
nteger values of N | nteger values of <tt>N</tt> | |||
(that is, 0x21, 0x40, ..., through 0x3ffffffffffffffe) <bcp14>MUST NOT</bcp14> b | (that is, 0x21, 0x40, ..., through 0x3ffffffffffffffe) <bcp14>MUST NO | |||
e assigned by | T</bcp14> | |||
IANA and <bcp14>MUST NOT</bcp14> appear in the listing of assigned values.</t> | be assigned by | |||
IANA and <bcp14>MUST NOT</bcp14> | ||||
appear in the listing of assigned values.</t> | ||||
</section> | </section> | |||
<section anchor="iana-settings" numbered="true" toc="default"> | <section anchor='iana-settings'> | |||
<name>Settings Parameters</name> | <name>Settings Parameters</name> | |||
<t>This document establishes a registry for HTTP/3 settings. The "HTT P/3 Settings" | <t>This document establishes a registry for HTTP/3 settings. The "HTT P/3 Settings" | |||
registry governs a 62-bit space. This registry follows the QUIC registry | registry governs a 62-bit space. This registry follows the QUIC registry | |||
policy; see <xref target="iana-policy" format="default"/>. Permanent registrati | policy; see <xref target='iana-policy'/>. Permanent registrations in this regis | |||
ons in this registry are | try are | |||
assigned using the Specification Required policy (<xref target="RFC8126" format= | assigned using the Specification Required policy (<xref target='RFC8126'/>), exc | |||
"default"/>), except for | ept for | |||
values between 0x00 and 0x3f (in hexadecimal; inclusive), which are assigned | values between 0x00 and 0x3f (in hexadecimal; inclusive), which are assigned | |||
using Standards Action or IESG Approval as defined in | using Standards Action or IESG Approval as defined in | |||
Sections <xref target="RFC8126" section="4.9" sectionFormat="bare" format="defau lt"/> and <xref target="RFC8126" section="4.10" sectionFormat="bare" format="def ault"/> of <xref target="RFC8126" format="default"/>.</t> | Sections <xref section='4.9' sectionFormat='bare' target='RFC8126'/> and <xref s ection='4.10' sectionFormat='bare' target='RFC8126'/> of <xref target='RFC8126'/ >.</t> | |||
<t>While this registry is separate from the "HTTP/2 Settings" registry defined in | <t>While this registry is separate from the "HTTP/2 Settings" registry defined in | |||
<xref target="RFC7540" format="default"/>, it is preferable that the assignments | <xref target='RFC9113'/>, it is preferable that the assignments parallel each ot | |||
parallel each other. If an | her. If an | |||
entry is present in only one registry, every effort <bcp14>SHOULD</bcp14> be mad | entry is present in only one registry, every effort <bcp14>SHOULD</bc | |||
e to avoid | p14> | |||
assigning the corresponding value to an unrelated operation. Expert reviewers | be made to avoid | |||
<bcp14>MAY</bcp14> reject unrelated registrations which would conflict with the | assigning the corresponding value to an unrelated operation. Expert reviewers | |||
same value in | <bcp14>MAY</bcp14> | |||
reject unrelated registrations that would conflict with the same value in | ||||
the corresponding registry.</t> | the corresponding registry.</t> | |||
<t>In addition to common fields as described in <xref target="iana-pol | <t>In addition to common fields as described in <xref target='iana-pol | |||
icy" format="default"/>, permanent | icy'/>, permanent | |||
registrations in this registry <bcp14>MUST</bcp14> include the following fields: | registrations in this registry <bcp14>MUST</bcp14> | |||
</t> | include the following fields:</t> | |||
<dl> | <dl> | |||
<dt> | <dt>Setting Name:</dt> | |||
Setting Name: </dt> | ||||
<dd> | <dd> | |||
<t>A symbolic name for the setting. Specifying a setting name is optional.</t> | <t>A symbolic name for the setting. Specifying a setting name is optional.</t> | |||
</dd> | </dd> | |||
<dt> | <dt>Default:</dt> | |||
Default: </dt> | ||||
<dd> | <dd> | |||
<t>The value of the setting unless otherwise indicated. A default | <t>The value of the setting unless otherwise indicated. A default | |||
<bcp14>SHOULD</bcp14> be the | <bcp14>SHOULD</bcp14> | |||
be the | ||||
most restrictive possible value.</t> | most restrictive possible value.</t> | |||
</dd> | </dd> | |||
</dl> | </dl> | |||
<t>The entries in <xref target="iana-setting-table" format="default"/> | <t>The entries in <xref target='iana-setting-table'/> are registered b | |||
are registered by this document.</t> | y this document.</t> | |||
<table anchor="iana-setting-table" align="center"> | <table anchor='iana-setting-table'> | |||
<name>Initial HTTP/3 Settings</name> | <name>Initial HTTP/3 Settings</name> | |||
<thead> | <thead> | |||
<tr> | <tr> | |||
<th align="left">Setting Name</th> | <th align='left'>Setting Name</th> | |||
<th align="center">Value</th> | <th align='center'>Value</th> | |||
<th align="left">Specification</th> | <th align='left'>Specification</th> | |||
<th align="left">Default</th> | <th align='left'>Default</th> | |||
</tr> | </tr> | |||
</thead> | </thead> | |||
<tbody> | <tbody> | |||
<tr> | <tr> | |||
<td align="left">Reserved</td> | <td align='left'>Reserved</td> | |||
<td align="center">0x0</td> | <td align='center'>0x00</td> | |||
<td align="left">N/A</td> | <td align='left'>This document</td> | |||
<td align="left">N/A</td> | <td align='left'>N/A</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">Reserved</td> | <td align='left'>Reserved</td> | |||
<td align="center">0x2</td> | <td align='center'>0x02</td> | |||
<td align="left">N/A</td> | <td align='left'>This document</td> | |||
<td align="left">N/A</td> | <td align='left'>N/A</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">Reserved</td> | <td align='left'>Reserved</td> | |||
<td align="center">0x3</td> | <td align='center'>0x03</td> | |||
<td align="left">N/A</td> | <td align='left'>This document</td> | |||
<td align="left">N/A</td> | <td align='left'>N/A</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">Reserved</td> | <td align='left'>Reserved</td> | |||
<td align="center">0x4</td> | <td align='center'>0x04</td> | |||
<td align="left">N/A</td> | <td align='left'>This document</td> | |||
<td align="left">N/A</td> | <td align='left'>N/A</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">Reserved</td> | <td align='left'>Reserved</td> | |||
<td align="center">0x5</td> | <td align='center'>0x05</td> | |||
<td align="left">N/A</td> | <td align='left'>This document</td> | |||
<td align="left">N/A</td> | <td align='left'>N/A</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">MAX_FIELD_SECTION_SIZE</td> | <td align='left'>MAX_FIELD_SECTION_SIZE</td> | |||
<td align="center">0x6</td> | <td align='center'>0x06</td> | |||
<td align="left"> | <td align='left'><xref target='settings-parameters'/></td> | |||
<xref target="settings-parameters" format="default"/></td> | <td align='left'>Unlimited</td> | |||
<td align="left">Unlimited</td> | ||||
</tr> | </tr> | |||
</tbody> | </tbody> | |||
</table> | </table> | |||
<t>Each code of the format <tt>0x1f * N + 0x21</tt> for non-negative i | <t>For formatting reasons, setting names can be abbreviated by removin | |||
nteger values of N | g the | |||
(that is, 0x21, 0x40, ..., through 0x3ffffffffffffffe) <bcp14>MUST NOT</bcp14> b | 'SETTINGS_' prefix.</t> | |||
e assigned by | <t>Each code of the format <tt>0x1f * N + 0x21</tt> for non-negative i | |||
IANA and <bcp14>MUST NOT</bcp14> appear in the listing of assigned values.</t> | nteger values of <tt>N</tt> | |||
(that is, 0x21, 0x40, ..., through 0x3ffffffffffffffe) <bcp14>MUST NO | ||||
T</bcp14> | ||||
be assigned by | ||||
IANA and <bcp14>MUST NOT</bcp14> | ||||
appear in the listing of assigned values.</t> | ||||
</section> | </section> | |||
<section anchor="iana-error-codes" numbered="true" toc="default"> | <section anchor='iana-error-codes'> | |||
<name>Error Codes</name> | <name>Error Codes</name> | |||
<t>This document establishes a registry for HTTP/3 error codes. The "H TTP/3 Error | <t>This document establishes a registry for HTTP/3 error codes. The "H TTP/3 Error | |||
Code" registry manages a 62-bit space. This registry follows the QUIC registry | Codes" registry manages a 62-bit space. This registry follows the QUIC registry | |||
policy; see <xref target="iana-policy" format="default"/>. Permanent registrati | policy; see <xref target='iana-policy'/>. Permanent registrations in this regis | |||
ons in this registry are | try are | |||
assigned using the Specification Required policy (<xref target="RFC8126" format= | assigned using the Specification Required policy (<xref target='RFC8126'/>), exc | |||
"default"/>), except for | ept for | |||
values between 0x00 and 0x3f (in hexadecimal; inclusive), which are assigned | values between 0x00 and 0x3f (in hexadecimal; inclusive), which are assigned | |||
using Standards Action or IESG Approval as defined in | using Standards Action or IESG Approval as defined in | |||
Sections <xref target="RFC8126" section="4.9" sectionFormat="bare" format="defau lt"/> and <xref target="RFC8126" section="4.10" sectionFormat="bare" format="def ault"/> of <xref target="RFC8126" format="default"/>.</t> | Sections <xref section='4.9' sectionFormat='bare' target='RFC8126'/> and <xref s ection='4.10' sectionFormat='bare' target='RFC8126'/> of <xref target='RFC8126'/ >.</t> | |||
<t>Registrations for error codes are required to include a description of the error | <t>Registrations for error codes are required to include a description of the error | |||
code. An expert reviewer is advised to examine new registrations for possible | code. An expert reviewer is advised to examine new registrations for possible | |||
duplication with existing error codes. Use of existing registrations is to be | duplication with existing error codes. Use of existing registrations is to be | |||
encouraged, but not mandated. Use of values that are registered in the "HTTP/2 | encouraged, but not mandated. Use of values that are registered in the "HTTP/2 | |||
Error Code" registry is discouraged, and expert reviewers <bcp14>MAY</bcp14> rej | Error Code" registry is discouraged, and expert reviewers <bcp14>MAY< | |||
ect such | /bcp14> | |||
reject such | ||||
registrations.</t> | registrations.</t> | |||
<t>In addition to common fields as described in <xref target="iana-pol | <t>In addition to common fields as described in <xref target='iana-pol | |||
icy" format="default"/>, this registry | icy'/>, this registry | |||
includes two additional fields. Permanent registrations in this registry <bcp14 | includes two additional fields. Permanent registrations in this registry | |||
>MUST</bcp14> | <bcp14>MUST</bcp14> | |||
include the following field:</t> | include the following field:</t> | |||
<dl> | <dl> | |||
<dt> | <dt>Name:</dt> | |||
Name: </dt> | ||||
<dd> | <dd> | |||
<t>A name for the error code.</t> | <t>A name for the error code.</t> | |||
</dd> | </dd> | |||
<dt> | <dt>Description:</dt> | |||
Description: </dt> | ||||
<dd> | <dd> | |||
<t>A brief description of the error code semantics.</t> | <t>A brief description of the error code semantics.</t> | |||
</dd> | </dd> | |||
</dl> | </dl> | |||
<t>The entries in <xref target="iana-error-table" format="default"/> a re registered by this document. These | <t>The entries in <xref target='iana-error-table'/> are registered by this document. These | |||
error codes were selected from the range that operates on a Specification | error codes were selected from the range that operates on a Specification | |||
Required policy to avoid collisions with HTTP/2 error codes.</t> | Required policy to avoid collisions with HTTP/2 error codes.</t> | |||
<table anchor="iana-error-table" align="center"> | <table anchor='iana-error-table'> | |||
<name>Initial HTTP/3 Error Codes</name> | <name>Initial HTTP/3 Error Codes</name> | |||
<thead> | <thead> | |||
<tr> | <tr> | |||
<th align="left">Name</th> | <th align='left'>Name</th> | |||
<th align="left">Value</th> | <th align='left'>Value</th> | |||
<th align="left">Description</th> | <th align='left'>Description</th> | |||
<th align="left">Specification</th> | <th align='left'>Specification</th> | |||
</tr> | </tr> | |||
</thead> | </thead> | |||
<tbody> | <tbody> | |||
<tr> | <tr> | |||
<td align="left">H3_NO_ERROR</td> | <td align='left'><xref format='none' target='H3_NO_ERROR'>H3_NO_ | |||
<td align="left">0x100</td> | ERROR</xref><iref item='H3_NO_ERROR'/></td> | |||
<td align="left">No error</td> | <td align='left'>0x0100</td> | |||
<td align="left"> | <td align='left'>No error</td> | |||
<xref target="http-error-codes" format="default"/></td> | <td align='left'><xref target='http-error-codes'/></td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">H3_GENERAL_PROTOCOL_ERROR</td> | <td align='left'><xref format='none' target='H3_GENERAL_PROTOCOL | |||
<td align="left">0x101</td> | _ERROR'>H3_GENERAL_PROTOCOL_ERROR</xref><iref item='H3_GENERAL_PROTOCOL_ERROR'/> | |||
<td align="left">General protocol error</td> | </td> | |||
<td align="left"> | <td align='left'>0x0101</td> | |||
<xref target="http-error-codes" format="default"/></td> | <td align='left'>General protocol error</td> | |||
<td align='left'><xref target='http-error-codes'/></td> | ||||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">H3_INTERNAL_ERROR</td> | <td align='left'><xref format='none' target='H3_INTERNAL_ERROR'> | |||
<td align="left">0x102</td> | H3_INTERNAL_ERROR</xref><iref item='H3_INTERNAL_ERROR'/></td> | |||
<td align="left">Internal error</td> | <td align='left'>0x0102</td> | |||
<td align="left"> | <td align='left'>Internal error</td> | |||
<xref target="http-error-codes" format="default"/></td> | <td align='left'><xref target='http-error-codes'/></td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">H3_STREAM_CREATION_ERROR</td> | <td align='left'><xref format='none' target='H3_STREAM_CREATION_ | |||
<td align="left">0x103</td> | ERROR'>H3_STREAM_CREATION_ERROR</xref><iref item='H3_STREAM_CREATION_ERROR'/></t | |||
<td align="left">Stream creation error</td> | d> | |||
<td align="left"> | <td align='left'>0x0103</td> | |||
<xref target="http-error-codes" format="default"/></td> | <td align='left'>Stream creation error</td> | |||
<td align='left'><xref target='http-error-codes'/></td> | ||||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">H3_CLOSED_CRITICAL_STREAM</td> | <td align='left'><xref format='none' target='H3_CLOSED_CRITICAL_ | |||
<td align="left">0x104</td> | STREAM'>H3_CLOSED_CRITICAL_STREAM</xref><iref item='H3_CLOSED_CRITICAL_STREAM'/> | |||
<td align="left">Critical stream was closed</td> | </td> | |||
<td align="left"> | <td align='left'>0x0104</td> | |||
<xref target="http-error-codes" format="default"/></td> | <td align='left'>Critical stream was closed</td> | |||
<td align='left'><xref target='http-error-codes'/></td> | ||||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">H3_FRAME_UNEXPECTED</td> | <td align='left'><xref format='none' target='H3_FRAME_UNEXPECTED | |||
<td align="left">0x105</td> | '>H3_FRAME_UNEXPECTED</xref><iref item='H3_FRAME_UNEXPECTED'/></td> | |||
<td align="left">Frame not permitted in the current state</td> | <td align='left'>0x0105</td> | |||
<td align="left"> | <td align='left'>Frame not permitted in the current state</td> | |||
<xref target="http-error-codes" format="default"/></td> | <td align='left'><xref target='http-error-codes'/></td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">H3_FRAME_ERROR</td> | <td align='left'><xref format='none' target='H3_FRAME_ERROR'>H3_ | |||
<td align="left">0x106</td> | FRAME_ERROR</xref><iref item='H3_FRAME_ERROR'/></td> | |||
<td align="left">Frame violated layout or size rules</td> | <td align='left'>0x0106</td> | |||
<td align="left"> | <td align='left'>Frame violated layout or size rules</td> | |||
<xref target="http-error-codes" format="default"/></td> | <td align='left'><xref target='http-error-codes'/></td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">H3_EXCESSIVE_LOAD</td> | <td align='left'><xref format='none' target='H3_EXCESSIVE_LOAD'> | |||
<td align="left">0x107</td> | H3_EXCESSIVE_LOAD</xref><iref item='H3_EXCESSIVE_LOAD'/></td> | |||
<td align="left">Peer generating excessive load</td> | <td align='left'>0x0107</td> | |||
<td align="left"> | <td align='left'>Peer generating excessive load</td> | |||
<xref target="http-error-codes" format="default"/></td> | <td align='left'><xref target='http-error-codes'/></td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">H3_ID_ERROR</td> | <td align='left'><xref format='none' target='H3_ID_ERROR'>H3_ID_ | |||
<td align="left">0x108</td> | ERROR</xref><iref item='H3_ID_ERROR'/></td> | |||
<td align="left">An identifier was used incorrectly</td> | <td align='left'>0x0108</td> | |||
<td align="left"> | <td align='left'>An identifier was used incorrectly</td> | |||
<xref target="http-error-codes" format="default"/></td> | <td align='left'><xref target='http-error-codes'/></td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">H3_SETTINGS_ERROR</td> | <td align='left'><xref format='none' target='H3_SETTINGS_ERROR'> | |||
<td align="left">0x109</td> | H3_SETTINGS_ERROR</xref><iref item='H3_SETTINGS_ERROR'/></td> | |||
<td align="left">SETTINGS frame contained invalid values</td> | <td align='left'>0x0109</td> | |||
<td align="left"> | <td align='left'><xref format='none' target='frame-settings'>SET | |||
<xref target="http-error-codes" format="default"/></td> | TINGS</xref><iref item='SETTINGS'/> frame contained invalid values</td> | |||
<td align='left'><xref target='http-error-codes'/></td> | ||||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">H3_MISSING_SETTINGS</td> | <td align='left'><xref format='none' target='H3_MISSING_SETTINGS | |||
<td align="left">0x10a</td> | '>H3_MISSING_SETTINGS</xref><iref item='H3_MISSING_SETTINGS'/></td> | |||
<td align="left">No SETTINGS frame received</td> | <td align='left'>0x010a</td> | |||
<td align="left"> | <td align='left'>No <xref format='none' target='frame-settings'> | |||
<xref target="http-error-codes" format="default"/></td> | SETTINGS</xref><iref item='SETTINGS'/> frame received</td> | |||
<td align='left'><xref target='http-error-codes'/></td> | ||||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">H3_REQUEST_REJECTED</td> | <td align='left'><xref format='none' target='H3_REQUEST_REJECTED | |||
<td align="left">0x10b</td> | '>H3_REQUEST_REJECTED</xref><iref item='H3_REQUEST_REJECTED'/></td> | |||
<td align="left">Request not processed</td> | <td align='left'>0x010b</td> | |||
<td align="left"> | <td align='left'>Request not processed</td> | |||
<xref target="http-error-codes" format="default"/></td> | <td align='left'><xref target='http-error-codes'/></td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">H3_REQUEST_CANCELLED</td> | <td align='left'><xref format='none' target='H3_REQUEST_CANCELLE | |||
<td align="left">0x10c</td> | D'>H3_REQUEST_CANCELLED</xref><iref item='H3_REQUEST_CANCELLED'/></td> | |||
<td align="left">Data no longer needed</td> | <td align='left'>0x010c</td> | |||
<td align="left"> | <td align='left'>Data no longer needed</td> | |||
<xref target="http-error-codes" format="default"/></td> | <td align='left'><xref target='http-error-codes'/></td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">H3_REQUEST_INCOMPLETE</td> | <td align='left'><xref format='none' target='H3_REQUEST_INCOMPLE | |||
<td align="left">0x10d</td> | TE'>H3_REQUEST_INCOMPLETE</xref><iref item='H3_REQUEST_INCOMPLETE'/></td> | |||
<td align="left">Stream terminated early</td> | <td align='left'>0x010d</td> | |||
<td align="left"> | <td align='left'>Stream terminated early</td> | |||
<xref target="http-error-codes" format="default"/></td> | <td align='left'><xref target='http-error-codes'/></td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">H3_MESSAGE_ERROR</td> | <td align='left'><xref format='none' target='H3_MESSAGE_ERROR'>H | |||
<td align="left">0x10e</td> | 3_MESSAGE_ERROR</xref><iref item='H3_MESSAGE_ERROR'/></td> | |||
<td align="left">Malformed message</td> | <td align='left'>0x010e</td> | |||
<td align="left"> | <td align='left'>Malformed message</td> | |||
<xref target="http-error-codes" format="default"/></td> | <td align='left'><xref target='http-error-codes'/></td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">H3_CONNECT_ERROR</td> | <td align='left'><xref format='none' target='H3_CONNECT_ERROR'>H | |||
<td align="left">0x10f</td> | 3_CONNECT_ERROR</xref><iref item='H3_CONNECT_ERROR'/></td> | |||
<td align="left">TCP reset or error on CONNECT request</td> | <td align='left'>0x010f</td> | |||
<td align="left"> | <td align='left'>TCP reset or error on CONNECT request</td> | |||
<xref target="http-error-codes" format="default"/></td> | <td align='left'><xref target='http-error-codes'/></td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">H3_VERSION_FALLBACK</td> | <td align='left'><xref format='none' target='H3_VERSION_FALLBACK | |||
<td align="left">0x110</td> | '>H3_VERSION_FALLBACK</xref><iref item='H3_VERSION_FALLBACK'/></td> | |||
<td align="left">Retry over HTTP/1.1</td> | <td align='left'>0x0110</td> | |||
<td align="left"> | <td align='left'>Retry over HTTP/1.1</td> | |||
<xref target="http-error-codes" format="default"/></td> | <td align='left'><xref target='http-error-codes'/></td> | |||
</tr> | </tr> | |||
</tbody> | </tbody> | |||
</table> | </table> | |||
<t>Each code of the format <tt>0x1f * N + 0x21</tt> for non-negative i | <t>Each code of the format <tt>0x1f * N + 0x21</tt> for non-negative i | |||
nteger values of N | nteger values of <tt>N</tt> | |||
(that is, 0x21, 0x40, ..., through 0x3ffffffffffffffe) <bcp14>MUST NOT</bcp14> b | (that is, 0x21, 0x40, ..., through 0x3ffffffffffffffe) <bcp14>MUST NO | |||
e assigned by | T</bcp14> | |||
IANA and <bcp14>MUST NOT</bcp14> appear in the listing of assigned values.</t> | be assigned by | |||
IANA and <bcp14>MUST NOT</bcp14> | ||||
appear in the listing of assigned values.</t> | ||||
</section> | </section> | |||
<section anchor="iana-stream-types" numbered="true" toc="default"> | <section anchor='iana-stream-types'> | |||
<name>Stream Types</name> | <name>Stream Types</name> | |||
<t>This document establishes a registry for HTTP/3 unidirectional stre am types. The | <t>This document establishes a registry for HTTP/3 unidirectional stre am types. The | |||
"HTTP/3 Stream Type" registry governs a 62-bit space. This registry follows the | "HTTP/3 Stream Types" registry governs a 62-bit space. This registry follows | |||
QUIC registry policy; see <xref target="iana-policy" format="default"/>. Perman | the QUIC registry policy; see <xref target='iana-policy'/>. Permanent registrat | |||
ent registrations in this | ions in this | |||
registry are assigned using the Specification Required policy (<xref target="RFC | registry are assigned using the Specification Required policy (<xref target='RFC | |||
8126" format="default"/>), | 8126'/>), | |||
except for values between 0x00 and 0x3f (in hexadecimal; inclusive), which are | except for values between 0x00 and 0x3f (in hexadecimal; inclusive), which are | |||
assigned using Standards Action or IESG Approval as defined in Sections <xref ta | assigned using Standards Action or IESG Approval as defined in Sections <xref se | |||
rget="RFC8126" section="4.9" sectionFormat="bare" format="default"/> and <xref t | ction='4.9' sectionFormat='bare' target='RFC8126'/> and <xref section='4.10' sec | |||
arget="RFC8126" section="4.10" sectionFormat="bare" format="default"/> of <xref | tionFormat='bare' target='RFC8126'/> of <xref target='RFC8126'/>.</t> | |||
target="RFC8126" format="default"/>.</t> | <t>In addition to common fields as described in <xref target='iana-pol | |||
<t>In addition to common fields as described in <xref target="iana-pol | icy'/>, permanent | |||
icy" format="default"/>, permanent | registrations in this registry <bcp14>MUST</bcp14> | |||
registrations in this registry <bcp14>MUST</bcp14> include the following fields: | include the following fields:</t> | |||
</t> | ||||
<dl> | <dl> | |||
<dt> | <dt>Stream Type:</dt> | |||
Stream Type: </dt> | ||||
<dd> | <dd> | |||
<t>A name or label for the stream type.</t> | <t>A name or label for the stream type.</t> | |||
</dd> | </dd> | |||
<dt> | <dt>Sender:</dt> | |||
Sender: </dt> | ||||
<dd> | <dd> | |||
<t>Which endpoint on an HTTP/3 connection may initiate a stream of this type. | <t>Which endpoint on an HTTP/3 connection may initiate a stream of this type. | |||
Values are "Client", "Server", or "Both".</t> | Values are "Client", "Server", or "Both".</t> | |||
</dd> | </dd> | |||
</dl> | </dl> | |||
<t>Specifications for permanent registrations <bcp14>MUST</bcp14> incl | <t>Specifications for permanent registrations <bcp14>MUST</ | |||
ude a description of the | bcp14> | |||
include a description of the | ||||
stream type, including the layout and semantics of the stream contents.</t> | stream type, including the layout and semantics of the stream contents.</t> | |||
<t>The entries in the following table are registered by this document. | <t>The entries in <xref target='iana-stream-type-table'/> are register | |||
</t> | ed by this document.</t> | |||
<table align="center"> | <table anchor='iana-stream-type-table'> | |||
<name>Initial Stream Types</name> | ||||
<thead> | <thead> | |||
<tr> | <tr> | |||
<th align="left">Stream Type</th> | <th align='left'>Stream Type</th> | |||
<th align="center">Value</th> | <th align='center'>Value</th> | |||
<th align="left">Specification</th> | <th align='left'>Specification</th> | |||
<th align="left">Sender</th> | <th align='left'>Sender</th> | |||
</tr> | </tr> | |||
</thead> | </thead> | |||
<tbody> | <tbody> | |||
<tr> | <tr> | |||
<td align="left">Control Stream</td> | <td align='left'>Control Stream</td> | |||
<td align="center">0x00</td> | <td align='center'>0x00</td> | |||
<td align="left"> | <td align='left'><xref target='control-streams'/></td> | |||
<xref target="control-streams" format="default"/></td> | <td align='left'>Both</td> | |||
<td align="left">Both</td> | ||||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">Push Stream</td> | <td align='left'>Push Stream</td> | |||
<td align="center">0x01</td> | <td align='center'>0x01</td> | |||
<td align="left"> | <td align='left'><xref target='server-push'/></td> | |||
<xref target="server-push" format="default"/></td> | <td align='left'>Server</td> | |||
<td align="left">Server</td> | ||||
</tr> | </tr> | |||
</tbody> | </tbody> | |||
</table> | </table> | |||
<t>Each code of the format <tt>0x1f * N + 0x21</tt> for non-negative i | <t>Each code of the format <tt>0x1f * N + 0x21</tt> for non-negative i | |||
nteger values of N | nteger values of <tt>N</tt> | |||
(that is, 0x21, 0x40, ..., through 0x3ffffffffffffffe) <bcp14>MUST NOT</bcp14> b | (that is, 0x21, 0x40, ..., through 0x3ffffffffffffffe) <bcp14>MUST NO | |||
e assigned by | T</bcp14> | |||
IANA and <bcp14>MUST NOT</bcp14> appear in the listing of assigned values.</t> | be assigned by | |||
IANA and <bcp14>MUST NOT</bcp14> | ||||
appear in the listing of assigned values.</t> | ||||
</section> | </section> | |||
</section> | </section> | |||
</section> | </section> | |||
</middle> | </middle> | |||
<back> | <back> | |||
<displayreference target='RFC9204' to='QPACK'/> | ||||
<displayreference target="RFCYYY1" to="QUIC-TRANSPORT"/> | <displayreference target='RFC9110' to='HTTP'/> | |||
<displayreference target="RFCYYY2" to="QPACK"/> | <displayreference target='RFC9111' to='HTTP-CACHING'/> | |||
<displayreference target="RFC3986" to="URI"/> | <displayreference target='RFC9112' to='HTTP/1.1'/> | |||
<displayreference target="RFCYYY3" to="CACHING"/> | <displayreference target='RFC9113' to='HTTP/2'/> | |||
<displayreference target="RFCYYY4" to="SEMANTICS"/> | ||||
<displayreference target="RFC7838" to="ALTSVC"/> | ||||
<displayreference target="RFC8470" to="HTTP-REPLAY"/> | ||||
<displayreference target="I-D.ietf-httpbis-messaging" to="HTTP11"/> | ||||
<displayreference target="RFC7540" to="HTTP2"/> | ||||
<displayreference target="RFC8446" to="TLS13"/> | ||||
<displayreference target="RFC7413" to="TFO"/> | ||||
<displayreference target="RFC7541" to="HPACK"/> | ||||
<displayreference target="RFC8499" to="DNS-TERMS"/> | ||||
<references> | <references> | |||
<name>References</name> | <name>References</name> | |||
<references> | <references> | |||
<name>Normative References</name> | <name>Normative References</name> | |||
<reference anchor='RFC9204' target='https://www.rfc-editor.org/info/rfc9 | ||||
<!-- [rfced] [QUIC-TRANSPORT] [I-D.ietf-quic-transport] in RFC-EDITOR state as o | 204'> | |||
f 03/25/21; companion document RFC YYY1 --> | <front> | |||
<title>QPACK: Field Compression for HTTP/3</title> | ||||
<reference anchor='RFCYYY1'> | <author fullname='Charles 'Buck' Krasic' initials='C.' sur | |||
<front> | name='Krasic'> | |||
<title>QUIC: A UDP-Based Multiplexed and Secure Transport</title> | <organization>Google, Inc</organization> | |||
</author> | ||||
<author initials='J' surname='Iyengar' fullname='Jana Iyengar'> | <author fullname='Mike Bishop' initials='M.' surname='Bishop'> | |||
<organization /> | <organization>Akamai Technologies</organization> | |||
</author> | </author> | |||
<author fullname='Alan Frindell' initials='A.' role='editor' surname | ||||
<author initials='M' surname='Thomson' fullname='Martin Thomson'> | ='Frindell'> | |||
<organization /> | <organization>Facebook</organization> | |||
</author> | </author> | |||
<date month='May' year='2022'/> | ||||
<date month='January' day='14' year='2021' /> | </front> | |||
<seriesInfo name='RFC' value='9204'/> | ||||
<abstract><t>This document defines the core of the QUIC transport protocol. QUI | <seriesInfo name='DOI' value='10.17487/RFC9204'/> | |||
C provides applications with flow-controlled streams for structured communicatio | </reference> | |||
n, low-latency connection establishment, and network path migration. QUIC inclu | <reference anchor='RFC9110' target='https://www.rfc-editor.org/info/rfc9 | |||
des security measures that ensure confidentiality, integrity, and availability i | 110'> | |||
n a range of deployment circumstances. Accompanying documents describe the inte | <front> | |||
gration of TLS for key negotiation, loss detection, and an exemplary congestion | <title>HTTP Semantics</title> | |||
control algorithm. DO NOT DEPLOY THIS VERSION OF QUIC DO NOT DEPLOY THIS VERSI | <author fullname='Roy T. Fielding' initials='R.' role='editor' surna | |||
ON OF QUIC UNTIL IT IS IN AN RFC. This version is still a work in progress. Fo | me='Fielding'> | |||
r trial deployments, please use earlier versions. Note to Readers Discussion o | <organization>Adobe</organization> | |||
f this draft takes place on the QUIC working group mailing list (quic@ietf.org ( | </author> | |||
mailto:quic@ietf.org)), which is archived at https://mailarchive.ietf.org/arch/s | <author fullname='Mark Nottingham' initials='M.' role='editor' surna | |||
earch/?email_list=quic Working Group information can be found at https://github | me='Nottingham'> | |||
.com/quicwg; source code and issues list for this draft can be found at https:// | <organization>Fastly</organization> | |||
github.com/quicwg/base-drafts/labels/-transport.</t></abstract> | </author> | |||
<author fullname='Julian Reschke' initials='J.' role='editor' surnam | ||||
</front> | e='Reschke'> | |||
<seriesInfo name="RFC" value="YYY1"/> | <organization>greenbytes</organization> | |||
<seriesInfo name="DOI" value="10.17487/RFCYYY1"/> | </author> | |||
</reference> | <date month='May' year='2022'/> | |||
</front> | ||||
<!-- [rfced] [QPACK] [I-D.ietf-quic-qpack] in MISSREF state as of 03/25/21; comp | <seriesInfo name='STD' value='97'/> | |||
anion document RFC YYY2 --> | <seriesInfo name='RFC' value='9110'/> | |||
<seriesInfo name='DOI' value='10.17487/RFC9110'/> | ||||
<reference anchor='RFCYYY2'> | </reference> | |||
<front> | <reference anchor='RFC9111' target='https://www.rfc-editor.org/info/rfc9 | |||
<title>QPACK: Header Compression for HTTP/3</title> | 111'> | |||
<front> | ||||
<author initials='C' surname='Krasic' fullname='Charles Krasic'> | <title>HTTP Caching</title> | |||
<organization /> | <author fullname='Roy T. Fielding' initials='R.' role='editor' surna | |||
</author> | me='Fielding'> | |||
<organization>Adobe</organization> | ||||
<author initials='M' surname='Bishop' fullname='Mike Bishop'> | </author> | |||
<organization /> | <author fullname='Mark Nottingham' initials='M.' role='editor' surna | |||
</author> | me='Nottingham'> | |||
<organization>Fastly</organization> | ||||
<author initials='A' surname='Frindell' fullname='Alan Frindell'> | </author> | |||
<organization /> | <author fullname='Julian Reschke' initials='J.' role='editor' surnam | |||
</author> | e='Reschke'> | |||
<organization>greenbytes</organization> | ||||
<date month='December' day='15' year='2020' /> | </author> | |||
<date month='May' year='2022'/> | ||||
<abstract><t>This specification defines QPACK, a compression format for efficien | </front> | |||
tly representing HTTP fields, to be used in HTTP/3. This is a variation of HPAC | <seriesInfo name='STD' value='98'/> | |||
K compression that seeks to reduce head-of-line blocking.</t></abstract> | <seriesInfo name='RFC' value='9111'/> | |||
<seriesInfo name='DOI' value='10.17487/RFC9111'/> | ||||
</front> | </reference> | |||
<seriesInfo name="RFC" value="YYY2"/> | <reference anchor='URI' target='https://www.rfc-editor.org/info/rfc3986' | |||
<seriesInfo name="DOI" value="10.17487/RFCYYY2"/> | > | |||
</reference> | <front> | |||
<title>Uniform Resource Identifier (URI): Generic Syntax</title> | ||||
<!-- [rfced] [CACHING] [I-D.ietf-httpbis-cache] IESG state I-D Exists; companion | <author fullname='T. Berners-Lee' initials='T.' surname='Berners-Lee | |||
document RFC YYY3 --> | '> | |||
<organization/> | ||||
<reference anchor='RFCYYY3'> | </author> | |||
<front> | <author fullname='R. Fielding' initials='R.' surname='Fielding'> | |||
<title>HTTP Caching</title> | <organization/> | |||
</author> | ||||
<author initials='R' surname='Fielding' fullname='Roy Fielding'> | <author fullname='L. Masinter' initials='L.' surname='Masinter'> | |||
<organization /> | <organization/> | |||
</author> | </author> | |||
<date month='January' year='2005'/> | ||||
<author initials='M' surname='Nottingham' fullname='Mark Nottingham'> | <abstract> | |||
<organization /> | <t>A Uniform Resource Identifier (URI) is a compact sequence of ch | |||
</author> | aracters that identifies an abstract or physical resource. This specification d | |||
efines the generic URI syntax and a process for resolving URI references that mi | ||||
<author initials='J' surname='Reschke' fullname='Julian Reschke'> | ght be in relative form, along with guidelines and security considerations for t | |||
<organization /> | he use of URIs on the Internet. The URI syntax defines a grammar that is a supe | |||
</author> | rset of all valid URIs, allowing an implementation to parse the common component | |||
s of a URI reference without knowing the scheme-specific requirements of every p | ||||
<date month='January' day='12' year='2021' /> | ossible identifier. This specification does not define a generative grammar for | |||
URIs; that task is performed by the individual specifications of each URI schem | ||||
<abstract><t>The Hypertext Transfer Protocol (HTTP) is a stateless application- | e. [STANDARDS-TRACK]</t> | |||
level protocol for distributed, collaborative, hypertext information systems. T | </abstract> | |||
his document defines HTTP caches and the associated header fields that control c | </front> | |||
ache behavior or indicate cacheable response messages. This document obsoletes | <seriesInfo name='STD' value='66'/> | |||
RFC 7234.</t></abstract> | <seriesInfo name='RFC' value='3986'/> | |||
<seriesInfo name='DOI' value='10.17487/RFC3986'/> | ||||
</front> | </reference> | |||
<seriesInfo name="RFC" value="YYY3"/> | <reference anchor='QUIC-TRANSPORT' target='https://www.rfc-editor.org/in | |||
<seriesInfo name="DOI" value="10.17487/RFCYYY3"/> | fo/rfc9000'> | |||
</reference> | <front> | |||
<title>QUIC: A UDP-Based Multiplexed and Secure Transport</title> | ||||
<!-- [rfced] [SEMANTICS] [I-D.ietf-httpbis-semantics] IESG state I-D Exists; com | <author fullname='J. Iyengar' initials='J.' role='editor' surname='I | |||
panion document RFC YYY4 --> | yengar'> | |||
<organization/> | ||||
<reference anchor='RFCYYY4'> | </author> | |||
<front> | <author fullname='M. Thomson' initials='M.' role='editor' surname='T | |||
<title>HTTP Semantics</title> | homson'> | |||
<organization/> | ||||
<author initials='R' surname='Fielding' fullname='Roy Fielding'> | </author> | |||
<organization /> | <date month='May' year='2021'/> | |||
</author> | <abstract> | |||
<t>This document defines the core of the QUIC transport protocol. | ||||
<author initials='M' surname='Nottingham' fullname='Mark Nottingham'> | QUIC provides applications with flow-controlled streams for structured communic | |||
<organization /> | ation, low-latency connection establishment, and network path migration. QUIC in | |||
</author> | cludes security measures that ensure confidentiality, integrity, and availabilit | |||
y in a range of deployment circumstances. Accompanying documents describe the i | ||||
<author initials='J' surname='Reschke' fullname='Julian Reschke'> | ntegration of TLS for key negotiation, loss detection, and an exemplary congesti | |||
<organization /> | on control algorithm.</t> | |||
</author> | </abstract> | |||
</front> | ||||
<date month='January' day='12' year='2021' /> | <seriesInfo name='RFC' value='9000'/> | |||
<seriesInfo name='DOI' value='10.17487/RFC9000'/> | ||||
<abstract><t>The Hypertext Transfer Protocol (HTTP) is a stateless application- | </reference> | |||
level protocol for distributed, collaborative, hypertext information systems. T | <reference anchor='RFC2119' target='https://www.rfc-editor.org/info/rfc2 | |||
his document describes the overall architecture of HTTP, establishes common term | 119'> | |||
inology, and defines aspects of the protocol that are shared by all versions. I | <front> | |||
n this definition are core protocol elements, extensibility mechanisms, and the | <title>Key words for use in RFCs to Indicate Requirement Levels</tit | |||
"http" and "https" Uniform Resource Identifier (URI) schemes. This document obs | le> | |||
oletes RFC 2818, RFC 7231, RFC 7232, RFC 7233, RFC 7235, RFC 7538, RFC 7615, RFC | <author fullname='S. Bradner' initials='S.' surname='Bradner'> | |||
7694, and portions of RFC 7230.</t></abstract> | <organization/> | |||
</author> | ||||
</front> | <date month='March' year='1997'/> | |||
<seriesInfo name="RFC" value="YYY4"/> | <abstract> | |||
<seriesInfo name="DOI" value="10.17487/RFCYYY4"/> | <t>In many standards track documents several words are used to sig | |||
</reference> | nify the requirements in the specification. These words are often capitalized. | |||
This document defines these words as they should be interpreted in IETF document | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3986. | s. This document specifies an Internet Best Current Practices for the Internet | |||
xml"/> | Community, and requests discussion and suggestions for improvements.</t> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2119. | </abstract> | |||
xml"/> | </front> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8174. | <seriesInfo name='BCP' value='14'/> | |||
xml"/> | <seriesInfo name='RFC' value='2119'/> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7301. | <seriesInfo name='DOI' value='10.17487/RFC2119'/> | |||
xml"/> | </reference> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7838. | <reference anchor='RFC8174' target='https://www.rfc-editor.org/info/rfc8 | |||
xml"/> | 174'> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6066. | <front> | |||
xml"/> | <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</ti | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6265. | tle> | |||
xml"/> | <author fullname='B. Leiba' initials='B.' surname='Leiba'> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.0793. | <organization/> | |||
xml"/> | </author> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8470. | <date month='May' year='2017'/> | |||
xml"/> | <abstract> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8126. | <t>RFC 2119 specifies common key words that may be used in protoco | |||
xml"/> | l specifications. This document aims to reduce the ambiguity by clarifying tha | |||
t only UPPERCASE usage of the key words have the defined special meanings.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name='BCP' value='14'/> | ||||
<seriesInfo name='RFC' value='8174'/> | ||||
<seriesInfo name='DOI' value='10.17487/RFC8174'/> | ||||
</reference> | ||||
<reference anchor='RFC7301' target='https://www.rfc-editor.org/info/rfc7 | ||||
301'> | ||||
<front> | ||||
<title>Transport Layer Security (TLS) Application-Layer Protocol Neg | ||||
otiation Extension</title> | ||||
<author fullname='S. Friedl' initials='S.' surname='Friedl'> | ||||
<organization/> | ||||
</author> | ||||
<author fullname='A. Popov' initials='A.' surname='Popov'> | ||||
<organization/> | ||||
</author> | ||||
<author fullname='A. Langley' initials='A.' surname='Langley'> | ||||
<organization/> | ||||
</author> | ||||
<author fullname='E. Stephan' initials='E.' surname='Stephan'> | ||||
<organization/> | ||||
</author> | ||||
<date month='July' year='2014'/> | ||||
<abstract> | ||||
<t>This document describes a Transport Layer Security (TLS) extens | ||||
ion for application-layer protocol negotiation within the TLS handshake. For ins | ||||
tances in which multiple application protocols are supported on the same TCP or | ||||
UDP port, this extension allows the application layer to negotiate which protoco | ||||
l will be used within the TLS connection.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name='RFC' value='7301'/> | ||||
<seriesInfo name='DOI' value='10.17487/RFC7301'/> | ||||
</reference> | ||||
<reference anchor='ALTSVC' target='https://www.rfc-editor.org/info/rfc78 | ||||
38'> | ||||
<front> | ||||
<title>HTTP Alternative Services</title> | ||||
<author fullname='M. Nottingham' initials='M.' surname='Nottingham'> | ||||
<organization/> | ||||
</author> | ||||
<author fullname='P. McManus' initials='P.' surname='McManus'> | ||||
<organization/> | ||||
</author> | ||||
<author fullname='J. Reschke' initials='J.' surname='Reschke'> | ||||
<organization/> | ||||
</author> | ||||
<date month='April' year='2016'/> | ||||
<abstract> | ||||
<t>This document specifies "Alternative Services" for HTTP, which | ||||
allow an origin's resources to be authoritatively available at a separate networ | ||||
k location, possibly accessed with a different protocol configuration.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name='RFC' value='7838'/> | ||||
<seriesInfo name='DOI' value='10.17487/RFC7838'/> | ||||
</reference> | ||||
<reference anchor='RFC6066' target='https://www.rfc-editor.org/info/rfc6 | ||||
066'> | ||||
<front> | ||||
<title>Transport Layer Security (TLS) Extensions: Extension Definiti | ||||
ons</title> | ||||
<author fullname='D. Eastlake 3rd' initials='D.' surname='Eastlake 3 | ||||
rd'> | ||||
<organization/> | ||||
</author> | ||||
<date month='January' year='2011'/> | ||||
<abstract> | ||||
<t>This document provides specifications for existing TLS extensio | ||||
ns. It is a companion document for RFC 5246, "The Transport Layer Security (TLS | ||||
) Protocol Version 1.2". The extensions specified are server_name, max_fragment | ||||
_length, client_certificate_url, trusted_ca_keys, truncated_hmac, and status_req | ||||
uest. [STANDARDS-TRACK]</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name='RFC' value='6066'/> | ||||
<seriesInfo name='DOI' value='10.17487/RFC6066'/> | ||||
</reference> | ||||
<reference anchor='COOKIES' target='https://www.rfc-editor.org/info/rfc6 | ||||
265'> | ||||
<front> | ||||
<title>HTTP State Management Mechanism</title> | ||||
<author fullname='A. Barth' initials='A.' surname='Barth'> | ||||
<organization/> | ||||
</author> | ||||
<date month='April' year='2011'/> | ||||
<abstract> | ||||
<t>This document defines the HTTP Cookie and Set-Cookie header fie | ||||
lds. These header fields can be used by HTTP servers to store state (called cook | ||||
ies) at HTTP user agents, letting the servers maintain a stateful session over t | ||||
he mostly stateless HTTP protocol. Although cookies have many historical infeli | ||||
cities that degrade their security and privacy, the Cookie and Set-Cookie header | ||||
fields are widely used on the Internet. This document obsoletes RFC 2965. [ST | ||||
ANDARDS-TRACK]</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name='RFC' value='6265'/> | ||||
<seriesInfo name='DOI' value='10.17487/RFC6265'/> | ||||
</reference> | ||||
<reference anchor='RFC0793' target='https://www.rfc-editor.org/info/rfc7 | ||||
93'> | ||||
<front> | ||||
<title>Transmission Control Protocol</title> | ||||
<author fullname='J. Postel' initials='J.' surname='Postel'> | ||||
<organization/> | ||||
</author> | ||||
<date month='September' year='1981'/> | ||||
</front> | ||||
<seriesInfo name='STD' value='7'/> | ||||
<seriesInfo name='RFC' value='793'/> | ||||
<seriesInfo name='DOI' value='10.17487/RFC0793'/> | ||||
</reference> | ||||
<reference anchor='HTTP-REPLAY' target='https://www.rfc-editor.org/info/ | ||||
rfc8470'> | ||||
<front> | ||||
<title>Using Early Data in HTTP</title> | ||||
<author fullname='M. Thomson' initials='M.' surname='Thomson'> | ||||
<organization/> | ||||
</author> | ||||
<author fullname='M. Nottingham' initials='M.' surname='Nottingham'> | ||||
<organization/> | ||||
</author> | ||||
<author fullname='W. Tarreau' initials='W.' surname='Tarreau'> | ||||
<organization/> | ||||
</author> | ||||
<date month='September' year='2018'/> | ||||
<abstract> | ||||
<t>Using TLS early data creates an exposure to the possibility of | ||||
a replay attack. This document defines mechanisms that allow clients to communi | ||||
cate with servers about HTTP requests that are sent in early data. Techniques a | ||||
re described that use these mechanisms to mitigate the risk of replay.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name='RFC' value='8470'/> | ||||
<seriesInfo name='DOI' value='10.17487/RFC8470'/> | ||||
</reference> | ||||
<reference anchor='RFC8126' target='https://www.rfc-editor.org/info/rfc8 | ||||
126'> | ||||
<front> | ||||
<title>Guidelines for Writing an IANA Considerations Section in RFCs | ||||
</title> | ||||
<author fullname='M. Cotton' initials='M.' surname='Cotton'> | ||||
<organization/> | ||||
</author> | ||||
<author fullname='B. Leiba' initials='B.' surname='Leiba'> | ||||
<organization/> | ||||
</author> | ||||
<author fullname='T. Narten' initials='T.' surname='Narten'> | ||||
<organization/> | ||||
</author> | ||||
<date month='June' year='2017'/> | ||||
<abstract> | ||||
<t>Many protocols make use of points of extensibility that use con | ||||
stants to identify various protocol parameters. To ensure that the values in th | ||||
ese fields do not have conflicting uses and to promote interoperability, their a | ||||
llocations are often coordinated by a central record keeper. For IETF protocols | ||||
, that role is filled by the Internet Assigned Numbers Authority (IANA).</t> | ||||
<t>To make assignments in a given registry prudently, guidance des | ||||
cribing the conditions under which new values should be assigned, as well as whe | ||||
n and how modifications to existing values can be made, is needed. This documen | ||||
t defines a framework for the documentation of these guidelines by specification | ||||
authors, in order to assure that the provided guidance for the IANA Considerati | ||||
ons is clear and addresses the various issues that are likely in the operation o | ||||
f a registry.</t> | ||||
<t>This is the third edition of this document; it obsoletes RFC 52 | ||||
26.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name='BCP' value='26'/> | ||||
<seriesInfo name='RFC' value='8126'/> | ||||
<seriesInfo name='DOI' value='10.17487/RFC8126'/> | ||||
</reference> | ||||
</references> | </references> | |||
<references> | <references> | |||
<name>Informative References</name> | <name>Informative References</name> | |||
<reference anchor='RFC9112' target='https://www.rfc-editor.org/info/rfc9 | ||||
<!-- [rfced] [BREACH] The URL below is correct --> | 112'> | |||
<front> | ||||
<reference anchor="BREACH" target="http://breachattack.com/resources/BRE | <title>HTTP/1.1</title> | |||
ACH%20-%20SSL,%20gone%20in%2030%20seconds.pdf"> | <author fullname='Roy T. Fielding' initials='R.' role='editor' surna | |||
me='Fielding'> | ||||
<organization>Adobe</organization> | ||||
</author> | ||||
<author fullname='Mark Nottingham' initials='M.' role='editor' surna | ||||
me='Nottingham'> | ||||
<organization>Fastly</organization> | ||||
</author> | ||||
<author fullname='Julian Reschke' initials='J.' role='editor' surnam | ||||
e='Reschke'> | ||||
<organization>greenbytes</organization> | ||||
</author> | ||||
<date month='May' year='2022'/> | ||||
</front> | ||||
<seriesInfo name='STD' value='99'/> | ||||
<seriesInfo name='RFC' value='9112'/> | ||||
<seriesInfo name='DOI' value='10.17487/RFC9112'/> | ||||
</reference> | ||||
<reference anchor='RFC9113' target='https://www.rfc-editor.org/info/rfc9 | ||||
113'> | ||||
<front> | ||||
<title>HTTP/2</title> | ||||
<author fullname='Martin Thomson' initials='M.' role='editor' surnam | ||||
e='Thomson'> | ||||
<organization>Mozilla</organization> | ||||
</author> | ||||
<author fullname='Cory Benfield' initials='C.' role='editor' surname | ||||
='Benfield'> | ||||
<organization>Apple Inc.</organization> | ||||
</author> | ||||
<date month='May' year='2022'/> | ||||
</front> | ||||
<seriesInfo name='RFC' value='9113'/> | ||||
<seriesInfo name='DOI' value='10.17487/RFC9113'/> | ||||
</reference> | ||||
<reference anchor='BREACH' target='http://breachattack.com/resources/BRE | ||||
ACH%20-%20SSL,%20gone%20in%2030%20seconds.pdf'> | ||||
<front> | <front> | |||
<title>BREACH: Reviving the CRIME Attack</title> | <title>BREACH: Reviving the CRIME Attack</title> | |||
<author initials="Y." surname="Gluck"> | <author initials='Y.' surname='Gluck'> | |||
<organization/> | <organization/> | |||
</author> | </author> | |||
<author initials="N." surname="Harris"> | <author initials='N.' surname='Harris'> | |||
<organization/> | <organization/> | |||
</author> | </author> | |||
<author initials="A." surname="Prado"> | <author initials='A.' surname='Prado'> | |||
<organization/> | <organization/> | |||
</author> | </author> | |||
<date year="2013" month="July"/> | <date month='July' year='2013'/> | |||
</front> | </front> | |||
</reference> | </reference> | |||
<reference anchor='TLS' target='https://www.rfc-editor.org/info/rfc8446' | ||||
<!-- [rfced] [HTTP11] [I-D.ietf-httpbis-messaging] IESG state I-D Exists --> | > | |||
<front> | ||||
<xi:include href="https://datatracker.ietf.org/doc/bibxml3/reference.I-D.ietf-ht | <title>The Transport Layer Security (TLS) Protocol Version 1.3</titl | |||
tpbis-messaging.xml"/> | e> | |||
<author fullname='E. Rescorla' initials='E.' surname='Rescorla'> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7540. | <organization/> | |||
xml"/> | </author> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8446. | <date month='August' year='2018'/> | |||
xml"/> | <abstract> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7413. | <t>This document specifies version 1.3 of the Transport Layer Secu | |||
xml"/> | rity (TLS) protocol. TLS allows client/server applications to communicate over | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7541. | the Internet in a way that is designed to prevent eavesdropping, tampering, and | |||
xml"/> | message forgery.</t> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8164. | <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 50 | |||
xml"/> | 77, 5246, and 6961. This document also specifies new requirements for TLS 1.2 i | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8499. | mplementations.</t> | |||
xml"/> | </abstract> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6585. | </front> | |||
xml"/> | <seriesInfo name='RFC' value='8446'/> | |||
<seriesInfo name='DOI' value='10.17487/RFC8446'/> | ||||
</reference> | ||||
<reference anchor='TFO' target='https://www.rfc-editor.org/info/rfc7413' | ||||
> | ||||
<front> | ||||
<title>TCP Fast Open</title> | ||||
<author fullname='Y. Cheng' initials='Y.' surname='Cheng'> | ||||
<organization/> | ||||
</author> | ||||
<author fullname='J. Chu' initials='J.' surname='Chu'> | ||||
<organization/> | ||||
</author> | ||||
<author fullname='S. Radhakrishnan' initials='S.' surname='Radhakris | ||||
hnan'> | ||||
<organization/> | ||||
</author> | ||||
<author fullname='A. Jain' initials='A.' surname='Jain'> | ||||
<organization/> | ||||
</author> | ||||
<date month='December' year='2014'/> | ||||
<abstract> | ||||
<t>This document describes an experimental TCP mechanism called TC | ||||
P Fast Open (TFO). TFO allows data to be carried in the SYN and SYN-ACK packets | ||||
and consumed by the receiving end during the initial connection handshake, and | ||||
saves up to one full round-trip time (RTT) compared to the standard TCP, which r | ||||
equires a three-way handshake (3WHS) to complete before data can be exchanged. | ||||
However, TFO deviates from the standard TCP semantics, since the data in the SYN | ||||
could be replayed to an application in some rare circumstances. Applications s | ||||
hould not use TFO unless they can tolerate this issue, as detailed in the Applic | ||||
ability section.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name='RFC' value='7413'/> | ||||
<seriesInfo name='DOI' value='10.17487/RFC7413'/> | ||||
</reference> | ||||
<reference anchor='HPACK' target='https://www.rfc-editor.org/info/rfc754 | ||||
1'> | ||||
<front> | ||||
<title>HPACK: Header Compression for HTTP/2</title> | ||||
<author fullname='R. Peon' initials='R.' surname='Peon'> | ||||
<organization/> | ||||
</author> | ||||
<author fullname='H. Ruellan' initials='H.' surname='Ruellan'> | ||||
<organization/> | ||||
</author> | ||||
<date month='May' year='2015'/> | ||||
<abstract> | ||||
<t>This specification defines HPACK, a compression format for effi | ||||
ciently representing HTTP header fields, to be used in HTTP/2.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name='RFC' value='7541'/> | ||||
<seriesInfo name='DOI' value='10.17487/RFC7541'/> | ||||
</reference> | ||||
<reference anchor='RFC8164' target='https://www.rfc-editor.org/info/rfc8 | ||||
164'> | ||||
<front> | ||||
<title>Opportunistic Security for HTTP/2</title> | ||||
<author fullname='M. Nottingham' initials='M.' surname='Nottingham'> | ||||
<organization/> | ||||
</author> | ||||
<author fullname='M. Thomson' initials='M.' surname='Thomson'> | ||||
<organization/> | ||||
</author> | ||||
<date month='May' year='2017'/> | ||||
<abstract> | ||||
<t>This document describes how "http" URIs can be accessed using T | ||||
ransport Layer Security (TLS) and HTTP/2 to mitigate pervasive monitoring attack | ||||
s. This mechanism not a replacement for "https" URIs; it is vulnerable to activ | ||||
e attacks.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name='RFC' value='8164'/> | ||||
<seriesInfo name='DOI' value='10.17487/RFC8164'/> | ||||
</reference> | ||||
<reference anchor='DNS-TERMS' target='https://www.rfc-editor.org/info/rf | ||||
c8499'> | ||||
<front> | ||||
<title>DNS Terminology</title> | ||||
<author fullname='P. Hoffman' initials='P.' surname='Hoffman'> | ||||
<organization/> | ||||
</author> | ||||
<author fullname='A. Sullivan' initials='A.' surname='Sullivan'> | ||||
<organization/> | ||||
</author> | ||||
<author fullname='K. Fujiwara' initials='K.' surname='Fujiwara'> | ||||
<organization/> | ||||
</author> | ||||
<date month='January' year='2019'/> | ||||
<abstract> | ||||
<t>The Domain Name System (DNS) is defined in literally dozens of | ||||
different RFCs. The terminology used by implementers and developers of DNS prot | ||||
ocols, and by operators of DNS systems, has sometimes changed in the decades sin | ||||
ce the DNS was first defined. This document gives current definitions for many | ||||
of the terms used in the DNS in a single document.</t> | ||||
<t>This document obsoletes RFC 7719 and updates RFC 2308.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name='BCP' value='219'/> | ||||
<seriesInfo name='RFC' value='8499'/> | ||||
<seriesInfo name='DOI' value='10.17487/RFC8499'/> | ||||
</reference> | ||||
<reference anchor='RFC6585' target='https://www.rfc-editor.org/info/rfc6 | ||||
585'> | ||||
<front> | ||||
<title>Additional HTTP Status Codes</title> | ||||
<author fullname='M. Nottingham' initials='M.' surname='Nottingham'> | ||||
<organization/> | ||||
</author> | ||||
<author fullname='R. Fielding' initials='R.' surname='Fielding'> | ||||
<organization/> | ||||
</author> | ||||
<date month='April' year='2012'/> | ||||
<abstract> | ||||
<t>This document specifies additional HyperText Transfer Protocol | ||||
(HTTP) status codes for a variety of common situations. [STANDARDS-TRACK]</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name='RFC' value='6585'/> | ||||
<seriesInfo name='DOI' value='10.17487/RFC6585'/> | ||||
</reference> | ||||
</references> | </references> | |||
</references> | </references> | |||
<section anchor="h2-considerations" numbered="true" toc="default"> | <section anchor='h2-considerations'> | |||
<name>Considerations for Transitioning from HTTP/2</name> | <name>Considerations for Transitioning from HTTP/2</name> | |||
<t>HTTP/3 is strongly informed by HTTP/2, and bears many similarities. Th is | <t>HTTP/3 is strongly informed by HTTP/2, and it bears many similarities. This | |||
section describes the approach taken to design HTTP/3, points out important | section describes the approach taken to design HTTP/3, points out important | |||
differences from HTTP/2, and describes how to map HTTP/2 extensions into HTTP/3. </t> | differences from HTTP/2, and describes how to map HTTP/2 extensions into HTTP/3. </t> | |||
<t>HTTP/3 begins from the premise that similarity to HTTP/2 is preferable, but not | <t>HTTP/3 begins from the premise that similarity to HTTP/2 is preferable, but not | |||
a hard requirement. HTTP/3 departs from HTTP/2 where QUIC differs from TCP, | a hard requirement. HTTP/3 departs from HTTP/2 where QUIC differs from TCP, | |||
either to take advantage of QUIC features (like streams) or to accommodate | either to take advantage of QUIC features (like streams) or to accommodate | |||
important shortcomings (such as a lack of total ordering). These differences | important shortcomings (such as a lack of total ordering). While HTTP/3 is | |||
make HTTP/3 similar to HTTP/2 in key aspects, such as the relationship of | similar to HTTP/2 in key aspects, such as the relationship of requests and | |||
requests and responses to streams. However, the details of the HTTP/3 design are | responses to streams, the details of the HTTP/3 design are substantially | |||
substantially different from HTTP/2.</t> | different from HTTP/2.</t> | |||
<t>Some important departures are noted in this section.</t> | <t>Some important departures are noted in this section.</t> | |||
<section anchor="h2-streams" numbered="true" toc="default"> | <section anchor='h2-streams'> | |||
<name>Streams</name> | <name>Streams</name> | |||
<t>HTTP/3 permits use of a larger number of streams (2<sup>62</sup>-1) t han HTTP/2. | <t>HTTP/3 permits use of a larger number of streams (2<sup>62</sup>-1) t han HTTP/2. | |||
The same considerations about exhaustion of stream identifier space apply, | The same considerations about exhaustion of stream identifier space apply, | |||
though the space is significantly larger such that it is likely that other | though the space is significantly larger such that it is likely that other | |||
limits in QUIC are reached first, such as the limit on the connection flow | limits in QUIC are reached first, such as the limit on the connection | |||
control window.</t> | flow-control window.</t> | |||
<t>In contrast to HTTP/2, stream concurrency in HTTP/3 is managed by QUI C. QUIC | <t>In contrast to HTTP/2, stream concurrency in HTTP/3 is managed by QUI C. QUIC | |||
considers a stream closed when all data has been received and sent data has been | considers a stream closed when all data has been received and sent data has been | |||
acknowledged by the peer. HTTP/2 considers a stream closed when the frame | acknowledged by the peer. HTTP/2 considers a stream closed when the frame | |||
containing the END_STREAM bit has been committed to the transport. As a result, | containing the END_STREAM bit has been committed to the transport. As a result, | |||
the stream for an equivalent exchange could remain "active" for a longer period | the stream for an equivalent exchange could remain "active" for a longer period | |||
of time. HTTP/3 servers might choose to permit a larger number of concurrent | of time. HTTP/3 servers might choose to permit a larger number of concurrent | |||
client-initiated bidirectional streams to achieve equivalent concurrency to | client-initiated bidirectional streams to achieve equivalent concurrency to | |||
HTTP/2, depending on the expected usage patterns.</t> | HTTP/2, depending on the expected usage patterns.</t> | |||
<t>In HTTP/2, only request and response bodies (the frame payload of DAT A frames) | <t>In HTTP/2, only request and response bodies (the frame payload of <xr ef format='none' target='frame-data'>DATA</xref><iref item='DATA'/> frames) | |||
are subject to flow control. All HTTP/3 frames are sent on QUIC streams, so all | are subject to flow control. All HTTP/3 frames are sent on QUIC streams, so all | |||
frames on all streams are flow-controlled in HTTP/3.</t> | frames on all streams are flow controlled in HTTP/3.</t> | |||
<t>Due to the presence of other unidirectional stream types, HTTP/3 does not rely | <t>Due to the presence of other unidirectional stream types, HTTP/3 does not rely | |||
exclusively on the number of concurrent unidirectional streams to control the | exclusively on the number of concurrent unidirectional streams to control the | |||
number of concurrent in-flight pushes. Instead, HTTP/3 clients use the | number of concurrent in-flight pushes. Instead, HTTP/3 clients use the | |||
MAX_PUSH_ID frame to control the number of pushes received from an HTTP/3 | <xref format='none' target='frame-max-push-id'>MAX_PUSH_ID</xref><iref item='MAX _PUSH_ID'/> frame to control the number of pushes received from an HTTP/3 | |||
server.</t> | server.</t> | |||
</section> | </section> | |||
<section anchor="h2-frames" numbered="true" toc="default"> | <section anchor='h2-frames'> | |||
<name>HTTP Frame Types</name> | <name>HTTP Frame Types</name> | |||
<t>Many framing concepts from HTTP/2 can be elided on QUIC, because the transport | <t>Many framing concepts from HTTP/2 can be elided on QUIC, because the transport | |||
deals with them. Because frames are already on a stream, they can omit the | deals with them. Because frames are already on a stream, they can omit the | |||
stream number. Because frames do not block multiplexing (QUIC's multiplexing | stream number. Because frames do not block multiplexing (QUIC's multiplexing | |||
occurs below this layer), the support for variable-maximum-length packets can be | occurs below this layer), the support for variable-maximum-length packets can be | |||
removed. Because stream termination is handled by QUIC, an END_STREAM flag is | removed. Because stream termination is handled by QUIC, an END_STREAM flag is | |||
not required. This permits the removal of the Flags field from the generic | not required. This permits the removal of the Flags field from the generic | |||
frame layout.</t> | frame layout.</t> | |||
<t>Frame payloads are largely drawn from <xref target="RFC7540" format=" default"/>. However, QUIC includes many | <t>Frame payloads are largely drawn from <xref target='RFC9113'/>. Howev er, QUIC includes many | |||
features (e.g., flow control) that are also present in HTTP/2. In these cases, | features (e.g., flow control) that are also present in HTTP/2. In these cases, | |||
the HTTP mapping does not re-implement them. As a result, several HTTP/2 frame | the HTTP mapping does not re-implement them. As a result, several HTTP/2 frame | |||
types are not required in HTTP/3. Where an HTTP/2-defined frame is no longer | types are not required in HTTP/3. Where an HTTP/2-defined frame is no longer | |||
used, the frame ID has been reserved in order to maximize portability between | used, the frame ID has been reserved in order to maximize portability between | |||
HTTP/2 and HTTP/3 implementations. However, even frame types that appear in | HTTP/2 and HTTP/3 implementations. However, even frame types that appear in | |||
both mappings do not have identical semantics.</t> | both mappings do not have identical semantics.</t> | |||
<t>Many of the differences arise from the fact that HTTP/2 provides an a bsolute | <t>Many of the differences arise from the fact that HTTP/2 provides an a bsolute | |||
ordering between frames across all streams, while QUIC provides this guarantee | ordering between frames across all streams, while QUIC provides this guarantee | |||
on each stream only. As a result, if a frame type makes assumptions that frames | on each stream only. As a result, if a frame type makes assumptions that frames | |||
from different streams will still be received in the order sent, HTTP/3 will | from different streams will still be received in the order sent, HTTP/3 will | |||
break them.</t> | break them.</t> | |||
<t>Some examples of feature adaptations are described below, as well as general | <t>Some examples of feature adaptations are described below, as well as general | |||
guidance to extension frame implementors converting an HTTP/2 extension to | guidance to extension frame implementors converting an HTTP/2 extension to | |||
HTTP/3.</t> | HTTP/3.</t> | |||
<section anchor="h2-diff-priority" numbered="true" toc="default"> | <section anchor='h2-diff-priority'> | |||
<name>Prioritization Differences</name> | <name>Prioritization Differences</name> | |||
<t>HTTP/2 specifies priority assignments in PRIORITY frames and (optio nally) in | <t>HTTP/2 specifies priority assignments in PRIORITY frames and (optio nally) in | |||
HEADERS frames. HTTP/3 does not provide a means of signaling priority.</t> | <xref format='none' target='frame-headers'>HEADERS</xref><iref item='HEADERS'/> | |||
<t>Note that while there is no explicit signaling for priority, this d | frames. HTTP/3 does not provide a means of signaling priority.</t> | |||
oes not mean | <t>Note that, while there is no explicit signaling for priority, this | |||
does not mean | ||||
that prioritization is not important for achieving good performance.</t> | that prioritization is not important for achieving good performance.</t> | |||
</section> | </section> | |||
<section anchor="field-compression-differences" numbered="true" toc="def ault"> | <section anchor='field-compression-differences'> | |||
<name>Field Compression Differences</name> | <name>Field Compression Differences</name> | |||
<t>HPACK was designed with the assumption of in-order delivery. A sequ ence of | <t>HPACK was designed with the assumption of in-order delivery. A sequ ence of | |||
encoded field sections must arrive (and be decoded) at an endpoint in the same | encoded field sections must arrive (and be decoded) at an endpoint in the same | |||
order in which they were encoded. This ensures that the dynamic state at the two | order in which they were encoded. This ensures that the dynamic state at the two | |||
endpoints remains in sync.</t> | endpoints remains in sync.</t> | |||
<t>Because this total ordering is not provided by QUIC, HTTP/3 uses a modified | <t>Because this total ordering is not provided by QUIC, HTTP/3 uses a modified | |||
version of HPACK, called QPACK. QPACK uses a single unidirectional stream to | version of HPACK, called QPACK. QPACK uses a single unidirectional stream to | |||
make all modifications to the dynamic table, ensuring a total order of updates. | make all modifications to the dynamic table, ensuring a total order of updates. | |||
All frames that contain encoded fields merely reference the table state at a | All frames that contain encoded fields merely reference the table state at a | |||
given time without modifying it.</t> | given time without modifying it.</t> | |||
<t><xref target="RFCYYY2" format="default"/> provides additional detai ls.</t> | <t><xref target='RFC9204'/> provides additional details.</t> | |||
</section> | </section> | |||
<section anchor="flow-control-differences" numbered="true" toc="default" | <section anchor='flow-control-differences'> | |||
> | <name>Flow-Control Differences</name> | |||
<name>Flow Control Differences</name> | <t>HTTP/2 specifies a stream flow-control mechanism. Although all HTTP | |||
<t>HTTP/2 specifies a stream flow control mechanism. Although all HTTP | /2 frames are | |||
/2 frames are | delivered on streams, only the <xref format='none' target='frame-data'>DATA</xre | |||
delivered on streams, only the DATA frame payload is subject to flow control. | f><iref item='DATA'/> frame payload is subject to flow control. | |||
QUIC provides flow control for stream data and all HTTP/3 frame types defined in | QUIC provides flow control for stream data and all HTTP/3 frame types defined in | |||
this document are sent on streams. Therefore, all frame headers and payload are | this document are sent on streams. Therefore, all frame headers and payload are | |||
subject to flow control.</t> | subject to flow control.</t> | |||
</section> | </section> | |||
<section anchor="guidance-for-new-frame-type-definitions" numbered="true " toc="default"> | <section anchor='guidance-for-new-frame-type-definitions'> | |||
<name>Guidance for New Frame Type Definitions</name> | <name>Guidance for New Frame Type Definitions</name> | |||
<t>Frame type definitions in HTTP/3 often use the QUIC variable-length integer | <t>Frame type definitions in HTTP/3 often use the QUIC variable-length integer | |||
encoding. In particular, Stream IDs use this encoding, which allows for a | encoding. In particular, stream IDs use this encoding, which allows for a | |||
larger range of possible values than the encoding used in HTTP/2. Some frames | larger range of possible values than the encoding used in HTTP/2. Some frames | |||
in HTTP/3 use an identifier other than a Stream ID (e.g., Push | in HTTP/3 use an identifier other than a stream ID (e.g., push IDs). | |||
IDs). Redefinition of the encoding of extension frame types might be necessary | Redefinition of the encoding of extension frame types might be necessary if the | |||
if the encoding includes a Stream ID.</t> | encoding includes a stream ID.</t> | |||
<t>Because the Flags field is not present in generic HTTP/3 frames, th ose frames | <t>Because the Flags field is not present in generic HTTP/3 frames, th ose frames | |||
that depend on the presence of flags need to allocate space for flags as part | that depend on the presence of flags need to allocate space for flags as part | |||
of their frame payload.</t> | of their frame payload.</t> | |||
<t>Other than these issues, frame type HTTP/2 extensions are typically portable to | <t>Other than these issues, frame type HTTP/2 extensions are typically portable to | |||
QUIC simply by replacing Stream 0 in HTTP/2 with a control stream in HTTP/3. | QUIC simply by replacing stream 0 in HTTP/2 with a <xref format='none' target='c ontrol-streams'>control stream</xref><iref item='control stream'/> in HTTP/3. | |||
HTTP/3 extensions will not assume ordering, but would not be harmed by ordering, | HTTP/3 extensions will not assume ordering, but would not be harmed by ordering, | |||
and are expected to be portable to HTTP/2.</t> | and are expected to be portable to HTTP/2.</t> | |||
</section> | </section> | |||
<section anchor="comparison-between-http2-and-http3-frame-types" numbere | <section anchor='comparison-of-http2-and-http3-frame-types'> | |||
d="true" toc="default"> | <name>Comparison of HTTP/2 and HTTP/3 Frame Types</name> | |||
<name>Comparison Between HTTP/2 and HTTP/3 Frame Types</name> | ||||
<dl> | <dl> | |||
<dt> | <dt><xref format='none' target='frame-data'>DATA</xref> (0x00)<iref | |||
DATA (0x0): </dt> | item='DATA'/>:</dt> | |||
<dd> | <dd> | |||
<t>Padding is not defined in HTTP/3 frames. See <xref target="fra me-data" format="default"/>.</t> | <t>Padding is not defined in HTTP/3 frames. See <xref target='fra me-data'/>.</t> | |||
</dd> | </dd> | |||
<dt> | <dt><xref format='none' target='frame-headers'>HEADERS</xref> (0x01) | |||
HEADERS (0x1): </dt> | <iref item='HEADERS'/>:</dt> | |||
<dd> | <dd> | |||
<t>The PRIORITY region of HEADERS is not defined in HTTP/3 frames. | <t>The PRIORITY region of <xref format='none' target='frame-header | |||
Padding is not | s'>HEADERS</xref><iref item='HEADERS'/> is not defined in HTTP/3 frames. Padding | |||
defined in HTTP/3 frames. See <xref target="frame-headers" format="default"/>.< | is not | |||
/t> | defined in HTTP/3 frames. See <xref target='frame-headers'/>.</t> | |||
</dd> | </dd> | |||
<dt> | <dt>PRIORITY (0x02):</dt> | |||
PRIORITY (0x2): </dt> | ||||
<dd> | <dd> | |||
<t>As described in <xref target="h2-diff-priority" format="default "/>, HTTP/3 does not provide a means of | <t>As described in <xref target='h2-diff-priority'/>, HTTP/3 does not provide a means of | |||
signaling priority.</t> | signaling priority.</t> | |||
</dd> | </dd> | |||
<dt> | <dt>RST_STREAM (0x03):</dt> | |||
RST_STREAM (0x3): </dt> | ||||
<dd> | <dd> | |||
<t>RST_STREAM frames do not exist in HTTP/3, since QUIC provides s tream lifecycle | <t>RST_STREAM frames do not exist in HTTP/3, since QUIC provides s tream lifecycle | |||
management. The same code point is used for the CANCEL_PUSH frame | management. The same code point is used for the <xref format='none' target='fra | |||
(<xref target="frame-cancel-push" format="default"/>).</t> | me-cancel-push'>CANCEL_PUSH</xref><iref item='CANCEL_PUSH'/> frame | |||
(<xref target='frame-cancel-push'/>).</t> | ||||
</dd> | </dd> | |||
<dt> | <dt><xref format='none' target='frame-settings'>SETTINGS</xref> (0x0 | |||
SETTINGS (0x4): </dt> | 4)<iref item='SETTINGS'/>:</dt> | |||
<dd> | <dd> | |||
<t>SETTINGS frames are sent only at the beginning of the connectio | <t><xref format='none' target='frame-settings'>SETTINGS</xref><ire | |||
n. See | f item='SETTINGS'/> frames are sent only at the beginning of the connection. Se | |||
<xref target="frame-settings" format="default"/> and <xref target="h2-settings" | e | |||
format="default"/>.</t> | <xref target='frame-settings'/> and <xref target='h2-settings'/>.</t> | |||
</dd> | </dd> | |||
<dt> | <dt><xref format='none' target='frame-push-promise'>PUSH_PROMISE</xr | |||
PUSH_PROMISE (0x5): </dt> | ef> (0x05)<iref item='PUSH_PROMISE'/>:</dt> | |||
<dd> | <dd> | |||
<t>The PUSH_PROMISE frame does not reference a stream; instead the | <t>The <xref format='none' target='frame-push-promise'>PUSH_PROMIS | |||
push stream | E</xref><iref item='PUSH_PROMISE'/> frame does not reference a stream; instead, | |||
references the PUSH_PROMISE frame using a Push ID. See | the <xref format='none' target='push-streams'>push stream</xref><iref item='push | |||
<xref target="frame-push-promise" format="default"/>.</t> | stream'/> | |||
references the <xref format='none' target='frame-push-promise'>PUSH_PROMISE</xre | ||||
f><iref item='PUSH_PROMISE'/> frame using a <xref format='none' target='server-p | ||||
ush'>push ID</xref><iref item='push ID'/>. See | ||||
<xref target='frame-push-promise'/>.</t> | ||||
</dd> | </dd> | |||
<dt> | <dt>PING (0x06):</dt> | |||
PING (0x6): </dt> | ||||
<dd> | <dd> | |||
<t>PING frames do not exist in HTTP/3, as QUIC provides equivalent | <t>PING frames do not exist in HTTP/3, as QUIC provides equivalent | |||
functionality.</t> | functionality.</t> | |||
</dd> | </dd> | |||
<dt> | <dt><xref format='none' target='frame-goaway'>GOAWAY</xref> (0x07)<i | |||
GOAWAY (0x7): </dt> | ref item='GOAWAY'/>:</dt> | |||
<dd> | <dd> | |||
<t>GOAWAY does not contain an error code. In the client to server | <t><xref format='none' target='frame-goaway'>GOAWAY</xref><iref it | |||
direction, | em='GOAWAY'/> does not contain an error code. In the client-to-server direction | |||
it carries a Push ID instead of a server initiated stream ID. | , | |||
See <xref target="frame-goaway" format="default"/>.</t> | it carries a <xref format='none' target='server-push'>push ID</xref><iref item=' | |||
push ID'/> instead of a server-initiated stream ID. | ||||
See <xref target='frame-goaway'/>.</t> | ||||
</dd> | </dd> | |||
<dt> | <dt>WINDOW_UPDATE (0x08):</dt> | |||
WINDOW_UPDATE (0x8): </dt> | ||||
<dd> | <dd> | |||
<t>WINDOW_UPDATE frames do not exist in HTTP/3, since QUIC provide s flow control.</t> | <t>WINDOW_UPDATE frames do not exist in HTTP/3, since QUIC provide s flow control.</t> | |||
</dd> | </dd> | |||
<dt> | <dt>CONTINUATION (0x09):</dt> | |||
CONTINUATION (0x9): </dt> | ||||
<dd> | <dd> | |||
<t>CONTINUATION frames do not exist in HTTP/3; instead, larger | <t>CONTINUATION frames do not exist in HTTP/3; instead, larger | |||
HEADERS/PUSH_PROMISE frames than HTTP/2 are permitted.</t> | <xref format='none' target='frame-headers'>HEADERS</xref><iref item='HEADERS'/>/ <xref format='none' target='frame-push-promise'>PUSH_PROMISE</xref><iref item='P USH_PROMISE'/> frames than HTTP/2 are permitted.</t> | |||
</dd> | </dd> | |||
</dl> | </dl> | |||
<t>Frame types defined by extensions to HTTP/2 need to be separately r egistered for | <t>Frame types defined by extensions to HTTP/2 need to be separately r egistered for | |||
HTTP/3 if still applicable. The IDs of frames defined in <xref target="RFC7540" format="default"/> have been | HTTP/3 if still applicable. The IDs of frames defined in <xref target='RFC9113' /> have been | |||
reserved for simplicity. Note that the frame type space in HTTP/3 is | reserved for simplicity. Note that the frame type space in HTTP/3 is | |||
substantially larger (62 bits versus 8 bits), so many HTTP/3 frame types have no | substantially larger (62 bits versus 8 bits), so many HTTP/3 frame types have no | |||
equivalent HTTP/2 code points. See <xref target="iana-frames" format="default"/ >.</t> | equivalent HTTP/2 code points. See <xref target='iana-frames'/>.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="h2-settings" numbered="true" toc="default"> | <section anchor='h2-settings'> | |||
<name>HTTP/2 SETTINGS Parameters</name> | <name>HTTP/2 SETTINGS Parameters</name> | |||
<t>An important difference from HTTP/2 is that settings are sent once, a s the first | <t>An important difference from HTTP/2 is that settings are sent once, a s the first | |||
frame of the control stream, and thereafter cannot change. This eliminates many | frame of the <xref format='none' target='control-streams'>control stream</xref>< iref item='control stream'/>, and thereafter cannot change. This eliminates man y | |||
corner cases around synchronization of changes.</t> | corner cases around synchronization of changes.</t> | |||
<t>Some transport-level options that HTTP/2 specifies via the SETTINGS f rame are | <t>Some transport-level options that HTTP/2 specifies via the <xref form at='none' target='frame-settings'>SETTINGS</xref><iref item='SETTINGS'/> frame a re | |||
superseded by QUIC transport parameters in HTTP/3. The HTTP-level setting that | superseded by QUIC transport parameters in HTTP/3. The HTTP-level setting that | |||
is retained in HTTP/3 has the same value as in HTTP/2. The superseded | is retained in HTTP/3 has the same value as in HTTP/2. The superseded | |||
settings are reserved, and their receipt is an error. See | settings are reserved, and their receipt is an error. See | |||
<xref target="settings-parameters" format="default"/> for discussion of both the | <xref target='settings-parameters'/> for discussion of both the retained and res | |||
retained and reserved values.</t> | erved values.</t> | |||
<t>Below is a listing of how each HTTP/2 SETTINGS parameter is mapped:</ | <t>Below is a listing of how each HTTP/2 <xref format='none' target='fra | |||
t> | me-settings'>SETTINGS</xref><iref item='SETTINGS'/> parameter is mapped:</t> | |||
<dl> | <dl> | |||
<dt> | <dt>SETTINGS_HEADER_TABLE_SIZE (0x01):</dt> | |||
SETTINGS_HEADER_TABLE_SIZE (0x1): </dt> | ||||
<dd> | <dd> | |||
<t>See <xref target="RFCYYY2" format="default"/>.</t> | <t>See <xref target='RFC9204'/>.</t> | |||
</dd> | </dd> | |||
<dt> | <dt>SETTINGS_ENABLE_PUSH (0x02):</dt> | |||
SETTINGS_ENABLE_PUSH (0x2): </dt> | ||||
<dd> | <dd> | |||
<t>This is removed in favor of the MAX_PUSH_ID frame, which provides a more | <t>This is removed in favor of the <xref format='none' target='frame -max-push-id'>MAX_PUSH_ID</xref><iref item='MAX_PUSH_ID'/> frame, which provides a more | |||
granular control over server push. Specifying a setting with the identifier | granular control over server push. Specifying a setting with the identifier | |||
0x2 (corresponding to the SETTINGS_ENABLE_PUSH parameter) in the HTTP/3 | 0x02 (corresponding to the SETTINGS_ENABLE_PUSH parameter) in the HTTP/3 | |||
SETTINGS frame is an error.</t> | <xref format='none' target='frame-settings'>SETTINGS</xref><iref item='SETTINGS' | |||
/> frame is an error.</t> | ||||
</dd> | </dd> | |||
<dt> | <dt>SETTINGS_MAX_CONCURRENT_STREAMS (0x03):</dt> | |||
SETTINGS_MAX_CONCURRENT_STREAMS (0x3): </dt> | ||||
<dd> | <dd> | |||
<t>QUIC controls the largest open Stream ID as part of its flow cont | <t>QUIC controls the largest open stream ID as part of its flow-cont | |||
rol logic. | rol logic. | |||
Specifying a setting with the identifier 0x3 (corresponding to the | Specifying a setting with the identifier 0x03 (corresponding to the | |||
SETTINGS_MAX_CONCURRENT_STREAMS parameter) in the HTTP/3 SETTINGS frame is an | SETTINGS_MAX_CONCURRENT_STREAMS parameter) in the HTTP/3 <xref format='none' tar | |||
get='frame-settings'>SETTINGS</xref><iref item='SETTINGS'/> frame is an | ||||
error.</t> | error.</t> | |||
</dd> | </dd> | |||
<dt> | <dt>SETTINGS_INITIAL_WINDOW_SIZE (0x04):</dt> | |||
SETTINGS_INITIAL_WINDOW_SIZE (0x4): </dt> | ||||
<dd> | <dd> | |||
<t>QUIC requires both stream and connection flow control window size s to be | <t>QUIC requires both stream and connection flow-control window size s to be | |||
specified in the initial transport handshake. Specifying a setting with the | specified in the initial transport handshake. Specifying a setting with the | |||
identifier 0x4 (corresponding to the SETTINGS_INITIAL_WINDOW_SIZE parameter) | identifier 0x04 (corresponding to the SETTINGS_INITIAL_WINDOW_SIZE parameter) | |||
in the HTTP/3 SETTINGS frame is an error.</t> | in the HTTP/3 <xref format='none' target='frame-settings'>SETTINGS</xref><iref i | |||
tem='SETTINGS'/> frame is an error.</t> | ||||
</dd> | </dd> | |||
<dt> | <dt>SETTINGS_MAX_FRAME_SIZE (0x05):</dt> | |||
SETTINGS_MAX_FRAME_SIZE (0x5): </dt> | ||||
<dd> | <dd> | |||
<t>This setting has no equivalent in HTTP/3. Specifying a setting w ith the | <t>This setting has no equivalent in HTTP/3. Specifying a setting w ith the | |||
identifier 0x5 (corresponding to the SETTINGS_MAX_FRAME_SIZE parameter) in the | identifier 0x05 (corresponding to the SETTINGS_MAX_FRAME_SIZE parameter) in | |||
HTTP/3 SETTINGS frame is an error.</t> | the HTTP/3 <xref format='none' target='frame-settings'>SETTINGS</xref><iref item | |||
='SETTINGS'/> frame is an error.</t> | ||||
</dd> | </dd> | |||
<dt> | <dt>SETTINGS_MAX_HEADER_LIST_SIZE (0x06):</dt> | |||
SETTINGS_MAX_HEADER_LIST_SIZE (0x6): </dt> | ||||
<dd> | <dd> | |||
<t>This setting identifier has been renamed SETTINGS_MAX_FIELD_SECTI ON_SIZE.</t> | <t>This setting identifier has been renamed <xref format='none' targ et='SETTINGS_MAX_FIELD_SECTION_SIZE'>SETTINGS_MAX_FIELD_SECTION_SIZE</xref><iref item='SETTINGS_MAX_FIELD_SECTION_SIZE'/>.</t> | |||
</dd> | </dd> | |||
</dl> | </dl> | |||
<t>In HTTP/3, setting values are variable-length integers (6, 14, 30, or 62 bits | <t>In HTTP/3, setting values are variable-length integers (6, 14, 30, or 62 bits | |||
long) rather than fixed-length 32-bit fields as in HTTP/2. This will often | long) rather than fixed-length 32-bit fields as in HTTP/2. This will often | |||
produce a shorter encoding, but can produce a longer encoding for settings that | produce a shorter encoding, but can produce a longer encoding for settings that | |||
use the full 32-bit space. Settings ported from HTTP/2 might choose to redefine | use the full 32-bit space. Settings ported from HTTP/2 might choose to redefine | |||
their value to limit it to 30 bits for more efficient encoding, or to make use | their value to limit it to 30 bits for more efficient encoding or to make use | |||
of the 62-bit space if more than 30 bits are required.</t> | of the 62-bit space if more than 30 bits are required.</t> | |||
<t>Settings need to be defined separately for HTTP/2 and HTTP/3. The IDs of | <t>Settings need to be defined separately for HTTP/2 and HTTP/3. The IDs of | |||
settings defined in <xref target="RFC7540" format="default"/> have been reserved for simplicity. Note that | settings defined in <xref target='RFC9113'/> have been reserved for simplicity. Note that | |||
the settings identifier space in HTTP/3 is substantially larger (62 bits versus | the settings identifier space in HTTP/3 is substantially larger (62 bits versus | |||
16 bits), so many HTTP/3 settings have no equivalent HTTP/2 code point. See | 16 bits), so many HTTP/3 settings have no equivalent HTTP/2 code point. See | |||
<xref target="iana-settings" format="default"/>.</t> | <xref target='iana-settings'/>.</t> | |||
<t>As QUIC streams might arrive out of order, endpoints are advised not to wait for | <t>As QUIC streams might arrive out of order, endpoints are advised not to wait for | |||
the peers' settings to arrive before responding to other streams. See | the peers' settings to arrive before responding to other streams. See | |||
<xref target="settings-initialization" format="default"/>.</t> | <xref target='settings-initialization'/>.</t> | |||
</section> | </section> | |||
<section anchor="http2-error-codes" numbered="true" toc="default"> | <section anchor='http2-error-codes'> | |||
<name>HTTP/2 Error Codes</name> | <name>HTTP/2 Error Codes</name> | |||
<t>QUIC has the same concepts of "stream" and "connection" errors that H TTP/2 | <t>QUIC has the same concepts of "stream" and "connection" errors that H TTP/2 | |||
provides. However, the differences between HTTP/2 and HTTP/3 mean that error | provides. However, the differences between HTTP/2 and HTTP/3 mean that error | |||
codes are not directly portable between versions.</t> | codes are not directly portable between versions.</t> | |||
<t>The HTTP/2 error codes defined in <xref section="7" sectionFormat="of " target="RFC7540" format="default"/> logically map to | <t>The HTTP/2 error codes defined in <xref section='7' sectionFormat='of ' target='RFC9113'/> logically map to | |||
the HTTP/3 error codes as follows:</t> | the HTTP/3 error codes as follows:</t> | |||
<dl> | <dl> | |||
<dt> | <dt>NO_ERROR (0x00):</dt> | |||
NO_ERROR (0x0): </dt> | ||||
<dd> | <dd> | |||
<t>H3_NO_ERROR in <xref target="http-error-codes" format="default"/> .</t> | <t><xref format='none' target='H3_NO_ERROR'>H3_NO_ERROR</xref><iref item='H3_NO_ERROR'/> in <xref target='http-error-codes'/>.</t> | |||
</dd> | </dd> | |||
<dt> | <dt>PROTOCOL_ERROR (0x01):</dt> | |||
PROTOCOL_ERROR (0x1): </dt> | ||||
<dd> | <dd> | |||
<t>This is mapped to H3_GENERAL_PROTOCOL_ERROR except in cases where more | <t>This is mapped to <xref format='none' target='H3_GENERAL_PROTOCOL _ERROR'>H3_GENERAL_PROTOCOL_ERROR</xref><iref item='H3_GENERAL_PROTOCOL_ERROR'/> except in cases where more | |||
specific error codes have been defined. Such cases include | specific error codes have been defined. Such cases include | |||
H3_FRAME_UNEXPECTED, H3_MESSAGE_ERROR, and H3_CLOSED_CRITICAL_STREAM defined | <xref format='none' target='H3_FRAME_UNEXPECTED'>H3_FRAME_UNEXPECTED</xref><iref | |||
in <xref target="http-error-codes" format="default"/>.</t> | item='H3_FRAME_UNEXPECTED'/>, <xref format='none' target='H3_MESSAGE_ERROR'>H3_ | |||
MESSAGE_ERROR</xref><iref item='H3_MESSAGE_ERROR'/>, and <xref format='none' tar | ||||
get='H3_CLOSED_CRITICAL_STREAM'>H3_CLOSED_CRITICAL_STREAM</xref><iref item='H3_C | ||||
LOSED_CRITICAL_STREAM'/> defined | ||||
in <xref target='http-error-codes'/>.</t> | ||||
</dd> | </dd> | |||
<dt> | <dt>INTERNAL_ERROR (0x02):</dt> | |||
INTERNAL_ERROR (0x2): </dt> | ||||
<dd> | <dd> | |||
<t>H3_INTERNAL_ERROR in <xref target="http-error-codes" format="defa ult"/>.</t> | <t><xref format='none' target='H3_INTERNAL_ERROR'>H3_INTERNAL_ERROR< /xref><iref item='H3_INTERNAL_ERROR'/> in <xref target='http-error-codes'/>.</t> | |||
</dd> | </dd> | |||
<dt> | <dt>FLOW_CONTROL_ERROR (0x03):</dt> | |||
FLOW_CONTROL_ERROR (0x3): </dt> | ||||
<dd> | <dd> | |||
<t>Not applicable, since QUIC handles flow control.</t> | <t>Not applicable, since QUIC handles flow control.</t> | |||
</dd> | </dd> | |||
<dt> | <dt>SETTINGS_TIMEOUT (0x04):</dt> | |||
SETTINGS_TIMEOUT (0x4): </dt> | ||||
<dd> | <dd> | |||
<t>Not applicable, since no acknowledgment of SETTINGS is defined.</ t> | <t>Not applicable, since no acknowledgment of <xref format='none' ta rget='frame-settings'>SETTINGS</xref><iref item='SETTINGS'/> is defined.</t> | |||
</dd> | </dd> | |||
<dt> | <dt>STREAM_CLOSED (0x05):</dt> | |||
STREAM_CLOSED (0x5): </dt> | ||||
<dd> | <dd> | |||
<t>Not applicable, since QUIC handles stream management.</t> | <t>Not applicable, since QUIC handles stream management.</t> | |||
</dd> | </dd> | |||
<dt> | <dt>FRAME_SIZE_ERROR (0x06):</dt> | |||
FRAME_SIZE_ERROR (0x6): </dt> | ||||
<dd> | <dd> | |||
<t>H3_FRAME_ERROR error code defined in <xref target="http-error-cod es" format="default"/>.</t> | <t><xref format='none' target='H3_FRAME_ERROR'>H3_FRAME_ERROR</xref> <iref item='H3_FRAME_ERROR'/> error code defined in <xref target='http-error-cod es'/>.</t> | |||
</dd> | </dd> | |||
<dt> | <dt>REFUSED_STREAM (0x07):</dt> | |||
REFUSED_STREAM (0x7): </dt> | ||||
<dd> | <dd> | |||
<t>H3_REQUEST_REJECTED (in <xref target="http-error-codes" format="d efault"/>) is used to indicate that a | <t><xref format='none' target='H3_REQUEST_REJECTED'>H3_REQUEST_REJEC TED</xref><iref item='H3_REQUEST_REJECTED'/> (in <xref target='http-error-codes' />) is used to indicate that a | |||
request was not processed. Otherwise, not applicable because QUIC handles | request was not processed. Otherwise, not applicable because QUIC handles | |||
stream management.</t> | stream management.</t> | |||
</dd> | </dd> | |||
<dt> | <dt>CANCEL (0x08):</dt> | |||
CANCEL (0x8): </dt> | ||||
<dd> | <dd> | |||
<t>H3_REQUEST_CANCELLED in <xref target="http-error-codes" format="d efault"/>.</t> | <t><xref format='none' target='H3_REQUEST_CANCELLED'>H3_REQUEST_CANC ELLED</xref><iref item='H3_REQUEST_CANCELLED'/> in <xref target='http-error-code s'/>.</t> | |||
</dd> | </dd> | |||
<dt> | <dt>COMPRESSION_ERROR (0x09):</dt> | |||
COMPRESSION_ERROR (0x9): </dt> | ||||
<dd> | <dd> | |||
<t>Multiple error codes are defined in <xref target="RFCYYY2" format ="default"/>.</t> | <t>Multiple error codes are defined in <xref target='RFC9204'/>.</t> | |||
</dd> | </dd> | |||
<dt> | <dt>CONNECT_ERROR (0x0a):</dt> | |||
CONNECT_ERROR (0xa): </dt> | ||||
<dd> | <dd> | |||
<t>H3_CONNECT_ERROR in <xref target="http-error-codes" format="defau lt"/>.</t> | <t><xref format='none' target='H3_CONNECT_ERROR'>H3_CONNECT_ERROR</x ref><iref item='H3_CONNECT_ERROR'/> in <xref target='http-error-codes'/>.</t> | |||
</dd> | </dd> | |||
<dt> | <dt>ENHANCE_YOUR_CALM (0x0b):</dt> | |||
ENHANCE_YOUR_CALM (0xb): </dt> | ||||
<dd> | <dd> | |||
<t>H3_EXCESSIVE_LOAD in <xref target="http-error-codes" format="defa ult"/>.</t> | <t><xref format='none' target='H3_EXCESSIVE_LOAD'>H3_EXCESSIVE_LOAD< /xref><iref item='H3_EXCESSIVE_LOAD'/> in <xref target='http-error-codes'/>.</t> | |||
</dd> | </dd> | |||
<dt> | <dt>INADEQUATE_SECURITY (0x0c):</dt> | |||
INADEQUATE_SECURITY (0xc): </dt> | ||||
<dd> | <dd> | |||
<t>Not applicable, since QUIC is assumed to provide sufficient secur ity on all | <t>Not applicable, since QUIC is assumed to provide sufficient secur ity on all | |||
connections.</t> | connections.</t> | |||
</dd> | </dd> | |||
<dt> | <dt>HTTP_1_1_REQUIRED (0x0d):</dt> | |||
HTTP_1_1_REQUIRED (0xd): </dt> | ||||
<dd> | <dd> | |||
<t>H3_VERSION_FALLBACK in <xref target="http-error-codes" format="de fault"/>.</t> | <t><xref format='none' target='H3_VERSION_FALLBACK'>H3_VERSION_FALLB ACK</xref><iref item='H3_VERSION_FALLBACK'/> in <xref target='http-error-codes'/ >.</t> | |||
</dd> | </dd> | |||
</dl> | </dl> | |||
<t>Error codes need to be defined for HTTP/2 and HTTP/3 separately. See | <t>Error codes need to be defined for HTTP/2 and HTTP/3 separately. See | |||
<xref target="iana-error-codes" format="default"/>.</t> | <xref target='iana-error-codes'/>.</t> | |||
<section anchor="mapping-between-http2-and-http3-errors" numbered="true" | <section anchor='mapping-between-http2-and-http3-errors'> | |||
toc="default"> | <name>Mapping between HTTP/2 and HTTP/3 Errors</name> | |||
<name>Mapping Between HTTP/2 and HTTP/3 Errors</name> | ||||
<t>An intermediary that converts between HTTP/2 and HTTP/3 may encount er error | <t>An intermediary that converts between HTTP/2 and HTTP/3 may encount er error | |||
conditions from either upstream. It is useful to communicate the occurrence of | conditions from either upstream. It is useful to communicate the occurrence of | |||
error to the downstream but error codes largely reflect connection-local | errors to the downstream, but error codes largely reflect connection-local | |||
problems that generally do not make sense to propagate.</t> | problems that generally do not make sense to propagate.</t> | |||
<t>An intermediary that encounters an error from an upstream origin ca n indicate | <t>An intermediary that encounters an error from an upstream origin ca n indicate | |||
this by sending an HTTP status code such as 502, which is suitable for a broad | this by sending an HTTP status code such as 502 (Bad Gateway), which is suitable | |||
class of errors.</t> | for a broad class of errors.</t> | |||
<t>There are some rare cases where it is beneficial to propagate the e rror by | <t>There are some rare cases where it is beneficial to propagate the e rror by | |||
mapping it to the closest matching error type to the receiver. For example, an | mapping it to the closest matching error type to the receiver. For example, an | |||
intermediary that receives an HTTP/2 stream error of type REFUSED_STREAM from | intermediary that receives an HTTP/2 <xref format='none' target='errors'>stream error</xref><iref item='stream error'/> of type REFUSED_STREAM from | |||
the origin has a clear signal that the request was not processed and that the | the origin has a clear signal that the request was not processed and that the | |||
request is safe to retry. Propagating this error condition to the client as an | request is safe to retry. Propagating this error condition to the client as an | |||
HTTP/3 stream error of type H3_REQUEST_REJECTED allows the client to take the | HTTP/3 <xref format='none' target='errors'>stream error</xref><iref item='stream error'/> of type <xref format='none' target='H3_REQUEST_REJECTED'>H3_REQUEST_RE JECTED</xref><iref item='H3_REQUEST_REJECTED'/> allows the client to take the | |||
action it deems most appropriate. In the reverse direction, the intermediary | action it deems most appropriate. In the reverse direction, the intermediary | |||
might deem it beneficial to pass on client request cancellations that are | might deem it beneficial to pass on client request cancellations that are | |||
indicated by terminating a stream with H3_REQUEST_CANCELLED; see | indicated by terminating a stream with <xref format='none' target='H3_REQUEST_CA | |||
<xref target="request-cancellation" format="default"/>.</t> | NCELLED'>H3_REQUEST_CANCELLED</xref><iref item='H3_REQUEST_CANCELLED'/>; see | |||
<xref target='request-cancellation'/>.</t> | ||||
<t>Conversion between errors is described in the logical mapping. The error codes | <t>Conversion between errors is described in the logical mapping. The error codes | |||
are defined in non-overlapping spaces in order to protect against accidental | are defined in non-overlapping spaces in order to protect against accidental | |||
conversion that could result in the use of inappropriate or unknown error codes | conversion that could result in the use of inappropriate or unknown error codes | |||
for the target version. An intermediary is permitted to promote stream errors to | for the target version. An intermediary is permitted to promote <xref format='no | |||
connection errors but they should be aware of the cost to the HTTP/3 connection | ne' target='errors'>stream errors</xref><iref item='stream error'/> to | |||
<xref format='none' target='errors'>connection errors</xref><iref item='connecti | ||||
on error'/> but they should be aware of the cost to the HTTP/3 connection | ||||
for what might be a temporary or intermittent error.</t> | for what might be a temporary or intermittent error.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor='acknowledgments' numbered='false'> | ||||
<!--[rfced] deleted section per instructions <strong>RFC Editor's Note: | ||||
</strong> Please remove this section prior to publication of a | ||||
final version of this document.</li>--> | ||||
<section numbered="false" anchor="acknowledgments" toc="default"> | ||||
<name>Acknowledgments</name> | <name>Acknowledgments</name> | |||
<t>The original authors of this specification were Robbie Shade and Mike W | <t><contact fullname='Robbie Shade'/> and <contact fullname='Mike Warres'/ | |||
arres.</t> | > were the authors of | |||
draft-shade-quic-http2-mapping, a precursor of this document.</t> | ||||
<t>The IETF QUIC Working Group received an enormous amount of support from many | <t>The IETF QUIC Working Group received an enormous amount of support from many | |||
people. Among others, the following people provided substantial contributions to | people. Among others, the following people provided substantial contributions to | |||
this document:</t> | this document:</t> | |||
<ul spacing='compact'> | ||||
<t><contact fullname="Bence Beky"/></t> | <li> | |||
<t><contact fullname="Daan De Meyer"/></t> | <t><contact fullname="Bence Beky"/></t> | |||
<t><contact fullname="Martin Duke"/></t> | </li> | |||
<t><contact fullname="Roy Fielding"/></t> | <li> | |||
<t><contact fullname="Alan Frindell"/></t> | <t><contact fullname="Daan De Meyer"/></t> | |||
<t><contact fullname="Alessandro Ghedini"/></t> | </li> | |||
<t><contact fullname="Nick Harper"/></t> | <li> | |||
<t><contact fullname="Ryan Hamilton"/></t> | <t><contact fullname="Martin Duke"/></t> | |||
<t><contact fullname="Christian Huitema"/></t> | </li> | |||
<t><contact fullname="Subodh Iyengar"/></t> | <li> | |||
<t><contact fullname="Robin Marx"/></t> | <t><contact fullname="Roy Fielding"/></t> | |||
<t><contact fullname="Patrick McManus"/></t> | </li> | |||
<t><contact fullname="Luca Niccolini"/></t> | <li> | |||
<t><contact fullname="Alan Frindell"/></t> | ||||
<t> <contact asciiFullname="Kazuho Oku" fullname="奥 一穂"/> | </li> | |||
</t> | <li> | |||
<t><contact fullname="Alessandro Ghedini"/></t> | ||||
<t><contact fullname="Lucas Pardue"/></t> | </li> | |||
<t><contact fullname="Roberto Peon"/></t> | <li> | |||
<t><contact fullname="Julian Reschke"/></t> | <t><contact fullname="Nick Harper"/></t> | |||
<t><contact fullname="Eric Rescorla"/></t> | </li> | |||
<t><contact fullname="Martin Seemann"/></t> | <li> | |||
<t><contact fullname="Ben Schwartz"/></t> | <t><contact fullname="Ryan Hamilton"/></t> | |||
<t><contact fullname="Ian Swett"/></t> | </li> | |||
<t><contact fullname="Willy Taureau"/></t> | <li> | |||
<t><contact fullname="Martin Thomson"/></t> | <t><contact fullname="Christian Huitema"/></t> | |||
<t><contact fullname="Dmitri Tikhonov"/></t> | </li> | |||
<t><contact fullname="Tatsuhiro Tsujikawa"/></t> | <li> | |||
<t><contact fullname="Subodh Iyengar"/></t> | ||||
<t>A portion of Mike's contribution was supported by Microsoft during his | </li> | |||
employment there.</t> | <li> | |||
<t><contact fullname="Robin Marx"/></t> | ||||
</li> | ||||
<li> | ||||
<t><contact fullname="Patrick McManus"/></t> | ||||
</li> | ||||
<li> | ||||
<t><contact fullname="Luca Niccolini"/></t> | ||||
</li> | ||||
<li> | ||||
<t><contact asciiFullname="Kazuho Oku" fullname="奥 一穂"/></t> | ||||
</li> | ||||
<li> | ||||
<t><contact fullname="Lucas Pardue"/></t> | ||||
</li> | ||||
<li> | ||||
<t><contact fullname="Roberto Peon"/></t> | ||||
</li> | ||||
<li> | ||||
<t><contact fullname="Julian Reschke"/></t> | ||||
</li> | ||||
<li> | ||||
<t><contact fullname="Eric Rescorla"/></t> | ||||
</li> | ||||
<li> | ||||
<t><contact fullname="Martin Seemann"/></t> | ||||
</li> | ||||
<li> | ||||
<t><contact fullname="Ben Schwartz"/></t> | ||||
</li> | ||||
<li> | ||||
<t><contact fullname="Ian Swett"/></t> | ||||
</li> | ||||
<li> | ||||
<t><contact fullname="Willy Taureau"/></t> | ||||
</li> | ||||
<li> | ||||
<t><contact fullname="Martin Thomson"/></t> | ||||
</li> | ||||
<li> | ||||
<t><contact fullname="Dmitri Tikhonov"/></t> | ||||
</li> | ||||
<li> | ||||
<t><contact fullname="Tatsuhiro Tsujikawa"/></t> | ||||
</li> | ||||
</ul> | ||||
<t>A portion of <contact fullname='Mike Bishop'/>'s contribution was suppo | ||||
rted by Microsoft during | ||||
his employment there.</t> | ||||
</section> | </section> | |||
</back> | </back> | |||
</rfc> | </rfc> | |||
End of changes. 580 change blocks. | ||||
2225 lines changed or deleted | 2854 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |