<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.39 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-masque-http-datagram-compression-01" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.0 -->
  <front>
    <title abbrev="HTTP Datagram Compression">Extensions to Compress and Derive Fields in HTTP Datagrams</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-masque-http-datagram-compression-01"/>
    <author fullname="Yaroslav Rosomakho">
      <organization>Zscaler</organization>
      <address>
        <email>yrosomakho@zscaler.com</email>
      </address>
    </author>
    <author fullname="Tommy Pauly">
      <organization>Apple</organization>
      <address>
        <email>tpauly@apple.com</email>
      </address>
    </author>
    <date year="2026" month="July" day="06"/>
    <area>Web and Internet Transport</area>
    <workgroup>Multiplexed Application Substrate over QUIC Encryption</workgroup>
    <keyword>template</keyword>
    <keyword>checksum</keyword>
    <keyword>connect-ip</keyword>
    <abstract>
      <?line 42?>

<t>This document defines extensions for HTTP Datagram-based protocols that improve transmission efficiency by introducing templates for compressing or deriving datagram fields.</t>
      <t>These templates allow endpoints to define parts of datagrams that are static and can be removed, and other parts that can be derived (such as packet lengths and checksum values).</t>
      <t>Additionally, this document defines a checksum offload procedure enabling receivers to complete Internet checksums using sender-provided partial values.</t>
      <t>These optimisations reduce per-packet overhead, processing cost, and increase the effective maximum transmission unit (MTU) when datagrams are encapsulated in QUIC DATAGRAM frames.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://yaroslavros.github.io/connect-ip-optimizations/draft-ietf-masque-http-datagram-compression.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-masque-http-datagram-compression/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Multiplexed Application Substrate over QUIC Encryption Working Group mailing list (<eref target="mailto:masque@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/masque/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/masque/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/yaroslavros/connect-ip-optimizations"/>.</t>
    </note>
  </front>
  <middle>
    <?line 52?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The CONNECT-IP method <xref target="CONNECT-IP"/> allows an HTTP client to establish an IP tunnel through an HTTP proxy and exchange IP packets using either HTTP/3 Datagrams (<xref section="2.1" sectionFormat="of" target="HTTP-DATAGRAMS"/>) or DATAGRAM capsules (<xref section="3.5" sectionFormat="of" target="HTTP-DATAGRAMS"/>). Similarly, CONNECT-ETHERNET <xref target="CONNECT-ETHERNET"/> allows sending Ethernet frames over HTTP Datagrams. These protocols send complete packets or frames by default, including all transport and network headers. This is a simple approach, but incurs per-packet overhead due to the repeated transmission of largely invariant header fields.</t>
      <t>Other HTTP Datagram-based protocols share similar properties: datagrams often contain structured packets where many header fields remain constant across a flow while only a subset of bytes change between packets. Transmitting complete packets therefore wastes bandwidth and processing resources.</t>
      <t>This document introduces a set of optional extensions that define Processing Contexts for HTTP Datagram payloads. A Processing Context describes transformations applied to a received datagram payload prior to delivery to the target protocol and may reference a parent context, forming a processing chain.</t>
      <t>Reusable templates allow endpoints to associate a Context Identifier with a reusable packet layout consisting of static and variable byte regions. Once a template has been installed using reliable Capsules, datagrams referencing the same Context Identifier carry only the variable portions of the packet. This reduces the size of transmitted datagrams and processing overhead, while remaining compatibile with intermediaries that are unaware of these optimisations.</t>
      <t>Derived field processing allows the receiver to reconstruct certain header fields (for example packet length fields and complete checksums) based on the size and structure of the reconstructed packet. This eliminates the need for the sender to transmit such fields for every packet.</t>
      <t>In addition, this document defines a checksum offload procedure enabling endpoints to cooperatively compute Internet checksums, where the sender provides a partial checksum and the receiver completes the computation after reconstruction. This mirrors hardware checksum-offload behavior used on network interfaces and tunnel devices, reducing per-packet CPU cost for encapsulating or decapsulating CONNECT-IP and CONNECT-ETHERNET traffic.</t>
      <t>When HTTP Datagrams are encapsulated in QUIC DATAGRAM frames, these optimisations also increase the effective maximum transmission unit (MTU) by reducing the number of bytes carried inside each QUIC packet.</t>
      <t>All extensions are negotiated during the HTTP request/response handshake and signalled using Capsules on the reliable control stream. Endpoints can always fall back to transmitting complete datagrams using Context Identifier 0, which represents unoptimised datagrams containing the full payload as defined by the underlying HTTP Datagram protocol.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<t>The following terms are used in this document:</t>
      <dl>
        <dt>Context Identifier (Context ID):</dt>
        <dd>
          <t>A numeric identifier associated with a Processing Context. Context ID encoding and allocation follow the rules defined in <xref section="4" sectionFormat="of" target="CONNECT-UDP"/>. Context ID 0 indicates that the datagram payload is delivered without additional processing as defined by the underlying HTTP Datagram protocol.</t>
        </dd>
        <dt>Processing Context:</dt>
        <dd>
          <t>A set of rules describing how an HTTP Datagram payload is transformed before delivery to the target protocol. A Processing Context may reference a parent context, forming a processing chain. Processing Contexts are immutable once created.</t>
        </dd>
        <dt>Template:</dt>
        <dd>
          <t>A reusable packet layout consisting of a sequence of static and variable segments. Static segments contain bytes removed from optimized datagrams, while variable segments correspond to bytes still carried in the datagram payload.</t>
        </dd>
        <dt>Derived Field:</dt>
        <dd>
          <t>A header field whose value is generated by the receiver during reconstruction and written into the reconstructed packet rather than being transmitted in the datagram payload. Derived fields include length fields and complete checksums.</t>
        </dd>
        <dt>Checksum Offload:</dt>
        <dd>
          <t>A capability allowing the receiver to complete the Internet checksum according to <xref target="INCREMENTAL-CHECKSUM"/> using a sender-provided partial checksum after reconstruction of the packet.</t>
        </dd>
        <dt>Capsule:</dt>
        <dd>
          <t>A reliable control-stream message, as defined in <xref section="3" sectionFormat="of" target="HTTP-DATAGRAMS"/>, used in this specification to signal creation, acknowledgement, or deletion of Processing Contexts.</t>
        </dd>
      </dl>
    </section>
    <section anchor="negotiation">
      <name>Negotiation of Capabilities</name>
      <t>Endpoints negotiate support for HTTP Datagram processing contexts during the HTTP request/response handshake by using the <tt>http-datagram-contexts</tt> HTTP header field, whose value is a Structured Field Dictionary as defined in <xref section="3.2" sectionFormat="of" target="STRUCTURED-HTTP"/>.</t>
      <section anchor="header-definition">
        <name>Header Definition</name>
        <figure anchor="fig-http-datagram-contexts-header">
          <name>http-datagram-contexts header field</name>
          <artwork><![CDATA[
http-datagram-contexts = sf-dictionary
]]></artwork>
        </figure>
        <t>This document defines the following optional dictionary keys:</t>
        <dl>
          <dt><tt>max-templates</tt> (Integer):</dt>
          <dd>
            <t>Maximum number of concurrently active template contexts the sender is willing to maintain for templates created by the peer. Absence of this key or value of 0 indicates that the sender does not support reusable templates.</t>
          </dd>
          <dt><tt>max-templates-segments</tt> (Integer):</dt>
          <dd>
            <t>Maximum number of static segments accepted within a single template. Absence of this key or value of 0 indicates that the sender does not impose a limit on number of static segments in a single template.</t>
          </dd>
          <dt><tt>derived</tt> (Inner List):</dt>
          <dd>
            <t>A list of supported Derived Field Types as defined in <xref target="iana-derived-fields"/>. Initial field definitions and reconstruction procedures are specified in <xref target="derived-field-definitions"/>.</t>
          </dd>
          <dt><tt>checksum</tt> (Boolean):</dt>
          <dd>
            <t>Indicates support for the checksum offload procedure defined in this document. A value of ?1 means the endpoint is willing to complete checksums using sender-provided partial values. If omitted or set to ?0, checksum offload is not supported.</t>
          </dd>
          <dt><tt>mtu</tt> (Integer):</dt>
          <dd>
            <t>Upper limit on maximum reconstructed packet size the receiver is willing to accept.</t>
          </dd>
        </dl>
        <t>Endpoints <bcp14>MUST</bcp14> ignore unknown dictionary members. The absence of a member implies that the corresponding capability is not supported for contexts created by the peer.</t>
      </section>
      <section anchor="negotiation-behavior">
        <name>Negotiation Behavior</name>
        <t>Capabilities are directional. Each endpoint advertises the processing contexts it is willing to receive and maintain for datagrams sent by the peer. An endpoint <bcp14>MAY</bcp14> create a context only if the peer advertised support for the corresponding capability.</t>
        <section anchor="templates">
          <name>Templates</name>
          <t>If the peer advertises the <tt>max-templates</tt>  value greater than 0, the endpoint <bcp14>MAY</bcp14> create template contexts up to that limit using capsules defined in <xref target="capsules"/>.</t>
          <t>An endpoint <bcp14>MUST NOT</bcp14> create templates exceeding the peer's advertised <tt>max-template-segments</tt> limit when that parameter is present.</t>
          <t>If the peer advertises an <tt>mtu</tt> limit, the sender <bcp14>MUST NOT</bcp14> transmit a datagram that would reconstruct into a packet larger than the advertised limit after all processing contexts have been applied.</t>
        </section>
        <section anchor="derived-fields">
          <name>Derived Fields</name>
          <t>An endpoint <bcp14>MAY</bcp14> create a derived context only if every operation in the capsule appears in the peer's <tt>derived</tt> list.</t>
        </section>
        <section anchor="checksum-offload">
          <name>Checksum Offload</name>
          <t>An endpoint <bcp14>MAY</bcp14> create a checksum offload context only if the peer advertised <tt>checksum=?1</tt>.</t>
        </section>
      </section>
      <section anchor="example">
        <name> Example</name>
        <t>HTTP/3 sample request (client to proxy):</t>
        <figure anchor="fig-connect-ip-http-datagram-contexts-request-example">
          <name>CONNECT-IP with http-datagram-contexts request example</name>
          <artwork><![CDATA[
:method = CONNECT
:protocol = connect-ip
:scheme = https
:path = /.well-known/masque/ip/*/*/
:authority = proxy.example.net
capsule-protocol = ?1
http-datagram-contexts = max-templates=20000, max-templates-segments=32, derived=(0 2 4), checksum=?1, mtu=1500
]]></artwork>
        </figure>
        <t>HTTP/3 sample response (proxy to client):</t>
        <figure anchor="fig-connect-ip-http-datagram-contexts-response-example">
          <name>CONNECT-IP with http-datagram-contexts response example</name>
          <artwork><![CDATA[
:status = 200
capsule-protocol = ?1
http-datagram-contexts = max-templates=65535, derived=(0 1), checksum=?0, mtu=1500
]]></artwork>
        </figure>
        <t>In this example, both peers support reusable templates. The proxy supports a subset of derived fields (ipv4-total-length, ipv4-udp-length and ipv4-header-checksum) and the checksum offload. The client supports a different subset of derived fields (ipv4-total-length and ipv6-payload-length) without the checksum offload. Both endpoints indicate that the maximum packet size after reconstruction must not exceed 1500 bytes.</t>
      </section>
    </section>
    <section anchor="capsules">
      <name>Processing Context Capsules</name>
      <t>This specification defines multiple capsule types to construct, acknowledge, and delete processing contexts.</t>
      <section anchor="processing-context-overview">
        <name>Processing Context Overview</name>
        <section anchor="assign">
          <name>Processing Context Construction</name>
          <t>Processing contexts are created using capsules that define a new unique non-zero <tt>Context ID</tt> encoded as a variable-length integer. A Context ID <bcp14>MUST NOT</bcp14> be reused. As specified in <xref section="4" sectionFormat="of" target="CONNECT-UDP"/>, even-numbered Context IDs are allocated by the client and odd-numbered by the proxy.</t>
          <t>Each processing context <bcp14>MAY</bcp14> reference an already-defined parent context using <tt>Next Context ID</tt> encoded as a variable-length integer. A context <bcp14>MUST</bcp14> reference only a Context ID previously defined by the peer. Forward references are not permitted. Processing context without a parent is identified by <tt>Next Context ID</tt> set to 0. A processing chain <bcp14>MUST NOT</bcp14> contain more than one context of the same type. Other processing context chains can also have invalid combinations, if they include contradictory or mutually exclusive steps. Any capsule definition used for these contexts needs to define such cases if they are possible (such as for checksum offload contexts, <xref target="checksum"/>). A receiver that detects such an invalid processing chain condition <bcp14>MUST</bcp14> treat the context as malformed and follow the error-handling procedure defined in <xref section="3.3" sectionFormat="of" target="HTTP-DATAGRAMS"/>.</t>
          <t>A receiver of an *_ASSIGN capsule with an invalid <tt>Context ID</tt> or unknown <tt>Next Context ID</tt> <bcp14>MUST</bcp14> treat it as malformed and follow the error-handling procedure defined in <xref section="3.3" sectionFormat="of" target="HTTP-DATAGRAMS"/>.</t>
        </section>
        <section anchor="ack">
          <name>Processing Context Acknowledgement</name>
          <t>For each *_ASSIGN capsule received, the receiver <bcp14>MUST</bcp14> transmit the corresponding *_ACK capsule after successfully installing the context.</t>
          <t>Endpoints <bcp14>MAY</bcp14> transmit datagrams referencing contexts prior to receiving the *_ACK. A receiver <bcp14>MAY</bcp14> buffer datagrams referencing unknown Context IDs but <bcp14>MUST</bcp14> bound buffering by time and memory.</t>
          <t>A receiver of an *_ACK capsule with an unknown Context ID or any data after Context ID <bcp14>MUST</bcp14> treat it as malformed and follow the error-handling procedure defined in <xref section="3.3" sectionFormat="of" target="HTTP-DATAGRAMS"/>.</t>
        </section>
        <section anchor="close">
          <name>Processing Context Closure</name>
          <t>Processing Contexts are retired by sending corresponding *_CLOSE capsule. Closing a context implicitly closes all contexts that reference it directly or transitively.</t>
          <t>A receiver of a *_CLOSE capsule <bcp14>SHOULD</bcp14> retain the closed context and its descendants for a short period to allow in-flight datagrams to arrive, but <bcp14>MUST</bcp14> bound the retention time and memory usage.</t>
          <t>*_CLOSE capsules with unknown Context ID or any data after Context ID <bcp14>MUST</bcp14> be treated as malformed. Receiver of such capsules <bcp14>MUST</bcp14> follow the error-handling procedure defined in <xref section="3.3" sectionFormat="of" target="HTTP-DATAGRAMS"/>.</t>
        </section>
      </section>
      <section anchor="template-capsules">
        <name>Template Capsules</name>
        <section anchor="template-assign">
          <name>TEMPLATE_ASSIGN Capsule</name>
          <figure anchor="fig-template-assign-capsule">
            <name>TEMPLATE_ASSIGN Capsule Format</name>
            <artwork><![CDATA[
TEMPLATE_ASSIGN Capsule {
  Type (i) = 0x3ee3143f,
  Length (i),
  Context ID (i),
  Next Context ID (i),
  Static Segment (..) ...
}
]]></artwork>
          </figure>
          <t>The TEMPLATE_ASSIGN capsule contains a sequence of one or more Static Segments.</t>
          <figure anchor="fig-static-segment">
            <name>Static Segment Format</name>
            <artwork><![CDATA[
Static Segment {
  Segment Offset (i),
  Segment Length (i),
  Segment Payload (..),
}
]]></artwork>
          </figure>
          <t>Each Static Segment contains following fields:</t>
          <dl>
            <dt>Segment Offset:</dt>
            <dd>
              <t>Byte offset from the start of the reconstructed packet, encoded as a variable-length integer</t>
            </dd>
            <dt>Segment Length:</dt>
            <dd>
              <t>Length of the Segement Payload field, encoded as a variable-length integer</t>
            </dd>
            <dt>Segment Payload:</dt>
            <dd>
              <t>Static bytes to insert at the Segment Offset</t>
            </dd>
          </dl>
          <section anchor="parsing-and-validation">
            <name>Parsing and validation</name>
            <t>The receiver parses a TEMPLATE_ASSIGN capsule by reading, in order: the Context ID, the Next Context ID, and one or more static segments whose encodings consume exactly the remaining length of the capsule. Context ID and Next Context ID processing is described in <xref target="assign"/>.</t>
            <t>Each Static Segment consists of a Segment Offset, a Segment Length, and exactly Segment Length octets of Segment Payload. Static segments <bcp14>MUST</bcp14> appear in strictly increasing Segment Offset order and <bcp14>MUST NOT</bcp14> overlap. There <bcp14>MUST</bcp14> be at least 1 byte between consecutive segments.</t>
            <t>A receiver that advertised a <tt>max-templates-segments</tt> limit <bcp14>MUST</bcp14> ensure that the template does not contain more static segments. A receiver that advertised a <tt>mtu</tt> limit in <tt>http-datagram-contexts</tt> <bcp14>MUST</bcp14> ensure that the sum of Segment Offset and Segment Length of the final segment does not exceed the MTU limit. Final reconstructed packet size validation is performed during packet reconstruction (<xref target="reconstruction"/>). The capsule <bcp14>MUST</bcp14> end immediately after the last static segment.</t>
            <t>If any of the capsule fields are malformed upon reception, the receiver of the capsule <bcp14>MUST</bcp14> follow the error-handling procedure defined in <xref section="3.3" sectionFormat="of" target="HTTP-DATAGRAMS"/>.</t>
            <t>A receiver that has already accepted the maximum number of templates it advertised via the <tt>max-templates</tt> member in <tt>http-datagram-contexts</tt> <bcp14>MUST</bcp14> treat any additional TEMPLATE_ASSIGN capsule an error and <bcp14>MUST</bcp14> follow the same error-handling procedure.</t>
            <t>Per-packet validation uses the reconstruction procedure described in <xref target="reconstruction"/>.</t>
          </section>
        </section>
        <section anchor="templateack-capsule">
          <name>TEMPLATE_ACK Capsule</name>
          <figure anchor="fig-template-ack-capsule">
            <name>TEMPLATE_ACK Capsule Format</name>
            <artwork><![CDATA[
TEMPLATE_ACK Capsule {
  Type (i) = 0x3ee31440,
  Length (i),
  Context ID (i),
}
]]></artwork>
          </figure>
          <t>Processing of the TEMPLATE_ACK capsule is described in <xref target="ack"/></t>
        </section>
        <section anchor="templateclose-capsule">
          <name>TEMPLATE_CLOSE Capsule</name>
          <figure anchor="fig-template-close-capsule">
            <name>TEMPLATE_CLOSE Capsule Format</name>
            <artwork><![CDATA[
TEMPLATE_CLOSE Capsule {
  Type (i) = 0x3ee31441,
  Length (i),
  Context ID (i),
}
]]></artwork>
          </figure>
          <t>Processing of the TEMPLATE_CLOSE capsule is described in <xref target="close"/></t>
        </section>
      </section>
      <section anchor="derived-field-capsules">
        <name>Derived Field Capsules</name>
        <section anchor="derivedassign-capsule">
          <name>DERIVED_ASSIGN Capsule</name>
          <figure anchor="fig-derived-assign-capsule">
            <name>DERIVED_ASSIGN Capsule Format</name>
            <artwork><![CDATA[
DERIVED_ASSIGN Capsule {
  Type (i) = 0x3ee31442,
  Length (i),
  Context ID (i),
  Next Context ID (i),
  Derived Field Type (i) ...
}
]]></artwork>
          </figure>
          <t>The DERIVED_ASSIGN capsule defines a processing context that generates and inserts one or more derived fields into the reconstructed packet. The sender does not transmit these fields in the datagram payload.</t>
          <t>The Derived Field Types defined by this document and their reconstruction procedures are specified in <xref target="derived-field-definitions"/>. The numeric code points for these field types are registered in <xref target="iana-derived-fields"/>.</t>
          <section anchor="parsing-and-validation-1">
            <name>Parsing and validation</name>
            <t>The receiver parses a DERIVED_ASSIGN capsule by reading, in order: the Context ID, the Next Context ID, and one or more Derived Field Type values encoded as variable-length integers. Context ID and Next Context ID processing is described in <xref target="assign"/>.</t>
            <t>If a Derived Field Type is not present in the receiver's advertised <tt>derived</tt> capability list in <tt>http-datagram-contexts</tt> or if any Derived Field Type appears more than once in the capsule, the receiver <bcp14>MUST</bcp14> treat the capsule as malformed and follow the error-handling procedure defined in <xref section="3.3" sectionFormat="of" target="HTTP-DATAGRAMS"/>.</t>
            <t>Per-packet validation uses the reconstruction procedure described in <xref target="reconstruction"/>.</t>
          </section>
        </section>
        <section anchor="derivedack-capsule">
          <name>DERIVED_ACK Capsule</name>
          <figure anchor="fig-derived-ack-capsule">
            <name>DERIVED_ACK Capsule Format</name>
            <artwork><![CDATA[
DERIVED_ACK Capsule {
  Type (i) = 0x3ee31443,
  Length (i),
  Context ID (i),
}
]]></artwork>
          </figure>
          <t>Processing of the DERIVED_ACK capsule is described in <xref target="ack"/></t>
        </section>
        <section anchor="derivedclose-capsule">
          <name>DERIVED_CLOSE Capsule</name>
          <figure anchor="fig-derived-close-capsule">
            <name>DERIVED_CLOSE Capsule Format</name>
            <artwork><![CDATA[
DERIVED_CLOSE Capsule {
  Type (i) = 0x3ee31444,
  Length (i),
  Context ID (i),
}
]]></artwork>
          </figure>
          <t>Processing of the DERIVED_CLOSE capsule is described in <xref target="close"/></t>
        </section>
      </section>
      <section anchor="checksum">
        <name>Checksum Offload Capsules</name>
        <section anchor="checksumassign-capsule">
          <name>CHECKSUM_ASSIGN Capsule</name>
          <figure anchor="fig-checksum-assign-capsule">
            <name>CHECKSUM_ASSIGN Capsule Format</name>
            <artwork><![CDATA[
CHECKSUM_ASSIGN Capsule {
  Type (i) = 0x3ee31445,
  Length (i),
  Context ID (i),
  Next Context ID (i),
  Checksum Field Offset (i),
  Checksum Start Offset (i),
}
]]></artwork>
          </figure>
          <t>The CHECKSUM_ASSIGN capsule defines a processing context that completes an Internet checksum for the reconstructed packet using a sender-provided partial checksum.</t>
          <t>In addition to <tt>Context ID</tt> and <tt>Next Context ID</tt> CHECKSUM_ASSIGN capsule contains following fields encoded as variable-length integers:</t>
          <dl>
            <dt><tt>Checksum Field Offset</tt>:</dt>
            <dd>
              <t>Byte offset of the 16-bit Internet checksum field within the reconstructed packet</t>
            </dd>
            <dt><tt>Checksum Start Offset</tt>:</dt>
            <dd>
              <t>Byte offset where checksum coverage begins.  Coverage runs from this offset to the end of the reconstructed packet.</t>
            </dd>
          </dl>
          <section anchor="parsing-and-validation-2">
            <name>Parsing and validation</name>
            <t>The receiver parses a CHECKSUM_ASSIGN capsule by reading, in order: the Context ID, the Next Context ID, Checksum Field Offset and Checksum Start Offset. Context ID and Next Context ID processing is described in <xref target="assign"/>.</t>
            <t>If the peer did not advertise <tt>checksum=?1</tt> in <tt>http-datagram-contexts</tt>, the receiver <bcp14>MUST</bcp14> treat the capsule as malformed and follow the error-handling procedure defined in <xref section="3.3" sectionFormat="of" target="HTTP-DATAGRAMS"/>.</t>
            <t>If <tt>Checksum Start Offset</tt> is 0, the receiver <bcp14>MUST</bcp14> treat the capsule as malformed and follow the same error-handling procedure.</t>
            <t>Per-packet validation uses the reconstruction procedure described in <xref target="reconstruction"/>.</t>
            <t>Chaining a CHECKSUM_ASSIGN capsule with a DERIVED_ASSIGN capsule that defines derivation for a UDP or TCP checksum (<xref target="iana-derived-fields"/>) would create an invalid processing chain, as described in <xref target="assign"/>. Such chains <bcp14>MUST NOT</bcp14> be defined by senders, and <bcp14>MUST</bcp14> be treated as an error by receivers.</t>
          </section>
        </section>
        <section anchor="checksumack-capsule">
          <name>CHECKSUM_ACK Capsule</name>
          <figure anchor="fig-checksum-ack-capsule">
            <name>CHECKSUM_ACK Capsule Format</name>
            <artwork><![CDATA[
CHECKSUM_ACK Capsule {
  Type (i) = 0x3ee31446,
  Length (i),
  Context ID (i),
}
]]></artwork>
          </figure>
          <t>Processing of the CHECKSUM_ACK capsule is described in <xref target="ack"/></t>
        </section>
        <section anchor="checksumclose-capsule">
          <name>CHECKSUM_CLOSE Capsule</name>
          <figure anchor="fig-checksum-close-capsule">
            <name>CHECKSUM_CLOSE Capsule Format</name>
            <artwork><![CDATA[
CHECKSUM_CLOSE Capsule {
  Type (i) = 0x3ee31447,
  Length (i),
  Context ID (i),
}
]]></artwork>
          </figure>
          <t>Processing of the CHECKSUM_CLOSE capsule is described in <xref target="close"/></t>
        </section>
      </section>
    </section>
    <section anchor="processing-context-operation">
      <name>Processing Context Operation</name>
      <t>This section defines how endpoints construct and consume HTTP Datagram payloads using Processing Contexts.</t>
      <t>A datagram carries a Context Identifier that selects the initial Processing Context. A context <bcp14>MAY</bcp14> reference a parent context using Next Context ID. The complete behavior is defined by recursively following parent contexts until reaching Context ID 0.</t>
      <t>Context ID 0 indicates that no processing is applied and the payload is delivered unchanged to the underlying HTTP Datagram protocol.</t>
      <section anchor="sender-behavior">
        <name>Sender behavior</name>
        <t>When sending a datagram using a Processing Context, the sender constructs the payload so that the receiver can reconstruct the final packet after applying the processing chain.</t>
        <t>The sender <bcp14>MUST</bcp14> use a Context ID only after the corresponding *_ASSIGN capsule has been transmitted.</t>
        <section anchor="template-contexts">
          <name>Template Contexts</name>
          <t>If the selected context chain contains a Template context, the sender constructs the datagram payload as the concatenation of all variable byte regions not covered by static segments.</t>
          <t>Variable regions are emitted in strictly increasing offset order starting at offset 0.</t>
          <t>If the context chain contains no Template context, the payload <bcp14>MUST</bcp14> be the complete packet.</t>
        </section>
        <section anchor="derived-field-contexts">
          <name>Derived Field Contexts</name>
          <t>Derived fields are not transmitted by the sender. When a derived context is in use, the sender <bcp14>MUST</bcp14> remove the octets corresponding to derived fields from the datagram payload. These octets are supplied by the receiver during reconstruction.</t>
          <t>The sender <bcp14>MUST</bcp14> construct the payload as if the derived field octets were not part of the variable regions. That is, the payload <bcp14>MUST</bcp14> contain only the remaining variable octets in strictly increasing offset order.</t>
        </section>
        <section anchor="checksum-offload-contexts">
          <name>Checksum Offload Contexts</name>
          <t>If the context chain contains a checksum offload context, the sender <bcp14>MUST</bcp14> place a precomputed partial Internet checksum value into the checksum field at Checksum Field Offset in the reconstructed packet image prior to transmission. This value is combined with the receiver computation as described in <xref target="reconstruction"/>.</t>
        </section>
        <section anchor="context-selection">
          <name>Context Selection</name>
          <t>If a packet does not match any available Processing Context, the sender <bcp14>MUST</bcp14> use Context ID 0 and transmit the complete packet. In such cases, if the packet is transmitted in an HTTP/3 Datagram, it might not fit within the current path MTU towards the peer. When the packet is larger than sizes known to fit within the path MTU as HTTP/3 Datagrams, the sender <bcp14>SHOULD</bcp14> instead send the packet in a DATAGRAM Capsule according to <xref section="3.5" sectionFormat="of" target="HTTP-DATAGRAMS"/>, which will be encoded on the HTTP data stream and fragmented across QUIC packets if necessary.</t>
          <t>To avoid this suboptimal behavior, senders <bcp14>SHOULD</bcp14> define broad contexts that will be able to handle most or all expected traffic.</t>
        </section>
        <section anchor="template-composition">
          <name>Conservative Template Composition</name>
          <t>Reusable templates are most effective when they remain valid for many datagrams. Senders <bcp14>SHOULD</bcp14> construct templates conservatively by including only fields that are expected to remain stable for the lifetime of the Processing Context. Fields whose values can change during the lifetime of a flow <bcp14>SHOULD</bcp14> remain in the variable portion of the datagram unless the sender has specific knowledge that those fields will remain constant or be particularly frequent for some period of time.</t>
          <t>Fields that are commonly suitable for static segments include fields that identify the packet format or the flow, such as:</t>
          <ul spacing="normal">
            <li>
              <t>Ethernet source and destination addresses, when stable for the frame sequence</t>
            </li>
            <li>
              <t>EtherType</t>
            </li>
            <li>
              <t>802.1Q tag</t>
            </li>
            <li>
              <t>IP version</t>
            </li>
            <li>
              <t>Source and destination IP addresses</t>
            </li>
            <li>
              <t>IPv4 TTL / IPv6 Hop Limit</t>
            </li>
            <li>
              <t>IPv4 Protocol / IPv6 Next Header</t>
            </li>
            <li>
              <t>Source and destination transport ports</t>
            </li>
          </ul>
          <t>Fields that commonly vary during a flow, or that can be modified by endpoints or network devices, are generally poor candidates for static segments. Examples include:</t>
          <ul spacing="normal">
            <li>
              <t>IPv4 DSCP and ECN bits, and IPv6 Traffic Class</t>
            </li>
            <li>
              <t>IPv4 Identification</t>
            </li>
            <li>
              <t>IPv4 Flags and Fragment Offset, unless packets using the template are known not to be fragmented</t>
            </li>
            <li>
              <t>IPv6 Flow Label, unless the sender knows it is stable for the flow</t>
            </li>
            <li>
              <t>TCP Sequence Number</t>
            </li>
            <li>
              <t>TCP Acknowledgement Number</t>
            </li>
            <li>
              <t>TCP Flags</t>
            </li>
            <li>
              <t>TCP Window</t>
            </li>
            <li>
              <t>TCP Timestamp values</t>
            </li>
            <li>
              <t>Packet length fields</t>
            </li>
            <li>
              <t>Checksum fields</t>
            </li>
          </ul>
          <t>When a field can be represented as a Derived Field defined by this specification, implementations <bcp14>SHOULD</bcp14> prefer using the corresponding Derived Field instead of including that field in a static segment or transmitting it as part of the variable payload. Packet length fields and complete checksums are examples of fields that are generally better represented using Derived Fields when supported by the peer.</t>
          <t>The suitability of a field for inclusion in a static segment depends on the deployment and the traffic being carried. For example, some deployments might preserve DSCP values while others rewrite them, and some applications might intentionally vary the IPv6 Flow Label. Implementations are encouraged to prefer templates that remain valid across many datagrams, even if those templates omit fewer bytes than a more aggressive template.</t>
        </section>
      </section>
      <section anchor="reconstruction">
        <name>Receiver behavior</name>
        <t>Upon receiving an HTTP Datagram with a non-zero Context ID, the receiver retrieves the referenced Processing Context and recursively resolves its parent contexts until Context ID 0 is reached.</t>
        <t>If any referenced context is unknown, the receiver <bcp14>MAY</bcp14> buffer the datagram as described in <xref target="ack"/> or drop it.</t>
        <t>If multiple processing contexts are present in a chain, the receiver <bcp14>MUST</bcp14> apply them in the following order:</t>
        <ol spacing="normal" type="1"><li>
            <t>Template reconstruction (if present)</t>
          </li>
          <li>
            <t>Derived field processing (if present)</t>
          </li>
          <li>
            <t>Checksum offload processing (if present)</t>
          </li>
        </ol>
        <section anchor="template-reconstruction">
          <name>Template Reconstruction</name>
          <t>If a Template context is present, the receiver reconstructs the packet as follows:</t>
          <ol spacing="normal" type="1"><li>
              <t>Allocate a buffer large enough to contain the reconstructed packet.</t>
            </li>
            <li>
              <t>Insert static segment bytes at their specified offsets.</t>
            </li>
            <li>
              <t>Fill all remaining gaps using bytes from the datagram payload in strictly increasing offset order.</t>
            </li>
          </ol>
          <t>If payload bytes are exhausted before all gaps have been filled the datagram <bcp14>MUST</bcp14> be dropped.</t>
          <t>Packets larger than the advertised <tt>mtu</tt> in <tt>http-datagram-contexts</tt> <bcp14>MUST</bcp14> be dropped.</t>
        </section>
        <section anchor="derived-field-processing">
          <name>Derived Field Processing</name>
          <t>For each derived field present in the context chain, the receiver computes the field value and inserts it into the reconstructed packet at the location defined by the derived field type.</t>
          <t>Derived fields are inserted into the packet image and therefore increase the reconstructed packet size. The receiver <bcp14>MUST</bcp14> compute derived field values based on the final reconstructed packet size and structure.</t>
          <t>Initial field definitions and reconstruction procedures are specified in <xref target="derived-field-definitions"/>.</t>
          <t>If the required header cannot be located, the packet <bcp14>MUST</bcp14> be dropped.</t>
        </section>
        <section anchor="checksum-offload-processing">
          <name>Checksum Offload Processing</name>
          <t>If a checksum offload context is present, the receiver completes the Internet checksum after all derived fields have been inserted.</t>
          <t>The receiver completes the checksum as follows:</t>
          <ol spacing="normal" type="1"><li>
              <t>Treat the checksum field as zero.</t>
            </li>
            <li>
              <t>Compute the one's-complement sum from Checksum Start Offset to L.</t>
            </li>
            <li>
              <t>Add (fold) the 16-bit value currently present at the checksum field.</t>
            </li>
            <li>
              <t>Write the final one's-complement result to the checksum field.</t>
            </li>
          </ol>
          <t>If any offset exceeds the reconstructed packet length, the packet <bcp14>MUST</bcp14> be dropped.</t>
        </section>
      </section>
    </section>
    <section anchor="derived-field-definitions">
      <name>Derived Field Definitions</name>
      <t>This section defines the initial Derived Field Types registered by this document in <xref target="iana-derived-fields"/>.</t>
      <t>All offsets in this section are in octets from the beginning of the reconstructed packet or frame. All multi-octet integer fields are encoded in network byte order.</t>
      <t>For CONNECT-IP, the IP header starts at offset 0.</t>
      <t>For CONNECT-ETHERNET, the IP- and transport-layer Derived Field Types defined in this section apply to Ethernet II frames carrying IPv4 or IPv6, including frames with a single IEEE 802.1Q VLAN tag.</t>
      <t>For an untagged Ethernet II frame <xref target="IEEE802.3"/>, the EtherType field is located at offset 12 and the IP header starts at offset 14.</t>
      <t>For an Ethernet II frame with a single IEEE 802.1Q VLAN tag <xref target="IEEE802.1Q"/>, the Tag Protocol Identifier (TPID) field is located at offset 12 and has value 0x8100. The encapsulated EtherType field is located at offset 16 and the IP header starts at offset 18. Frames with multiple VLAN tags or other link-layer encapsulations are not processed by these Derived Field Types unless a future specification defines how the relevant network-layer header is located.</t>
      <t>The EtherType value 0x0800 identifies IPv4, and the EtherType value 0x86dd identifies IPv6. If the relevant EtherType does not identify the protocol required by the Derived Field Type, the sender <bcp14>MUST NOT</bcp14> use a Processing Context containing that Derived Field Type for the frame. If the receiver cannot locate the header required by a Derived Field Type in the selected Processing Context, the datagram <bcp14>MUST</bcp14> be dropped.</t>
      <t>When multiple derived fields are present in a processing chain, the receiver computes length fields before checksum fields. In particular, IPv4 Total Length, IPv6 Payload Length, and UDP Length fields are computed before IPv4 header, TCP, or UDP checksums.</t>
      <t>Where this section requires locating an upper-layer header in an IPv6 packet, the sender and receiver traverse the IPv6 Next Header chain starting from the fixed IPv6 header. The traversal follows extension headers that identify the following header using a Next Header field and whose length can be determined from the packet contents. If traversal encounters an IPv6 Fragment header before locating the required upper-layer header, or if traversal reaches a header whose following header cannot be determined, the required header is considered not located and derived field compression cannot be used.</t>
      <t>If a packet is too short to contain a field being derived, if a required protocol header cannot be located, or if a computed value cannot be represented in the target field, the packet <bcp14>MUST</bcp14> be dropped.</t>
      <section anchor="derived-ipv4-total-length">
        <name>IPv4 Total Length</name>
        <t>The <tt>ipv4-total-length</tt> field corresponds to the Total Length field of the IPv4 header defined in <xref section="3.1" sectionFormat="of" target="IPv4"/>.</t>
        <t>The field location is:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Field</th>
              <th align="left">Offset from start of IPv4 header</th>
              <th align="left">Length</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Total Length</td>
              <td align="left">2</td>
              <td align="left">2</td>
            </tr>
          </tbody>
        </table>
        <section anchor="sender-behavior-1">
          <name>Sender Behavior</name>
          <t>When using this Derived Field Type, the sender removes the IPv4 Total Length field from the datagram payload.</t>
          <t>The sender <bcp14>MUST</bcp14> only use this Derived Field Type for packets whose IPv4 header can be located according to the rules in <xref target="derived-field-definitions"/>. The sender <bcp14>MUST</bcp14> verify that the first four bits of the located IP header contain the IPv4 version value 4 before using this Derived Field Type.</t>
          <t>The sender <bcp14>MUST</bcp14> verify that the value of the IPv4 Total Length field in the original packet is equal to the number of octets from the start of the IPv4 header to the end of the IPv4 packet that will be reconstructed by the receiver. If the value does not match, the sender <bcp14>MUST NOT</bcp14> use this Derived Field Type for that packet.</t>
        </section>
        <section anchor="receiver-behavior">
          <name>Receiver Behavior</name>
          <t>The receiver locates the IPv4 header according to the rules in <xref target="derived-field-definitions"/>. The first four bits of the header <bcp14>MUST</bcp14> contain the IPv4 version value 4. The Internet Header Length (IHL) field <bcp14>MUST</bcp14> indicate an IPv4 header length of at least 20 octets and no larger than the reconstructed IPv4 packet.</t>
          <t>The receiver computes the field value as the number of octets from the start of the IPv4 header to the end of the reconstructed IPv4 packet. If the computed value is greater than 65535, the packet <bcp14>MUST</bcp14> be dropped.</t>
          <t>The receiver writes the computed value into the IPv4 Total Length field.</t>
        </section>
      </section>
      <section anchor="derived-ipv6-payload-length">
        <name>IPv6 Payload Length</name>
        <t>The <tt>ipv6-payload-length</tt> field corresponds to the Payload Length field of the IPv6 header defined in <xref section="3" sectionFormat="of" target="IPv6"/>.</t>
        <t>The field location is:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Field</th>
              <th align="left">Offset from start of IPv6 header</th>
              <th align="left">Length</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Payload Length</td>
              <td align="left">4</td>
              <td align="left">2</td>
            </tr>
          </tbody>
        </table>
        <section anchor="sender-behavior-2">
          <name>Sender Behavior</name>
          <t>When using this Derived Field Type, the sender removes the IPv6 Payload Length field from the datagram payload.</t>
          <t>The sender <bcp14>MUST</bcp14> only use this Derived Field Type for packets whose IPv6 header can be located according to the rules in <xref target="derived-field-definitions"/>. The sender <bcp14>MUST</bcp14> verify that the first four bits of the located IP header contain the IPv6 version value 6 before using this Derived Field Type.</t>
          <t>The sender <bcp14>MUST</bcp14> verify that the value of the IPv6 Payload Length field in the original packet is equal to the number of octets following the fixed 40-octet IPv6 header in the IPv6 packet that will be reconstructed by the receiver. If the value does not match, the sender <bcp14>MUST NOT</bcp14> use this Derived Field Type for that packet.</t>
          <t>This Derived Field Type does not support IPv6 jumbograms (<xref target="IPv6-JUMBO"/>). If the IPv6 Payload Length field in the original packet is zero, the sender <bcp14>MUST NOT</bcp14> use this Derived Field Type for that packet.</t>
        </section>
        <section anchor="receiver-behavior-1">
          <name>Receiver Behavior</name>
          <t>The receiver locates the IPv6 header according to the rules in <xref target="derived-field-definitions"/>. The first four bits of the header <bcp14>MUST</bcp14> contain the IPv6 version value 6.</t>
          <t>The receiver computes the field value as the number of octets following the fixed 40-octet IPv6 header in the reconstructed IPv6 packet. If the computed value is 0 or greater than 65535, the packet <bcp14>MUST</bcp14> be dropped.</t>
          <t>The receiver writes the computed value into the IPv6 Payload Length field.</t>
        </section>
      </section>
      <section anchor="derived-ipv4-udp-length">
        <name>UDP Length over IPv4</name>
        <t>The <tt>ipv4-udp-length</tt> field corresponds to the Length field of the UDP header defined in <xref target="UDP"/> when UDP is carried over IPv4.</t>
        <t>The field location is:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Field</th>
              <th align="left">Offset from start of UDP header</th>
              <th align="left">Length</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Length</td>
              <td align="left">4</td>
              <td align="left">2</td>
            </tr>
          </tbody>
        </table>
        <section anchor="sender-behavior-3">
          <name>Sender Behavior</name>
          <t>When using this Derived Field Type, the sender removes the UDP Length field from the datagram payload.</t>
          <t>The sender <bcp14>MUST</bcp14> only use this Derived Field Type for packets whose IPv4 header can be located according to the rules in <xref target="derived-field-definitions"/>. The sender <bcp14>MUST</bcp14> verify that the first four bits of the located IP header contain the IPv4 version value 4 before using this Derived Field Type.</t>
          <t>The sender <bcp14>MUST</bcp14> verify that the IPv4 Protocol field contains the UDP protocol number 17.</t>
          <t>The sender <bcp14>MUST</bcp14> verify that the IPv4 packet is not fragmented. In particular, the sender <bcp14>MUST</bcp14> verify that the More Fragments flag is 0 and that the Fragment Offset field is 0 before using this Derived Field Type.</t>
          <t>The sender determines the UDP header offset from the IPv4 Internet Header Length (IHL) field. The sender <bcp14>MUST</bcp14> verify that the IPv4 packet contains at least 8 octets starting at that offset.</t>
          <t>The sender <bcp14>MUST</bcp14> verify that the value of the UDP Length field in the original packet is equal to the number of octets from the start of the UDP header to the end of the IPv4 packet that will be reconstructed by the receiver. If the value does not match, the sender <bcp14>MUST NOT</bcp14> use this Derived Field Type for that packet.</t>
        </section>
        <section anchor="receiver-behavior-2">
          <name>Receiver Behavior</name>
          <t>The receiver locates the IPv4 header according to the rules in <xref target="derived-field-definitions"/>. The first four bits of the header <bcp14>MUST</bcp14> contain the IPv4 version value 4. The Internet Header Length (IHL) field <bcp14>MUST</bcp14> indicate an IPv4 header length of at least 20 octets and no larger than the reconstructed IPv4 packet.</t>
          <t>The IPv4 Protocol field <bcp14>MUST</bcp14> contain the UDP protocol number 17.</t>
          <t>The IPv4 packet <bcp14>MUST NOT</bcp14> be fragmented. The More Fragments flag <bcp14>MUST</bcp14> be 0 and the Fragment Offset field <bcp14>MUST</bcp14> be 0.</t>
          <t>The receiver determines the UDP header offset from the IPv4 Internet Header Length (IHL) field. If the reconstructed IPv4 packet does not contain at least 8 octets starting at that offset, the packet <bcp14>MUST</bcp14> be dropped.</t>
          <t>The receiver computes the UDP Length field as the number of octets from the start of the UDP header to the end of the reconstructed IPv4 packet. If the computed value is less than 8 or greater than 65535, the packet <bcp14>MUST</bcp14> be dropped.</t>
          <t>The receiver writes the computed value into the UDP Length field.</t>
        </section>
      </section>
      <section anchor="derived-ipv6-udp-length">
        <name>UDP Length over IPv6</name>
        <t>The <tt>ipv6-udp-length</tt> field corresponds to the Length field of the UDP header defined in <xref target="UDP"/> when UDP is carried over IPv6.</t>
        <t>The field location is:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Field</th>
              <th align="left">Offset from start of UDP header</th>
              <th align="left">Length</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Length</td>
              <td align="left">4</td>
              <td align="left">2</td>
            </tr>
          </tbody>
        </table>
        <section anchor="sender-behavior-4">
          <name>Sender Behavior</name>
          <t>When using this Derived Field Type, the sender removes the UDP Length field from the datagram payload.</t>
          <t>The sender <bcp14>MUST</bcp14> only use this Derived Field Type for packets whose IPv6 header can be located according to the rules in <xref target="derived-field-definitions"/>. The sender <bcp14>MUST</bcp14> verify that the first four bits of the located IP header contain the IPv6 version value 6 before using this Derived Field Type.</t>
          <t>The sender <bcp14>MUST</bcp14> locate the UDP header by traversing the IPv6 Next Header chain starting from the fixed IPv6 header. The sender <bcp14>MUST NOT</bcp14> use this Derived Field Type for a packet if this traversal does not identify a UDP header, if the UDP header is not fully contained in the IPv6 packet, or if the traversal encounters an IPv6 Fragment header before reaching the UDP header.</t>
          <t>The sender <bcp14>MUST</bcp14> verify that the value of the UDP Length field in the original packet is equal to the number of octets from the start of the UDP header to the end of the IPv6 packet that will be reconstructed by the receiver. If the value does not match, the sender <bcp14>MUST NOT</bcp14> use this Derived Field Type for that packet.</t>
        </section>
        <section anchor="receiver-behavior-3">
          <name>Receiver Behavior</name>
          <t>The receiver locates the IPv6 header according to the rules in <xref target="derived-field-definitions"/>. The first four bits of the header <bcp14>MUST</bcp14> contain the IPv6 version value 6.</t>
          <t>The receiver locates the UDP header by traversing the IPv6 Next Header chain starting from the fixed IPv6 header. If traversal does not identify a UDP header, if traversal encounters an IPv6 Fragment header before reaching the UDP header, or if the reconstructed IPv6 packet does not contain a complete UDP header at the resulting offset, the packet <bcp14>MUST</bcp14> be dropped.</t>
          <t>The receiver computes the UDP Length field as the number of octets from the start of the UDP header to the end of the reconstructed IPv6 packet. If the computed value is less than 8 or greater than 65535, the packet <bcp14>MUST</bcp14> be dropped.</t>
          <t>The receiver writes the computed value into the UDP Length field.</t>
        </section>
      </section>
      <section anchor="derived-ipv4-header-checksum">
        <name>IPv4 Header Checksum</name>
        <t>The <tt>ipv4-header-checksum</tt> field corresponds to the Header Checksum field of the IPv4 header defined in <xref section="3.1" sectionFormat="of" target="IPv4"/>.</t>
        <t>The field location is:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Field</th>
              <th align="left">Offset from start of IPv4 header</th>
              <th align="left">Length</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Header Checksum</td>
              <td align="left">10</td>
              <td align="left">2</td>
            </tr>
          </tbody>
        </table>
        <section anchor="sender-behavior-5">
          <name>Sender Behavior</name>
          <t>When using this Derived Field Type, the sender removes the IPv4 Header Checksum field from the datagram payload.</t>
          <t>The sender <bcp14>MUST</bcp14> only use this Derived Field Type for packets whose IPv4 header can be located according to the rules in <xref target="derived-field-definitions"/>. The sender <bcp14>MUST</bcp14> verify that the first four bits of the located IP header contain the IPv4 version value 4 before using this Derived Field Type.</t>
          <t>The sender <bcp14>MUST</bcp14> verify that the Internet Header Length (IHL) field indicates an IPv4 header length of at least 20 octets and no larger than the original IPv4 packet.</t>
          <t>The sender <bcp14>MUST</bcp14> verify that the value of the IPv4 Header Checksum field in the original packet is equal to the Internet checksum computed over the IPv4 header, with the IPv4 Header Checksum field treated as zero for the computation. If the value does not match, the sender <bcp14>MUST NOT</bcp14> use this Derived Field Type for that packet.</t>
        </section>
        <section anchor="receiver-behavior-4">
          <name>Receiver Behavior</name>
          <t>The receiver locates the IPv4 header according to the rules in <xref target="derived-field-definitions"/>. The first four bits of the header <bcp14>MUST</bcp14> contain the IPv4 version value 4. The Internet Header Length (IHL) field <bcp14>MUST</bcp14> indicate an IPv4 header length of at least 20 octets and no larger than the reconstructed IPv4 packet.</t>
          <t>The receiver computes the IPv4 header checksum over the IPv4 header, with the IPv4 Header Checksum field treated as zero for the computation.</t>
          <t>The receiver writes the computed value into the IPv4 Header Checksum field.</t>
        </section>
      </section>
      <section anchor="derived-ipv4-tcp-checksum">
        <name>TCP Checksum over IPv4</name>
        <t>The <tt>ipv4-tcp-checksum</tt> field corresponds to the Checksum field of the TCP header defined in <xref section="3.1" sectionFormat="of" target="TCP"/> when TCP is carried over IPv4.</t>
        <t>The field location is:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Field</th>
              <th align="left">Offset from start of TCP header</th>
              <th align="left">Length</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Checksum</td>
              <td align="left">16</td>
              <td align="left">2</td>
            </tr>
          </tbody>
        </table>
        <section anchor="sender-behavior-6">
          <name>Sender Behavior</name>
          <t>When using this Derived Field Type, the sender removes the TCP Checksum field from the datagram payload.</t>
          <t>The sender <bcp14>MUST</bcp14> only use this Derived Field Type for packets whose IPv4 header can be located according to the rules in <xref target="derived-field-definitions"/>. The sender <bcp14>MUST</bcp14> verify that the first four bits of the located IP header contain the IPv4 version value 4 before using this Derived Field Type.</t>
          <t>The sender <bcp14>MUST</bcp14> verify that the IPv4 Protocol field contains the TCP protocol number 6.</t>
          <t>The sender <bcp14>MUST</bcp14> verify that the IPv4 packet is not fragmented. In particular, the sender <bcp14>MUST</bcp14> verify that the More Fragments flag is 0 and that the Fragment Offset field is 0 before using this Derived Field Type.</t>
          <t>The sender determines the TCP header offset from the IPv4 Internet Header Length (IHL) field. The sender <bcp14>MUST</bcp14> verify that the IPv4 packet contains at least 20 octets starting at that offset.</t>
          <t>The sender <bcp14>MUST</bcp14> verify that the TCP Data Offset field indicates a TCP header length of at least 20 octets and no larger than the TCP segment contained in the IPv4 packet. The TCP header length is the value of the TCP Data Offset field multiplied by 4.</t>
          <t>The sender <bcp14>MUST</bcp14> verify that the value of the TCP Checksum field in the original packet is equal to the Internet checksum computed over the IPv4 pseudo-header, the TCP header, and the TCP payload, with the TCP Checksum field treated as zero for the computation. If the value does not match, the sender <bcp14>MUST NOT</bcp14> use this Derived Field Type for that packet.</t>
        </section>
        <section anchor="receiver-behavior-5">
          <name>Receiver Behavior</name>
          <t>The receiver locates the IPv4 header according to the rules in <xref target="derived-field-definitions"/>. The first four bits of the header <bcp14>MUST</bcp14> contain the IPv4 version value 4. The Internet Header Length (IHL) field <bcp14>MUST</bcp14> indicate an IPv4 header length of at least 20 octets and no larger than the reconstructed IPv4 packet.</t>
          <t>The IPv4 Protocol field <bcp14>MUST</bcp14> contain the TCP protocol number 6.</t>
          <t>The IPv4 packet <bcp14>MUST NOT</bcp14> be fragmented. The More Fragments flag <bcp14>MUST</bcp14> be 0 and the Fragment Offset field <bcp14>MUST</bcp14> be 0.</t>
          <t>The receiver determines the TCP header offset from the IPv4 Internet Header Length (IHL) field. If the reconstructed IPv4 packet does not contain at least 20 octets starting at that offset, the packet <bcp14>MUST</bcp14> be dropped.</t>
          <t>The TCP Data Offset field <bcp14>MUST</bcp14> indicate a TCP header length of at least 20 octets and no larger than the TCP segment contained in the reconstructed IPv4 packet. The TCP header length is the value of the TCP Data Offset field multiplied by 4.</t>
          <t>The receiver computes the TCP Checksum over the IPv4 pseudo-header, the TCP header, and the TCP payload, with the TCP Checksum field treated as zero for the computation.</t>
          <t>The receiver writes the computed value into the TCP Checksum field.</t>
        </section>
      </section>
      <section anchor="derived-ipv6-tcp-checksum">
        <name>TCP Checksum over IPv6</name>
        <t>The <tt>ipv6-tcp-checksum</tt> field corresponds to the Checksum field of the TCP header defined in <xref section="3.1" sectionFormat="of" target="TCP"/> when TCP is carried over IPv6.</t>
        <t>The field location is:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Field</th>
              <th align="left">Offset from start of TCP header</th>
              <th align="left">Length</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Checksum</td>
              <td align="left">16</td>
              <td align="left">2</td>
            </tr>
          </tbody>
        </table>
        <section anchor="sender-behavior-7">
          <name>Sender Behavior</name>
          <t>When using this Derived Field Type, the sender removes the TCP Checksum field from the datagram payload.</t>
          <t>The sender <bcp14>MUST</bcp14> only use this Derived Field Type for packets whose IPv6 header can be located according to the rules in <xref target="derived-field-definitions"/>. The sender <bcp14>MUST</bcp14> verify that the first four bits of the located IP header contain the IPv6 version value 6 before using this Derived Field Type.</t>
          <t>The sender <bcp14>MUST</bcp14> locate the TCP header by traversing the IPv6 Next Header chain starting from the fixed IPv6 header. The sender <bcp14>MUST NOT</bcp14> use this Derived Field Type for a packet if this traversal does not identify a TCP header, if the TCP header is not fully contained in the IPv6 packet, or if the traversal encounters an IPv6 Fragment header before reaching the TCP header.</t>
          <t>The sender <bcp14>MUST</bcp14> verify that the TCP Data Offset field indicates a TCP header length of at least 20 octets and no larger than the TCP segment contained in the IPv6 packet. The TCP header length is the value of the TCP Data Offset field multiplied by 4.</t>
          <t>The sender <bcp14>MUST</bcp14> verify that the value of the TCP Checksum field in the original packet is equal to the Internet checksum computed over the IPv6 pseudo-header, the TCP header, and the TCP payload, with the TCP Checksum field treated as zero for the computation. If the value does not match, the sender <bcp14>MUST NOT</bcp14> use this Derived Field Type for that packet.</t>
        </section>
        <section anchor="receiver-behavior-6">
          <name>Receiver Behavior</name>
          <t>The receiver locates the IPv6 header according to the rules in <xref target="derived-field-definitions"/>. The first four bits of the header <bcp14>MUST</bcp14> contain the IPv6 version value 6.</t>
          <t>The receiver locates the TCP header by traversing the IPv6 Next Header chain starting from the fixed IPv6 header. If traversal does not identify a TCP header, if traversal encounters an IPv6 Fragment header before reaching the TCP header, or if the reconstructed IPv6 packet does not contain a complete TCP header at the resulting offset, the packet <bcp14>MUST</bcp14> be dropped.</t>
          <t>The TCP Data Offset field <bcp14>MUST</bcp14> indicate a TCP header length of at least 20 octets and no larger than the TCP segment contained in the reconstructed IPv6 packet. The TCP header length is the value of the TCP Data Offset field multiplied by 4.</t>
          <t>The receiver computes the TCP Checksum over the IPv6 pseudo-header, the TCP header, and the TCP payload, with the TCP Checksum field treated as zero for the computation.</t>
          <t>The receiver writes the computed value into the TCP Checksum field.</t>
        </section>
      </section>
      <section anchor="derived-ipv4-udp-checksum">
        <name>UDP Checksum over IPv4</name>
        <t>The <tt>ipv4-udp-checksum</tt> field corresponds to the Checksum field of the UDP header defined in <xref target="UDP"/> when UDP is carried over IPv4.</t>
        <t>The field location is:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Field</th>
              <th align="left">Offset from start of UDP header</th>
              <th align="left">Length</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Checksum</td>
              <td align="left">6</td>
              <td align="left">2</td>
            </tr>
          </tbody>
        </table>
        <section anchor="sender-behavior-8">
          <name>Sender Behavior</name>
          <t>When using this Derived Field Type, the sender removes the UDP Checksum field from the datagram payload.</t>
          <t>The sender <bcp14>MUST</bcp14> only use this Derived Field Type for packets whose IPv4 header can be located according to the rules in <xref target="derived-field-definitions"/>. The sender <bcp14>MUST</bcp14> verify that the first four bits of the located IP header contain the IPv4 version value 4 before using this Derived Field Type.</t>
          <t>The sender <bcp14>MUST</bcp14> verify that the IPv4 Protocol field contains the UDP protocol number 17.</t>
          <t>The sender <bcp14>MUST</bcp14> verify that the IPv4 packet is not fragmented. In particular, the sender <bcp14>MUST</bcp14> verify that the More Fragments flag is 0 and that the Fragment Offset field is 0 before using this Derived Field Type.</t>
          <t>The sender determines the UDP header offset from the IPv4 Internet Header Length (IHL) field. The sender <bcp14>MUST</bcp14> verify that the IPv4 packet contains at least 8 octets starting at that offset.</t>
          <t>The sender <bcp14>MUST</bcp14> verify that the UDP Length field is at least 8 and no larger than the number of octets from the start of the UDP header to the end of the IPv4 packet.</t>
          <t>The sender <bcp14>MUST</bcp14> verify that the value of the UDP Checksum field in the original packet is equal to the Internet checksum computed over the IPv4 pseudo-header, the UDP header, and the UDP payload, with the UDP Checksum field treated as zero for the computation. If the computed checksum value is zero, the value to be compared is 0xffff. If the value does not match, the sender <bcp14>MUST NOT</bcp14> use this Derived Field Type for that packet.</t>
          <t>This Derived Field Type always generates a UDP checksum. The sender <bcp14>MUST NOT</bcp14> use this Derived Field Type for IPv4 UDP packets that use a UDP Checksum field value of zero to indicate that no checksum is present.</t>
        </section>
        <section anchor="receiver-behavior-7">
          <name>Receiver Behavior</name>
          <t>The receiver locates the IPv4 header according to the rules in <xref target="derived-field-definitions"/>. The first four bits of the header <bcp14>MUST</bcp14> contain the IPv4 version value 4. The Internet Header Length (IHL) field <bcp14>MUST</bcp14> indicate an IPv4 header length of at least 20 octets and no larger than the reconstructed IPv4 packet.</t>
          <t>The IPv4 Protocol field <bcp14>MUST</bcp14> contain the UDP protocol number 17.</t>
          <t>The IPv4 packet <bcp14>MUST NOT</bcp14> be fragmented. The More Fragments flag <bcp14>MUST</bcp14> be 0 and the Fragment Offset field <bcp14>MUST</bcp14> be 0.</t>
          <t>The receiver determines the UDP header offset from the IPv4 Internet Header Length (IHL) field. If the reconstructed IPv4 packet does not contain at least 8 octets starting at that offset, the packet <bcp14>MUST</bcp14> be dropped.</t>
          <t>The UDP Length field <bcp14>MUST</bcp14> be at least 8 and no larger than the number of octets from the start of the UDP header to the end of the reconstructed IPv4 packet.</t>
          <t>The receiver computes the UDP Checksum over the IPv4 pseudo-header, the UDP header, and the UDP payload, with the UDP Checksum field treated as zero for the computation. If the computed checksum value is zero, the receiver writes 0xffff into the UDP Checksum field. Otherwise, the receiver writes the computed value into the UDP Checksum field.</t>
        </section>
      </section>
      <section anchor="derived-ipv6-udp-checksum">
        <name>UDP Checksum over IPv6</name>
        <t>The <tt>ipv6-udp-checksum</tt> field corresponds to the Checksum field of the UDP header defined in <xref target="UDP"/> when UDP is carried over IPv6.</t>
        <t>The field location is:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Field</th>
              <th align="left">Offset from start of UDP header</th>
              <th align="left">Length</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Checksum</td>
              <td align="left">6</td>
              <td align="left">2</td>
            </tr>
          </tbody>
        </table>
        <section anchor="sender-behavior-9">
          <name>Sender Behavior</name>
          <t>When using this Derived Field Type, the sender removes the UDP Checksum field from the datagram payload.</t>
          <t>The sender <bcp14>MUST</bcp14> only use this Derived Field Type for packets whose IPv6 header can be located according to the rules in <xref target="derived-field-definitions"/>. The sender <bcp14>MUST</bcp14> verify that the first four bits of the located IP header contain the IPv6 version value 6 before using this Derived Field Type.</t>
          <t>The sender <bcp14>MUST</bcp14> locate the UDP header by traversing the IPv6 Next Header chain starting from the fixed IPv6 header. The sender <bcp14>MUST NOT</bcp14> use this Derived Field Type for a packet if this traversal does not identify a UDP header, if the UDP header is not fully contained in the IPv6 packet, or if the traversal encounters an IPv6 Fragment header before reaching the UDP header.</t>
          <t>The sender <bcp14>MUST</bcp14> verify that the UDP Length field is at least 8 and no larger than the number of octets from the start of the UDP header to the end of the IPv6 packet.</t>
          <t>The sender <bcp14>MUST</bcp14> verify that the value of the UDP Checksum field in the original packet is equal to the Internet checksum computed over the IPv6 pseudo-header, the UDP header, and the UDP payload, with the UDP Checksum field treated as zero for the computation. If the computed checksum value is zero, the value to be compared is 0xffff. If the value does not match, the sender <bcp14>MUST NOT</bcp14> use this Derived Field Type for that packet.</t>
        </section>
        <section anchor="receiver-behavior-8">
          <name>Receiver Behavior</name>
          <t>The receiver locates the IPv6 header according to the rules in <xref target="derived-field-definitions"/>. The first four bits of the header <bcp14>MUST</bcp14> contain the IPv6 version value 6.</t>
          <t>The receiver locates the UDP header by traversing the IPv6 Next Header chain starting from the fixed IPv6 header. If traversal does not identify a UDP header, if traversal encounters an IPv6 Fragment header before reaching the UDP header, or if the reconstructed IPv6 packet does not contain a complete UDP header at the resulting offset, the packet <bcp14>MUST</bcp14> be dropped.</t>
          <t>The UDP Length field <bcp14>MUST</bcp14> be at least 8 and no larger than the number of octets from the start of the UDP header to the end of the reconstructed IPv6 packet.</t>
          <t>The receiver computes the UDP Checksum over the IPv6 pseudo-header, the UDP header, and the UDP payload, with the UDP Checksum field treated as zero for the computation. If the computed checksum value is zero, the receiver writes 0xffff into the UDP Checksum field. Otherwise, the receiver writes the computed value into the UDP Checksum field.</t>
        </section>
      </section>
      <section anchor="derived-ethernet-fcs">
        <name>Ethernet Frame Check Sequence</name>
        <t>The <tt>ethernet-fcs</tt> field corresponds to the Frame Check Sequence (FCS) field of the Ethernet frame defined in <xref target="IEEE802.3"/>.</t>
        <t>This Derived Field Type applies only to CONNECT-ETHERNET.</t>
        <t>The field location is:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Field</th>
              <th align="left">Offset from start of Ethernet frame</th>
              <th align="left">Length</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Frame Check Sequence</td>
              <td align="left">Final 4 octets of frame</td>
              <td align="left">4</td>
            </tr>
          </tbody>
        </table>
        <section anchor="sender-behavior-10">
          <name>Sender behavior</name>
          <t>When using this Derived Field Type, the sender removes the Ethernet Frame Check Sequence field from the datagram payload.</t>
          <t>The sender <bcp14>MUST</bcp14> only use this Derived Field Type for Ethernet frames that contain an FCS field. The sender <bcp14>MUST</bcp14> verify that the original Ethernet frame is long enough to contain the Destination MAC Address, Source MAC Address, EtherType or length field, and FCS field before using this Derived Field Type.</t>
          <t>The sender <bcp14>MUST</bcp14> verify that the value of the FCS field in the original Ethernet frame is equal to the Ethernet Frame Check Sequence computed over the frame starting at the Destination MAC Address field and ending immediately before the FCS field. If the value does not match, the sender <bcp14>MUST NOT</bcp14> use this Derived Field Type for that frame.</t>
        </section>
        <section anchor="receiver-behavior-9">
          <name>Receiver Behavior</name>
          <t>The receiver verifies that the reconstructed Ethernet frame is long enough to contain the Destination MAC Address, Source MAC Address, EtherType or length field, and FCS field. If the reconstructed frame is too short, the datagram <bcp14>MUST</bcp14> be dropped.</t>
          <t>The receiver computes the Ethernet Frame Check Sequence over the reconstructed Ethernet frame starting at the Destination MAC Address field and ending immediately before the FCS field.</t>
          <t>The receiver writes the computed value into the Ethernet Frame Check Sequence field.</t>
        </section>
      </section>
    </section>
    <section anchor="examples">
      <name>Examples</name>
      <t>This section illustrates how contexts are created and how senders form compact payloads. All offsets and lengths are in bits in the packet diagrams and field tables. All offsets and lengths are in bytes in segment tables and sample capsules.</t>
      <t>The examples below are illustrative. Implementations are expected to follow <xref target="template-composition"/> and select static and variable fields based on the traffic being carried and the stability of those fields in the relevant deployment.</t>
      <section anchor="connect-ip-tcp-over-ipv6-with-template-derived-fields-and-checksum-offload">
        <name>CONNECT-IP: TCP over IPv6 with template, derived fields and checksum offload</name>
        <t>Original sample <xref target="TCP"/> over <xref target="IPv6"/> packet layout is illustrated below. In addition to basic IPv6 and TCP headers it contains Timestamp option as defined in <xref section="3" sectionFormat="of" target="TCP-PERF"/>.</t>
        <t>This packet is to be transmitted from the client to the proxy over CONNECT-IP.</t>
        <figure anchor="original-tcp-ipv6">
          <name>Example TCP over IPv6 packet before optimization</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="704" width="576" viewBox="0 0 576 704" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,32 L 8,688" fill="none" stroke="black"/>
                <path d="M 80,48 L 80,96" fill="none" stroke="black"/>
                <path d="M 80,448 L 80,496" fill="none" stroke="black"/>
                <path d="M 144,32 L 144,48" fill="none" stroke="black"/>
                <path d="M 144,544 L 144,592" fill="none" stroke="black"/>
                <path d="M 208,48 L 208,96" fill="none" stroke="black"/>
                <path d="M 280,32 L 280,48" fill="none" stroke="black"/>
                <path d="M 280,96 L 280,144" fill="none" stroke="black"/>
                <path d="M 280,304 L 280,352" fill="none" stroke="black"/>
                <path d="M 280,448 L 280,592" fill="none" stroke="black"/>
                <path d="M 416,32 L 416,48" fill="none" stroke="black"/>
                <path d="M 416,96 L 416,144" fill="none" stroke="black"/>
                <path d="M 416,544 L 416,592" fill="none" stroke="black"/>
                <path d="M 552,32 L 552,688" fill="none" stroke="black"/>
                <path d="M 568,64 L 568,96" fill="none" stroke="black"/>
                <path d="M 568,256 L 568,288" fill="none" stroke="black"/>
                <path d="M 568,320 L 568,400" fill="none" stroke="black"/>
                <path d="M 568,576 L 568,672" fill="none" stroke="black"/>
                <path d="M 8,48 L 552,48" fill="none" stroke="black"/>
                <path d="M 8,96 L 552,96" fill="none" stroke="black"/>
                <path d="M 8,144 L 552,144" fill="none" stroke="black"/>
                <path d="M 8,224 L 552,224" fill="none" stroke="black"/>
                <path d="M 8,304 L 552,304" fill="none" stroke="black"/>
                <path d="M 8,352 L 552,352" fill="none" stroke="black"/>
                <path d="M 8,400 L 552,400" fill="none" stroke="black"/>
                <path d="M 8,448 L 552,448" fill="none" stroke="black"/>
                <path d="M 8,496 L 552,496" fill="none" stroke="black"/>
                <path d="M 8,544 L 552,544" fill="none" stroke="black"/>
                <path d="M 8,592 L 552,592" fill="none" stroke="black"/>
                <path d="M 8,640 L 552,640" fill="none" stroke="black"/>
                <path d="M 8,688 L 552,688" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="576,672 564,666.4 564,677.6" fill="black" transform="rotate(90,568,672)"/>
                <polygon class="arrowhead" points="576,320 564,314.4 564,325.6" fill="black" transform="rotate(270,568,320)"/>
                <polygon class="arrowhead" points="576,288 564,282.4 564,293.6" fill="black" transform="rotate(90,568,288)"/>
                <polygon class="arrowhead" points="576,64 564,58.4 564,69.6" fill="black" transform="rotate(270,568,64)"/>
                <g class="text">
                  <text x="16" y="36">0</text>
                  <text x="136" y="36">7</text>
                  <text x="152" y="36">8</text>
                  <text x="268" y="36">15</text>
                  <text x="292" y="36">16</text>
                  <text x="404" y="36">23</text>
                  <text x="428" y="36">16</text>
                  <text x="540" y="36">31</text>
                  <text x="16" y="68">0</text>
                  <text x="32" y="68">1</text>
                  <text x="48" y="68">1</text>
                  <text x="64" y="68">0</text>
                  <text x="140" y="68">0x00</text>
                  <text x="376" y="68">0x4bcde</text>
                  <text x="40" y="84">Version</text>
                  <text x="120" y="84">Traffic</text>
                  <text x="176" y="84">Class</text>
                  <text x="348" y="84">Flow</text>
                  <text x="392" y="84">Label</text>
                  <text x="140" y="116">0x0020</text>
                  <text x="348" y="116">0x06</text>
                  <text x="484" y="116">0x79</text>
                  <text x="568" y="116">I</text>
                  <text x="112" y="132">Payload</text>
                  <text x="172" y="132">length</text>
                  <text x="316" y="132">Next</text>
                  <text x="364" y="132">header</text>
                  <text x="456" y="132">Hop</text>
                  <text x="496" y="132">limit</text>
                  <text x="568" y="132">P</text>
                  <text x="568" y="164">H</text>
                  <text x="280" y="180">2001:0db8:85a3:0000:0000:8a2e:0370:7334</text>
                  <text x="568" y="180">E</text>
                  <text x="244" y="196">Source</text>
                  <text x="304" y="196">Address</text>
                  <text x="568" y="196">A</text>
                  <text x="568" y="212">D</text>
                  <text x="568" y="228">E</text>
                  <text x="568" y="244">R</text>
                  <text x="280" y="260">2001:0db8:a42b:0000:0000:7c3a:143a:1529</text>
                  <text x="240" y="276">Destination</text>
                  <text x="320" y="276">Address</text>
                  <text x="140" y="324">0x0050</text>
                  <text x="412" y="324">0xd475</text>
                  <text x="124" y="340">Source</text>
                  <text x="172" y="340">port</text>
                  <text x="392" y="340">Destination</text>
                  <text x="460" y="340">port</text>
                  <text x="276" y="372">0x6caa4bd7</text>
                  <text x="252" y="388">Sequence</text>
                  <text x="316" y="388">number</text>
                  <text x="276" y="420">0x9b16794e</text>
                  <text x="568" y="420">T</text>
                  <text x="252" y="436">Acknowledgment</text>
                  <text x="340" y="436">number</text>
                  <text x="568" y="436">C</text>
                  <text x="568" y="452">P</text>
                  <text x="16" y="468">1</text>
                  <text x="32" y="468">0</text>
                  <text x="48" y="468">0</text>
                  <text x="64" y="468">0</text>
                  <text x="88" y="468">0</text>
                  <text x="104" y="468">0</text>
                  <text x="120" y="468">0</text>
                  <text x="136" y="468">0</text>
                  <text x="152" y="468">0</text>
                  <text x="168" y="468">0</text>
                  <text x="184" y="468">0</text>
                  <text x="200" y="468">1</text>
                  <text x="216" y="468">0</text>
                  <text x="232" y="468">0</text>
                  <text x="248" y="468">0</text>
                  <text x="264" y="468">0</text>
                  <text x="412" y="468">0x041e</text>
                  <text x="24" y="484">Hdr</text>
                  <text x="56" y="484">Len</text>
                  <text x="152" y="484">TCP</text>
                  <text x="192" y="484">Flags</text>
                  <text x="412" y="484">Window</text>
                  <text x="568" y="484">H</text>
                  <text x="568" y="500">E</text>
                  <text x="140" y="516">0x8f6b</text>
                  <text x="412" y="516">0x0000</text>
                  <text x="568" y="516">A</text>
                  <text x="140" y="532">Checksum</text>
                  <text x="380" y="532">Urgent</text>
                  <text x="440" y="532">Pointer</text>
                  <text x="568" y="532">D</text>
                  <text x="568" y="548">E</text>
                  <text x="76" y="564">0x01</text>
                  <text x="212" y="564">0x01</text>
                  <text x="348" y="564">0x08</text>
                  <text x="484" y="564">0x0a</text>
                  <text x="568" y="564">R</text>
                  <text x="48" y="580">No-Op</text>
                  <text x="100" y="580">Option</text>
                  <text x="184" y="580">No-Op</text>
                  <text x="236" y="580">Option</text>
                  <text x="320" y="580">TimeStamp</text>
                  <text x="388" y="580">Option</text>
                  <text x="484" y="580">Length</text>
                  <text x="276" y="612">0x119a5db3</text>
                  <text x="256" y="628">Timestamp</text>
                  <text x="320" y="628">value</text>
                  <text x="276" y="660">0xd9b4d48d</text>
                  <text x="232" y="676">Timestamp</text>
                  <text x="292" y="676">echo</text>
                  <text x="336" y="676">reply</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
|0              7|8             15|16            23|16            31|
+--------+-------+-------+--------+----------------+----------------+
|0 1 1 0 |     0x00      |                 0x4bcde                  | ^
|Version | Traffic Class |               Flow Label                 | |
+--------+---------------+--------+----------------+----------------+ |
|             0x0020              |      0x06      |      0x79      | I
|         Payload length          |  Next header   |   Hop limit    | P
+---------------------------------+----------------+----------------+
|                                                                   | H
|              2001:0db8:85a3:0000:0000:8a2e:0370:7334              | E
|                          Source Address                           | A
|                                                                   | D
+-------------------------------------------------------------------+ E
|                                                                   | R
|              2001:0db8:a42b:0000:0000:7c3a:143a:1529              | |
|                       Destination Address                         | |
|                                                                   | v
+---------------------------------+---------------------------------+
|             0x0050              |             0xd475              | ^
|           Source port           |        Destination port         | |
+---------------------------------+---------------------------------+ |
|                            0x6caa4bd7                             | |
|                          Sequence number                          | |
+-------------------------------------------------------------------+ |
|                            0x9b16794e                             | T
|                       Acknowledgment number                       | C
+--------+------------------------+---------------------------------+ P
|1 0 0 0 |0 0 0 0 0 0 0 1 0 0 0 0 |             0x041e              |
|Hdr Len |       TCP Flags        |             Window              | H
+--------+------------------------+---------------------------------+ E
|             0x8f6b              |             0x0000              | A
|            Checksum             |         Urgent Pointer          | D
+----------------+----------------+----------------+----------------+ E
|      0x01      |      0x01      |      0x08      |      0x0a      | R
|  No-Op Option  |  No-Op Option  |TimeStamp Option|     Length     | |
+----------------+----------------+----------------+----------------+ |
|                            0x119a5db3                             | |
|                          Timestamp value                          | |
+-------------------------------------------------------------------+ |
|                            0xd9b4d48d                             | |
|                       Timestamp echo reply                        | v
+-------------------------------------------------------------------+
]]></artwork>
          </artset>
        </figure>
        <t>This example assumes that the peer supports templates with at least two segments per template, IPv6 payload length derived field and checksum offloading. These capabilities were communicated using the following <tt>http-datagram-contexts</tt> HTTP field in proxy response confirming CONNECT-IP extended CONNECT.</t>
        <figure anchor="fig-http-datagram-contexts-example-1">
          <name>http-datagram-contexts response example</name>
          <artwork><![CDATA[
http-datagram-contexts = max-templates=1, max-templates-segments=2, derived=(1), checksum=?1, mtu=1500
]]></artwork>
        </figure>
        <t>Since the proxy does not support TCP checksum derivation, but it supports checksum offloading, the client calculates checksum of IPv6 pseudo-header and places it in the TCP checksum field. Context for the offloaded checksum is defined using the CHECKSUM_ASSIGN capsule:</t>
        <figure anchor="ipv6-tcp-checksum-assign">
          <name>CHECKSUM_ASSIGN Capsule for example IPv6/TCP packet</name>
          <artwork><![CDATA[
CHECKSUM_ASSIGN Capsule {
  Type (i) = 0x3ee31445,
  Length (i) = 4,
  Context ID (i) = 2,
  Next Context ID (i) = 0,
  Checksum Field Offset (i) = 56,
  Checksum Start Offset (i) = 40,
}
]]></artwork>
        </figure>
        <t>Payload length field in IPv6 header can derived by the peer, so it is removed before calculating static segments. Resulting context for the derived field is defined using DERIVED_ASSIGN capsule:</t>
        <figure anchor="ipv6-tcp-derived-assign">
          <name>DERIVED_ASSIGN Capsule for example IPv6/TCP packet</name>
          <artwork><![CDATA[
DERIVED_ASSIGN Capsule {
  Type (i) = 0x3ee31442,
  Length (i) = 3,
  Context ID (i) = 4,
  Next Context ID (i) = 2,
  Derived Field Type (i) = 1
}
]]></artwork>
        </figure>
        <t>The table below illustrates fields present in IPv6 and TCP headers after derived field was removed, their offsets in bits from the beginning of the packet and whether they are likely to be static for most packets of a given traffic flow</t>
        <table anchor="ipv6-tcp-fields">
          <name>IPv6 and TCP header fields in example packet</name>
          <thead>
            <tr>
              <th align="left">Offset</th>
              <th align="left">Field name</th>
              <th align="left">Length</th>
              <th align="left">Value</th>
              <th align="left">Static</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0</td>
              <td align="left">Version</td>
              <td align="left">4</td>
              <td align="left">0110b</td>
              <td align="left">Yes</td>
            </tr>
            <tr>
              <td align="left">4</td>
              <td align="left">Traffic Class</td>
              <td align="left">8</td>
              <td align="left">0x00</td>
              <td align="left">Yes</td>
            </tr>
            <tr>
              <td align="left">12</td>
              <td align="left">Flow label</td>
              <td align="left">20</td>
              <td align="left">0x4bcde</td>
              <td align="left">Yes</td>
            </tr>
            <tr>
              <td align="left">32</td>
              <td align="left">Next header</td>
              <td align="left">8</td>
              <td align="left">0x06</td>
              <td align="left">Yes</td>
            </tr>
            <tr>
              <td align="left">40</td>
              <td align="left">Hop limit</td>
              <td align="left">8</td>
              <td align="left">0x79</td>
              <td align="left">Yes</td>
            </tr>
            <tr>
              <td align="left">48</td>
              <td align="left">Source address</td>
              <td align="left">128</td>
              <td align="left">2001:0db8:85a3::8a2e:0370:7334</td>
              <td align="left">Yes</td>
            </tr>
            <tr>
              <td align="left">176</td>
              <td align="left">Destination address</td>
              <td align="left">128</td>
              <td align="left">2001:0db8:a42b::7c3a:143a:1529</td>
              <td align="left">Yes</td>
            </tr>
            <tr>
              <td align="left">304</td>
              <td align="left">Source port</td>
              <td align="left">16</td>
              <td align="left">0x0050</td>
              <td align="left">Yes</td>
            </tr>
            <tr>
              <td align="left">320</td>
              <td align="left">Destination port</td>
              <td align="left">16</td>
              <td align="left">0xd475</td>
              <td align="left">Yes</td>
            </tr>
            <tr>
              <td align="left">336</td>
              <td align="left">Sequence number</td>
              <td align="left">32</td>
              <td align="left">0x6caa4bd7</td>
              <td align="left">No</td>
            </tr>
            <tr>
              <td align="left">368</td>
              <td align="left">Acknowledgement number</td>
              <td align="left">32</td>
              <td align="left">0x9b16794e</td>
              <td align="left">No</td>
            </tr>
            <tr>
              <td align="left">400</td>
              <td align="left">TCP header length</td>
              <td align="left">4</td>
              <td align="left">1000b</td>
              <td align="left">Yes</td>
            </tr>
            <tr>
              <td align="left">404</td>
              <td align="left">TCP Flags</td>
              <td align="left">12</td>
              <td align="left">000000010000b</td>
              <td align="left">No</td>
            </tr>
            <tr>
              <td align="left">416</td>
              <td align="left">Window</td>
              <td align="left">16</td>
              <td align="left">0x041e</td>
              <td align="left">No</td>
            </tr>
            <tr>
              <td align="left">432</td>
              <td align="left">Checksum</td>
              <td align="left">16</td>
              <td align="left">0x8f6b</td>
              <td align="left">No</td>
            </tr>
            <tr>
              <td align="left">448</td>
              <td align="left">Urgent pointer</td>
              <td align="left">16</td>
              <td align="left">0x0000</td>
              <td align="left">Yes</td>
            </tr>
            <tr>
              <td align="left">464</td>
              <td align="left">No-Op option</td>
              <td align="left">8</td>
              <td align="left">0x01</td>
              <td align="left">Yes</td>
            </tr>
            <tr>
              <td align="left">472</td>
              <td align="left">No-Op option</td>
              <td align="left">8</td>
              <td align="left">0x01</td>
              <td align="left">Yes</td>
            </tr>
            <tr>
              <td align="left">480</td>
              <td align="left">Timestamp option</td>
              <td align="left">8</td>
              <td align="left">0x08</td>
              <td align="left">Yes</td>
            </tr>
            <tr>
              <td align="left">488</td>
              <td align="left">Timestamp option length</td>
              <td align="left">8</td>
              <td align="left">0x0a</td>
              <td align="left">Yes</td>
            </tr>
            <tr>
              <td align="left">496</td>
              <td align="left">Timestamp value</td>
              <td align="left">32</td>
              <td align="left">0x119a5db3</td>
              <td align="left">No</td>
            </tr>
            <tr>
              <td align="left">528</td>
              <td align="left">Timestamp echo reply</td>
              <td align="left">32</td>
              <td align="left">0xd9b4d48d</td>
              <td align="left">No</td>
            </tr>
          </tbody>
        </table>
        <t>Static segments model the invariant parts except for the isolated 4-bit TCP header length.</t>
        <t>Resulting static segments:</t>
        <table anchor="ipv6-tcp-segments">
          <name>Static segments for example IPv6/TCP packet</name>
          <thead>
            <tr>
              <th align="left">Segment Offset</th>
              <th align="left">Segment Length</th>
              <th align="left">Segment Contents</th>
              <th align="left">Segment Payload</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0</td>
              <td align="left">42</td>
              <td align="left">Version, Traffic Class, Flow Label, Next header, Hop limit, Source address, Destination address, Source port, Destination port</td>
              <td align="left">0x6004bcde067920010db885a3...</td>
            </tr>
            <tr>
              <td align="left">56</td>
              <td align="left">6</td>
              <td align="left">Urgent pointer, 2 No-Op TCP options, Timestamp option code and length</td>
              <td align="left">0x00000101080a</td>
            </tr>
          </tbody>
        </table>
        <t>Resulting TEMPLATE_ASSIGN capsule with client-allocated even context id is illustrated below:</t>
        <figure anchor="ipv6-tcp-template-assign">
          <name>TEMPLATE_ASSIGN Capsule for example IPv6/TCP packet</name>
          <artwork><![CDATA[
TEMPLATE_ASSIGN Capsule {
  Type (i) = 0x3ee3143f,
  Length (i) = 54,
  Context ID (i) = 6,
  Next Context ID (i) = 4,
  Static Segment {
    Segment Offset (i) = 0,
    Segment Length (i) = 42,
    Segment Payload = 0x6004bcde067920010db885a3000000008a2e0370733420010db8a42b000000007c3a143a15290050d475,
  },
  Static Segment {
    Segment Offset (i) = 56,
    Segment Length (i) = 6,
    Segment Payload = 0x00000101080a,
  }
}
]]></artwork>
        </figure>
        <t>The resulting processing context chain reduces per-packet overhead by removing 50 bytes of repeated header material, increasing the effective MTU when datagrams are encapsulated in QUIC DATAGRAM frames.</t>
        <t>The sender concatenates all variable regions in increasing offset order. Packets that do not match this template (for example packets with IPv6 extension headers or without TCP options) are sent using Context ID 0 or associated with a new context.</t>
        <t>Upon receiving the datagram with Context ID 6, proxy re-assembles the datagram by concatenating static and variable segments according to the offsets, re-calculates Payload Length and inserts it into IPv6 header and completes the TCP checksum using the sender-provided pseudo-header partial checksum.</t>
      </section>
      <section anchor="connect-ethernet-udp-over-ipv4-with-template-and-derived-fields">
        <name>CONNECT-ETHERNET: UDP over IPv4 with template and derived fields</name>
        <t>Original sample <xref target="UDP"/> over <xref target="IPv4"/> Ethernet frame layout is illustrated below.</t>
        <t>This frame is to be transmitted from the proxy to the client over CONNECT-ETHERNET.</t>
        <figure anchor="original-udp-ipv4-ethernet">
          <name>Example UDP over IPv4 Ethernet frame before optimization</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="640" width="576" viewBox="0 0 576 640" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,32 L 8,192" fill="none" stroke="black"/>
                <path d="M 8,224 L 8,624" fill="none" stroke="black"/>
                <path d="M 80,32 L 80,48" fill="none" stroke="black"/>
                <path d="M 80,240 L 80,288" fill="none" stroke="black"/>
                <path d="M 144,224 L 144,288" fill="none" stroke="black"/>
                <path d="M 144,336 L 144,384" fill="none" stroke="black"/>
                <path d="M 152,32 L 152,48" fill="none" stroke="black"/>
                <path d="M 152,144 L 152,192" fill="none" stroke="black"/>
                <path d="M 224,32 L 224,48" fill="none" stroke="black"/>
                <path d="M 280,224 L 280,384" fill="none" stroke="black"/>
                <path d="M 280,480 L 280,576" fill="none" stroke="black"/>
                <path d="M 296,32 L 296,48" fill="none" stroke="black"/>
                <path d="M 336,288 L 336,336" fill="none" stroke="black"/>
                <path d="M 368,32 L 368,48" fill="none" stroke="black"/>
                <path d="M 416,224 L 416,240" fill="none" stroke="black"/>
                <path d="M 440,32 L 440,144" fill="none" stroke="black"/>
                <path d="M 552,224 L 552,624" fill="none" stroke="black"/>
                <path d="M 568,256 L 568,272" fill="none" stroke="black"/>
                <path d="M 568,432 L 568,464" fill="none" stroke="black"/>
                <path d="M 568,496 L 568,528" fill="none" stroke="black"/>
                <path d="M 568,592 L 568,624" fill="none" stroke="black"/>
                <path d="M 8,48 L 440,48" fill="none" stroke="black"/>
                <path d="M 8,96 L 440,96" fill="none" stroke="black"/>
                <path d="M 8,144 L 440,144" fill="none" stroke="black"/>
                <path d="M 8,192 L 152,192" fill="none" stroke="black"/>
                <path d="M 8,240 L 552,240" fill="none" stroke="black"/>
                <path d="M 8,288 L 552,288" fill="none" stroke="black"/>
                <path d="M 8,336 L 552,336" fill="none" stroke="black"/>
                <path d="M 8,384 L 552,384" fill="none" stroke="black"/>
                <path d="M 8,432 L 552,432" fill="none" stroke="black"/>
                <path d="M 8,480 L 552,480" fill="none" stroke="black"/>
                <path d="M 8,528 L 552,528" fill="none" stroke="black"/>
                <path d="M 8,576 L 552,576" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="576,624 564,618.4 564,629.6" fill="black" transform="rotate(90,568,624)"/>
                <polygon class="arrowhead" points="576,496 564,490.4 564,501.6" fill="black" transform="rotate(270,568,496)"/>
                <polygon class="arrowhead" points="576,464 564,458.4 564,469.6" fill="black" transform="rotate(90,568,464)"/>
                <polygon class="arrowhead" points="576,256 564,250.4 564,261.6" fill="black" transform="rotate(270,568,256)"/>
                <g class="text">
                  <text x="16" y="36">0</text>
                  <text x="72" y="36">7</text>
                  <text x="88" y="36">8</text>
                  <text x="140" y="36">15</text>
                  <text x="164" y="36">16</text>
                  <text x="212" y="36">23</text>
                  <text x="236" y="36">24</text>
                  <text x="284" y="36">31</text>
                  <text x="308" y="36">32</text>
                  <text x="356" y="36">39</text>
                  <text x="380" y="36">40</text>
                  <text x="428" y="36">47</text>
                  <text x="176" y="68">Destination</text>
                  <text x="240" y="68">MAC</text>
                  <text x="288" y="68">address</text>
                  <text x="224" y="84">00:00:5E:00:53:01</text>
                  <text x="172" y="116">Source</text>
                  <text x="216" y="116">MAC</text>
                  <text x="264" y="116">address</text>
                  <text x="224" y="132">00:00:5E:00:53:02</text>
                  <text x="76" y="164">0x0800</text>
                  <text x="80" y="180">EtherType</text>
                  <text x="284" y="180">ETHERNET</text>
                  <text x="348" y="180">HEADER</text>
                  <text x="16" y="228">0</text>
                  <text x="136" y="228">7</text>
                  <text x="152" y="228">8</text>
                  <text x="268" y="228">15</text>
                  <text x="292" y="228">16</text>
                  <text x="404" y="228">23</text>
                  <text x="428" y="228">16</text>
                  <text x="540" y="228">31</text>
                  <text x="16" y="260">0</text>
                  <text x="32" y="260">1</text>
                  <text x="48" y="260">0</text>
                  <text x="64" y="260">0</text>
                  <text x="88" y="260">0</text>
                  <text x="104" y="260">1</text>
                  <text x="120" y="260">0</text>
                  <text x="136" y="260">1</text>
                  <text x="212" y="260">0x02</text>
                  <text x="412" y="260">0x04cc</text>
                  <text x="40" y="276">Version</text>
                  <text x="96" y="276">Hdr</text>
                  <text x="128" y="276">Len</text>
                  <text x="184" y="276">Traffic</text>
                  <text x="240" y="276">Class</text>
                  <text x="384" y="276">Total</text>
                  <text x="436" y="276">length</text>
                  <text x="568" y="292">I</text>
                  <text x="140" y="308">0x0000</text>
                  <text x="288" y="308">0</text>
                  <text x="304" y="308">1</text>
                  <text x="320" y="308">0</text>
                  <text x="344" y="308">0</text>
                  <text x="360" y="308">0</text>
                  <text x="376" y="308">0</text>
                  <text x="392" y="308">0</text>
                  <text x="408" y="308">0</text>
                  <text x="424" y="308">0</text>
                  <text x="440" y="308">0</text>
                  <text x="456" y="308">0</text>
                  <text x="472" y="308">0</text>
                  <text x="488" y="308">0</text>
                  <text x="504" y="308">0</text>
                  <text x="520" y="308">0</text>
                  <text x="536" y="308">0</text>
                  <text x="568" y="308">P</text>
                  <text x="140" y="324">Identification</text>
                  <text x="304" y="324">Flags</text>
                  <text x="412" y="324">Fragment</text>
                  <text x="476" y="324">offset</text>
                  <text x="568" y="340">H</text>
                  <text x="76" y="356">0x40</text>
                  <text x="212" y="356">0x11</text>
                  <text x="412" y="356">0xb21b</text>
                  <text x="568" y="356">E</text>
                  <text x="72" y="372">TTL</text>
                  <text x="212" y="372">Protocol</text>
                  <text x="380" y="372">Header</text>
                  <text x="444" y="372">checksum</text>
                  <text x="568" y="372">A</text>
                  <text x="568" y="388">D</text>
                  <text x="280" y="404">192.0.2.1</text>
                  <text x="568" y="404">E</text>
                  <text x="244" y="420">Source</text>
                  <text x="304" y="420">Address</text>
                  <text x="568" y="420">R</text>
                  <text x="280" y="452">192.0.2.2</text>
                  <text x="240" y="468">Destination</text>
                  <text x="320" y="468">Address</text>
                  <text x="140" y="500">0xc199</text>
                  <text x="412" y="500">0x1151</text>
                  <text x="124" y="516">Source</text>
                  <text x="172" y="516">port</text>
                  <text x="392" y="516">Destination</text>
                  <text x="460" y="516">port</text>
                  <text x="140" y="548">0x04b8</text>
                  <text x="412" y="548">0x72de</text>
                  <text x="568" y="548">U</text>
                  <text x="140" y="564">Length</text>
                  <text x="412" y="564">Checksum</text>
                  <text x="568" y="564">D</text>
                  <text x="568" y="580">P</text>
                  <text x="200" y="612">UDP</text>
                  <text x="248" y="612">payload</text>
                  <text x="304" y="612">(1200</text>
                  <text x="356" y="612">bytes)</text>
                  <text x="280" y="628">...</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
|0      7|8     15|16    23|24    31|32    39|40    47|
+--------+--------+--------+--------+--------+--------+
|               Destination MAC address               |
|                  00:00:5E:00:53:01                  |
+--------+--------+--------+--------+--------+--------+
|                 Source MAC address                  |
|                  00:00:5E:00:53:02                  |
+--------+--------+--------+--------+--------+--------+
|     0x0800      |
|    EtherType    |            ETHERNET HEADER
+-----------------+

|0              7|8             15|16            23|16            31|
+--------+-------+----------------+----------------+----------------+
|0 1 0 0 |0 1 0 1|      0x02      |             0x04cc              | ^
|Version |Hdr Len| Traffic Class  |          Total length           | |
+--------+-------+----------------+------+--------------------------+ I
|             0x0000              |0 1 0 |0 0 0 0 0 0 0 0 0 0 0 0 0 | P
|         Identification          |Flags |     Fragment offset      |
+----------------+----------------+------+--------------------------+ H
|      0x40      |      0x11      |             0xb21b              | E
|      TTL       |    Protocol    |         Header checksum         | A
+----------------+----------------+---------------------------------+ D
|                             192.0.2.1                             | E
|                          Source Address                           | R
+-------------------------------------------------------------------+ |
|                             192.0.2.2                             | |
|                       Destination Address                         | v
+---------------------------------+---------------------------------+
|             0xc199              |             0x1151              | ^
|           Source port           |        Destination port         | |
+---------------------------------+---------------------------------+ |
|             0x04b8              |             0x72de              | U
|             Length              |            Checksum             | D
+---------------------------------+---------------------------------+ P
|                                                                   | |
|                      UDP payload (1200 bytes)                     | |
|                                ...                                | v
]]></artwork>
          </artset>
        </figure>
        <t>This example assumes that the peer supports templates, IPv4 total length, IPv4 header checksum, UDP length in IPv4 packet and UDP checksum in IPv4 packet derived field. These capabilities were communicated using the following <tt>http-datagram-contexts</tt> HTTP field in client requesting CONNECT-ETHERNET extended CONNECT.</t>
        <figure anchor="fig-http-datagram-contexts-example-2">
          <name>http-datagram-contexts request example</name>
          <artwork><![CDATA[
http-datagram-contexts = max-templates=1, max-templates-segments=1, derived=(0 2 4 7), mtu=1500
]]></artwork>
        </figure>
        <t>Total length and header checksum in IPv4 header as well as length and checksum in UDP header can be derived by the peer, so these fields are removed before calculating static segments. Resulting context for the derived field is defined using DERIVED_ASSIGN capsule:</t>
        <figure anchor="ipv4-udp-ethernet-derived-assign">
          <name>DERIVED_ASSIGN Capsule for example IPv4/UDP ethernet frame</name>
          <artwork><![CDATA[
DERIVED_ASSIGN Capsule {
  Type (i) = 0x3ee31442,
  Length (i) = 6,
  Context ID (i) = 1,
  Next Context ID (i) = 0,
  Derived Field Type (i) = 0
  Derived Field Type (i) = 2
  Derived Field Type (i) = 4
  Derived Field Type (i) = 7
}
]]></artwork>
        </figure>
        <t>Table below illustrates fields present in Ethernet, IPv4 and UDP headers after derived fields were removed, their offsets in bits from the beginning of the frame and if they are likely to be static for most packets of a given traffic flow</t>
        <table anchor="ipv4-udp-ethernet-fields">
          <name>Ethernet, IPv4 and UDP header fields in example frame</name>
          <thead>
            <tr>
              <th align="left">Offset</th>
              <th align="left">Field name</th>
              <th align="left">Length</th>
              <th align="left">Value</th>
              <th align="left">Static</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0</td>
              <td align="left">Destination MAC address</td>
              <td align="left">48</td>
              <td align="left">00:00:5E:00:53:01</td>
              <td align="left">Yes</td>
            </tr>
            <tr>
              <td align="left">48</td>
              <td align="left">Source MAC address</td>
              <td align="left">48</td>
              <td align="left">00:00:5E:00:53:02</td>
              <td align="left">Yes</td>
            </tr>
            <tr>
              <td align="left">96</td>
              <td align="left">EtherType</td>
              <td align="left">16</td>
              <td align="left">0x0800</td>
              <td align="left">Yes</td>
            </tr>
            <tr>
              <td align="left">112</td>
              <td align="left">Version</td>
              <td align="left">4</td>
              <td align="left">0100b</td>
              <td align="left">Yes</td>
            </tr>
            <tr>
              <td align="left">116</td>
              <td align="left">Header length</td>
              <td align="left">4</td>
              <td align="left">0101b</td>
              <td align="left">Yes</td>
            </tr>
            <tr>
              <td align="left">120</td>
              <td align="left">Traffic Class</td>
              <td align="left">8</td>
              <td align="left">0x02</td>
              <td align="left">Yes</td>
            </tr>
            <tr>
              <td align="left">128</td>
              <td align="left">Identification</td>
              <td align="left">16</td>
              <td align="left">0x0000</td>
              <td align="left">Yes</td>
            </tr>
            <tr>
              <td align="left">144</td>
              <td align="left">Flags</td>
              <td align="left">3</td>
              <td align="left">010b</td>
              <td align="left">Yes</td>
            </tr>
            <tr>
              <td align="left">147</td>
              <td align="left">Fragment offset</td>
              <td align="left">13</td>
              <td align="left">0000000000000b</td>
              <td align="left">Yes</td>
            </tr>
            <tr>
              <td align="left">160</td>
              <td align="left">TTL</td>
              <td align="left">8</td>
              <td align="left">0x40</td>
              <td align="left">Yes</td>
            </tr>
            <tr>
              <td align="left">168</td>
              <td align="left">Protocol</td>
              <td align="left">8</td>
              <td align="left">0x11</td>
              <td align="left">Yes</td>
            </tr>
            <tr>
              <td align="left">176</td>
              <td align="left">Source address</td>
              <td align="left">32</td>
              <td align="left">192.0.2.1</td>
              <td align="left">Yes</td>
            </tr>
            <tr>
              <td align="left">208</td>
              <td align="left">Destination address</td>
              <td align="left">32</td>
              <td align="left">192.0.2.2</td>
              <td align="left">Yes</td>
            </tr>
            <tr>
              <td align="left">240</td>
              <td align="left">Source port</td>
              <td align="left">16</td>
              <td align="left">0xc199</td>
              <td align="left">Yes</td>
            </tr>
            <tr>
              <td align="left">256</td>
              <td align="left">Destination port</td>
              <td align="left">16</td>
              <td align="left">0x1151</td>
              <td align="left">Yes</td>
            </tr>
            <tr>
              <td align="left">272</td>
              <td align="left">UDP payload</td>
              <td align="left">9600</td>
              <td align="left">...</td>
              <td align="left">No</td>
            </tr>
          </tbody>
        </table>
        <t>A single static segment model can be used for the initial part of the HTTP datagram after derived fields were removed:</t>
        <table anchor="ipv4-udp-segment">
          <name>Static segment for example Ethernet/IPv4/UDP frame</name>
          <thead>
            <tr>
              <th align="left">Segment Offset</th>
              <th align="left">Segment Length</th>
              <th align="left">Segment Contents</th>
              <th align="left">Segment Payload</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0</td>
              <td align="left">34</td>
              <td align="left">Source MAC address, Destination MAC address, EtherType, Version, Header length and Traffic Class, Identification, Flags, Fragment offset, TTL, Protocol, Source address, Destination address, Source port and Destination port</td>
              <td align="left">0x00005E00530100005E00530208004502000040004011c0000201c0000202c1991151</td>
            </tr>
          </tbody>
        </table>
        <t>Resulting TEMPLATE_ASSIGN capsule with proxy-allocated odd Context ID is illustrated below:</t>
        <figure anchor="ipv4-udp-template-assign">
          <name>TEMPLATE_ASSIGN Capsule for example IPv4/UDP ethernet frame</name>
          <artwork><![CDATA[
TEMPLATE_ASSIGN Capsule {
  Type (i) = 0x3ee3143f,
  Length (i) = 38,
  Context ID (i) = 3,
  Next Context ID (i) = 1,
  Static Segment {
    Segment Offset (i) = 0,
    Segment Length (i) = 34,
    Segment Payload = 0x00005E00530100005E00530208004502000040004011c0000201c0000202c1991151,
  }
}
]]></artwork>
        </figure>
        <t>The resulting processing context chain reduces per-frame overhead by removing 34 bytes of repeated header material, increasing the effective MTU when datagrams are encapsulated in QUIC DATAGRAM frames.</t>
        <t>The sender concatenates all variable regions in increasing offset order.</t>
        <t>Upon receiving the datagram with Context ID 3, client re-assembles the datagram by appending variable segments to the static, re-calculates derived fields and inserts them at appropriate locations in the datagram.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>This specification changes how HTTP Datagrams are reconstructed but does not weaken transport-layer integrity or confidentiality protections provided by the underlying HTTP mapping. All Capsules travel on the reliable control stream and inherit those protections.</t>
      <section anchor="resource-exhaustion">
        <name>Resource Exhaustion</name>
        <t>Processing contexts introduce receiver state and reconstruction work. An attacker could attempt to exhaust memory or CPU by creating excessive numbers of templates and static segments, purposely sending datagrams referencing not-yet-installed contexts and causing excessive buffering of unknown Context IDs.</t>
        <t>Implementations <bcp14>MUST</bcp14> enforce limits on number of active templates and static segments and restrict memory used for buffering datagrams with unknown contexts.</t>
      </section>
      <section anchor="amplification">
        <name>Amplification</name>
        <t>Derived fields and template reconstruction increase the size of the reconstructed packet relative to the received datagram payload. An attacker could exploit this to amplify processing cost and perform a denial-of-service attack.</t>
        <t>Endpoints <bcp14>MUST</bcp14> ensure that reconstructed packet size does not exceed the negotiated MTU and <bcp14>SHOULD</bcp14> apply rate limiting when expansion ratios are abnormally high.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="http-capsule-types-registration">
        <name>HTTP Capsule Types Registration</name>
        <t>This specification registers the following values in the "HTTP Capsule Types" registry:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Value</th>
              <th align="left">Capsule Type</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0x3ee3143f</td>
              <td align="left">TEMPLATE_ASSIGN</td>
            </tr>
            <tr>
              <td align="left">0x3ee31440</td>
              <td align="left">TEMPLATE_ACK</td>
            </tr>
            <tr>
              <td align="left">0x3ee31441</td>
              <td align="left">TEMPLATE_CLOSE</td>
            </tr>
            <tr>
              <td align="left">0x3ee31442</td>
              <td align="left">DERIVED_ASSIGN</td>
            </tr>
            <tr>
              <td align="left">0x3ee31443</td>
              <td align="left">DERIVED_ACK</td>
            </tr>
            <tr>
              <td align="left">0x3ee31444</td>
              <td align="left">DERIVED_CLOSE</td>
            </tr>
            <tr>
              <td align="left">0x3ee31445</td>
              <td align="left">CHECKSUM_ASSIGN</td>
            </tr>
            <tr>
              <td align="left">0x3ee31446</td>
              <td align="left">CHECKSUM_ACK</td>
            </tr>
            <tr>
              <td align="left">0x3ee31447</td>
              <td align="left">CHECKSUM_CLOSE</td>
            </tr>
          </tbody>
        </table>
        <t>All of these new entries use the following values for these fields:</t>
        <dl>
          <dt>Status:</dt>
          <dd>
            <t>provisional (permanent if this document is approved)</t>
          </dd>
          <dt>Reference:</dt>
          <dd>
            <t>This document</t>
          </dd>
          <dt>Change Controller:</dt>
          <dd>
            <t>IETF</t>
          </dd>
          <dt>Contact:</dt>
          <dd>
            <t>MASQUE Working Group masque@ietf.org</t>
          </dd>
          <dt>Notes:</dt>
          <dd>
            <t>None</t>
          </dd>
        </dl>
      </section>
      <section anchor="http-field-name-registration">
        <name>HTTP Field Name Registration</name>
        <t>This specification registers the following value in the "HTTP Field Name" registry:</t>
        <ul spacing="normal">
          <li>
            <t>Field Name: http-datagram-contexts</t>
          </li>
          <li>
            <t>Status: provisional (permanent if approved)</t>
          </li>
          <li>
            <t>Structured Type: Dictionary</t>
          </li>
          <li>
            <t>Reference: This document</t>
          </li>
          <li>
            <t>Comments: None</t>
          </li>
        </ul>
      </section>
      <section anchor="iana-derived-fields">
        <name>HTTP Datagram Derived Field Types Registry</name>
        <t>IANA is requested to create a new registry titled "HTTP Datagram Derived Field Types". The registration policy is expert review as specified in <xref section="4.5" sectionFormat="of" target="IANA-POLICY"/>. This new registry governs the Derived Field types that appear in DERIVED_ASSIGN capsule and <tt>derived</tt> list of <tt>http-datagram-contexts</tt> dictionary.</t>
        <t>Registrations are expected to reference a specification that defines how the field is derived. Such specifications are expected to describe the sender behavior and receiver behavior for the Derived Field Type, including how the relevant packet or frame header is located, the offset and length of the field, how the field value is computed, and any conditions under which the Derived Field Type is not applicable.</t>
        <t>This new registry contains five columns:</t>
        <dl>
          <dt>Type:</dt>
          <dd>
            <t>A positive integer identifying the field type</t>
          </dd>
          <dt>Name:</dt>
          <dd>
            <t>A short name of the field</t>
          </dd>
          <dt>Description:</dt>
          <dd>
            <t>A description of the field</t>
          </dd>
          <dt>Protocols:</dt>
          <dd>
            <t>A list of HTTP Upgrade Tokens that the derived field type can apply</t>
          </dd>
          <dt>Reference:</dt>
          <dd>
            <t>An optional reference defining the use of the entry.</t>
          </dd>
        </dl>
        <t>The registry's initial entries are as follows:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Type</th>
              <th align="left">Name</th>
              <th align="left">Description</th>
              <th align="left">Protocols</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0</td>
              <td align="left">ipv4-total-length</td>
              <td align="left">IPv4 Total Length field derived from reconstructed packet size</td>
              <td align="left">connect-ip, connect-ethernet</td>
              <td align="left">This document</td>
            </tr>
            <tr>
              <td align="left">1</td>
              <td align="left">ipv6-payload-length</td>
              <td align="left">IPv6 Payload Length field derived from reconstructed packet size</td>
              <td align="left">connect-ip, connect-ethernet</td>
              <td align="left">This document</td>
            </tr>
            <tr>
              <td align="left">2</td>
              <td align="left">ipv4-udp-length</td>
              <td align="left">UDP Length derived from UDP header to end of IPv4 packet</td>
              <td align="left">connect-ip, connect-ethernet</td>
              <td align="left">This document</td>
            </tr>
            <tr>
              <td align="left">3</td>
              <td align="left">ipv6-udp-length</td>
              <td align="left">UDP Length derived from UDP header to end of IPv6 packet</td>
              <td align="left">connect-ip, connect-ethernet</td>
              <td align="left">This document</td>
            </tr>
            <tr>
              <td align="left">4</td>
              <td align="left">ipv4-header-checksum</td>
              <td align="left">IPv4 header checksum computed over IPv4 header</td>
              <td align="left">connect-ip, connect-ethernet</td>
              <td align="left">This document</td>
            </tr>
            <tr>
              <td align="left">5</td>
              <td align="left">ipv4-tcp-checksum</td>
              <td align="left">TCP checksum computed over IPv4 pseudo-header and segment</td>
              <td align="left">connect-ip, connect-ethernet</td>
              <td align="left">This document</td>
            </tr>
            <tr>
              <td align="left">6</td>
              <td align="left">ipv6-tcp-checksum</td>
              <td align="left">TCP checksum computed over IPv6 pseudo-header and segment</td>
              <td align="left">connect-ip, connect-ethernet</td>
              <td align="left">This document</td>
            </tr>
            <tr>
              <td align="left">7</td>
              <td align="left">ipv4-udp-checksum</td>
              <td align="left">UDP checksum computed over IPv4 pseudo-header and segment</td>
              <td align="left">connect-ip, connect-ethernet</td>
              <td align="left">This document</td>
            </tr>
            <tr>
              <td align="left">8</td>
              <td align="left">ipv6-udp-checksum</td>
              <td align="left">UDP checksum computed over IPv6 pseudo-header and segment</td>
              <td align="left">connect-ip, connect-ethernet</td>
              <td align="left">This document</td>
            </tr>
            <tr>
              <td align="left">9</td>
              <td align="left">ethernet-fcs</td>
              <td align="left">Ethernet Frame Check Sequence computed over the reconstructed Ethernet frame</td>
              <td align="left">connect-ethernet</td>
              <td align="left">This document</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="CONNECT-IP">
          <front>
            <title>Proxying IP in HTTP</title>
            <author fullname="T. Pauly" initials="T." role="editor" surname="Pauly"/>
            <author fullname="D. Schinazi" initials="D." surname="Schinazi"/>
            <author fullname="A. Chernyakhovsky" initials="A." surname="Chernyakhovsky"/>
            <author fullname="M. Kühlewind" initials="M." surname="Kühlewind"/>
            <author fullname="M. Westerlund" initials="M." surname="Westerlund"/>
            <date month="October" year="2023"/>
            <abstract>
              <t>This document describes how to proxy IP packets in HTTP. This protocol is similar to UDP proxying in HTTP but allows transmitting arbitrary IP packets. More specifically, this document defines a protocol that allows an HTTP client to create an IP tunnel through an HTTP server that acts as an IP proxy. This document updates RFC 9298.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9484"/>
          <seriesInfo name="DOI" value="10.17487/RFC9484"/>
        </reference>
        <reference anchor="HTTP-DATAGRAMS">
          <front>
            <title>HTTP Datagrams and the Capsule Protocol</title>
            <author fullname="D. Schinazi" initials="D." surname="Schinazi"/>
            <author fullname="L. Pardue" initials="L." surname="Pardue"/>
            <date month="August" year="2022"/>
            <abstract>
              <t>This document describes HTTP Datagrams, a convention for conveying multiplexed, potentially unreliable datagrams inside an HTTP connection.</t>
              <t>In HTTP/3, HTTP Datagrams can be sent unreliably using the QUIC DATAGRAM extension. When the QUIC DATAGRAM frame is unavailable or undesirable, HTTP Datagrams can be sent using the Capsule Protocol, which is a more general convention for conveying data in HTTP connections.</t>
              <t>HTTP Datagrams and the Capsule Protocol are intended for use by HTTP extensions, not applications.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9297"/>
          <seriesInfo name="DOI" value="10.17487/RFC9297"/>
        </reference>
        <reference anchor="CONNECT-ETHERNET">
          <front>
            <title>Proxying Ethernet Frames in HTTP</title>
            <author fullname="Alejandro Sedeño" initials="A." surname="Sedeño">
              <organization>Google LLC</organization>
            </author>
            <date day="30" month="June" year="2026"/>
            <abstract>
              <t>   This document describes how to proxy Ethernet frames in HTTP.  This
   protocol is similar to IP proxying in HTTP, but for Layer 2 instead
   of Layer 3.  More specifically, this document defines a protocol that
   allows an HTTP client to create a tunnel to exchange Layer 2 Ethernet
   frames through an HTTP server with an attached physical or virtual
   Ethernet segment.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-masque-connect-ethernet-10"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that 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="CONNECT-UDP">
          <front>
            <title>Proxying UDP in HTTP</title>
            <author fullname="D. Schinazi" initials="D." surname="Schinazi"/>
            <date month="August" year="2022"/>
            <abstract>
              <t>This document describes how to proxy UDP in HTTP, similar to how the HTTP CONNECT method allows proxying TCP in HTTP. More specifically, this document defines a protocol that allows an HTTP client to create a tunnel for UDP communications through an HTTP server that acts as a proxy.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9298"/>
          <seriesInfo name="DOI" value="10.17487/RFC9298"/>
        </reference>
        <reference anchor="INCREMENTAL-CHECKSUM">
          <front>
            <title>Computation of the Internet Checksum via Incremental Update</title>
            <author fullname="A. Rijsinghani" initials="A." role="editor" surname="Rijsinghani"/>
            <date month="May" year="1994"/>
            <abstract>
              <t>This memo describes an updated technique for incremental computation of the standard Internet checksum. It updates the method described in RFC 1141. This memo provides information for the Internet community. This memo does not specify an Internet standard of any kind.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="1624"/>
          <seriesInfo name="DOI" value="10.17487/RFC1624"/>
        </reference>
        <reference anchor="STRUCTURED-HTTP">
          <front>
            <title>Structured Field Values for HTTP</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <author fullname="P-H. Kamp" surname="P-H. Kamp"/>
            <date month="February" year="2021"/>
            <abstract>
              <t>This document describes a set of data types and associated algorithms that are intended to make it easier and safer to define and handle HTTP header and trailer fields, known as "Structured Fields", "Structured Headers", or "Structured Trailers". It is intended for use by specifications of new HTTP fields that wish to use a common syntax that is more restrictive than traditional HTTP field values.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8941"/>
          <seriesInfo name="DOI" value="10.17487/RFC8941"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="IEEE802.3">
          <front>
            <title>IEEE Standard for Ethernet</title>
            <author>
              <organization/>
            </author>
            <date month="July" year="2022"/>
          </front>
          <seriesInfo name="DOI" value="10.1109/ieeestd.2022.9844436"/>
          <seriesInfo name="ISBN" value="[&quot;9781504487252&quot;]"/>
          <refcontent>IEEE</refcontent>
        </reference>
        <reference anchor="IEEE802.1Q">
          <front>
            <title>IEEE Standard for Local and Metropolitan Area Networks--Bridges and Bridged Networks</title>
            <author>
              <organization/>
            </author>
            <date month="December" year="2022"/>
          </front>
          <seriesInfo name="DOI" value="10.1109/ieeestd.2022.10004498"/>
          <seriesInfo name="ISBN" value="[&quot;9781504491884&quot;]"/>
          <refcontent>IEEE</refcontent>
        </reference>
        <reference anchor="IPv4">
          <front>
            <title>Internet Protocol</title>
            <author fullname="J. Postel" initials="J." surname="Postel"/>
            <date month="September" year="1981"/>
          </front>
          <seriesInfo name="STD" value="5"/>
          <seriesInfo name="RFC" value="791"/>
          <seriesInfo name="DOI" value="10.17487/RFC0791"/>
        </reference>
        <reference anchor="IPv6">
          <front>
            <title>Internet Protocol, Version 6 (IPv6) Specification</title>
            <author fullname="S. Deering" initials="S." surname="Deering"/>
            <author fullname="R. Hinden" initials="R." surname="Hinden"/>
            <date month="July" year="2017"/>
            <abstract>
              <t>This document specifies version 6 of the Internet Protocol (IPv6). It obsoletes RFC 2460.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="86"/>
          <seriesInfo name="RFC" value="8200"/>
          <seriesInfo name="DOI" value="10.17487/RFC8200"/>
        </reference>
        <reference anchor="IPv6-JUMBO">
          <front>
            <title>IPv6 Jumbograms</title>
            <author fullname="D. Borman" initials="D." surname="Borman"/>
            <author fullname="S. Deering" initials="S." surname="Deering"/>
            <author fullname="R. Hinden" initials="R." surname="Hinden"/>
            <date month="August" year="1999"/>
            <abstract>
              <t>This document describes the IPv6 Jumbo Payload option, which provides the means of specifying such large payload lengths. It also describes the changes needed to TCP and UDP to make use of jumbograms. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2675"/>
          <seriesInfo name="DOI" value="10.17487/RFC2675"/>
        </reference>
        <reference anchor="UDP">
          <front>
            <title>User Datagram Protocol</title>
            <author fullname="J. Postel" initials="J." surname="Postel"/>
            <date month="August" year="1980"/>
          </front>
          <seriesInfo name="STD" value="6"/>
          <seriesInfo name="RFC" value="768"/>
          <seriesInfo name="DOI" value="10.17487/RFC0768"/>
        </reference>
        <reference anchor="TCP">
          <front>
            <title>Transmission Control Protocol (TCP)</title>
            <author fullname="W. Eddy" initials="W." role="editor" surname="Eddy"/>
            <date month="August" year="2022"/>
            <abstract>
              <t>This document specifies the Transmission Control Protocol (TCP). TCP is an important transport-layer protocol in the Internet protocol stack, and it has continuously evolved over decades of use and growth of the Internet. Over this time, a number of changes have been made to TCP as it was specified in RFC 793, though these have only been documented in a piecemeal fashion. This document collects and brings those changes together with the protocol specification from RFC 793. This document obsoletes RFC 793, as well as RFCs 879, 2873, 6093, 6429, 6528, and 6691 that updated parts of RFC 793. It updates RFCs 1011 and 1122, and it should be considered as a replacement for the portions of those documents dealing with TCP requirements. It also updates RFC 5961 by adding a small clarification in reset handling while in the SYN-RECEIVED state. The TCP header control bits from RFC 793 have also been updated based on RFC 3168.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="7"/>
          <seriesInfo name="RFC" value="9293"/>
          <seriesInfo name="DOI" value="10.17487/RFC9293"/>
        </reference>
        <reference anchor="TCP-PERF">
          <front>
            <title>TCP Extensions for High Performance</title>
            <author fullname="D. Borman" initials="D." surname="Borman"/>
            <author fullname="B. Braden" initials="B." surname="Braden"/>
            <author fullname="V. Jacobson" initials="V." surname="Jacobson"/>
            <author fullname="R. Scheffenegger" initials="R." role="editor" surname="Scheffenegger"/>
            <date month="September" year="2014"/>
            <abstract>
              <t>This document specifies a set of TCP extensions to improve performance over paths with a large bandwidth * delay product and to provide reliable operation over very high-speed paths. It defines the TCP Window Scale (WS) option and the TCP Timestamps (TS) option and their semantics. The Window Scale option is used to support larger receive windows, while the Timestamps option can be used for at least two distinct mechanisms, Protection Against Wrapped Sequences (PAWS) and Round-Trip Time Measurement (RTTM), that are also described herein.</t>
              <t>This document obsoletes RFC 1323 and describes changes from it.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7323"/>
          <seriesInfo name="DOI" value="10.17487/RFC7323"/>
        </reference>
        <reference anchor="IANA-POLICY">
          <front>
            <title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
            <author fullname="M. Cotton" initials="M." surname="Cotton"/>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <author fullname="T. Narten" initials="T." surname="Narten"/>
            <date month="June" year="2017"/>
            <abstract>
              <t>Many protocols make use of points of extensibility that use constants to identify various protocol parameters. To ensure that the values in these fields do not have conflicting uses and to promote interoperability, their allocations 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 describing the conditions under which new values should be assigned, as well as when and how modifications to existing values can be made, is needed. This document defines a framework for the documentation of these guidelines by specification authors, in order to assure that the provided guidance for the IANA Considerations is clear and addresses the various issues that are likely in the operation of a registry.</t>
              <t>This is the third edition of this document; it obsoletes RFC 5226.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="26"/>
          <seriesInfo name="RFC" value="8126"/>
          <seriesInfo name="DOI" value="10.17487/RFC8126"/>
        </reference>
      </references>
    </references>
    <?line 1287?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
Jbnp0nFs1CJKHTCF6cs19elsloxT4Hl08R3hwQH/rpQYrnW/mQ5DiE4VvVXl
yNcnoRrvlIZH1/W+st5+vRRcTxiaHtai5u7I5Pph4w04GF1fo24c9S6kSafT
JUyTlEa8fMK5Sm6kxDhe0QEv1XXKeOssa+qjhWKGJV8Mo+6ewU94pdWFVqzj
6puqWVFL+fpBvv2ZVQe8m3KDzujiMtRYJS+Bv+N7qGimEd/WkZSCVH1r5TDB
KxWpHzV5QHbN7YrW5cdcExHEa/A25088NN0RoW5+wyf6uk2annerVvD+Sa1u
lfa1l879xDr1Qu7lMNdTsp5i7tbZobwC43FjrU0m0KzcRJGNK3dcNRqvFc8V
xH78yKmr1CtoG9Av/KVuU4pX+ZKsVUNaY8Y5hVnj8ZhvxUZ7Ly5h8gQXjmyS
MuiiNR1yNBe74g3f6or52jLA0E3r6ODNMyqluNWzlCD7hgDkF/Z17lrKj0Ap
yvTlUvMi/7DimRqkQn+//fZbFMfl+WnjshM5P48vt52/u48uuwP7QW/Le7DV
vWz8qSU/f6r5v/ml/gHC0oV/8Dw7/nQ+dAS4y8j/6XzoD0fjpPIcmv5n4/Jv
YmZeuncOV/oxt5MG+gnMqvL3BrOCftxhcVq9jj+aejXwHjx+oh4cWv2oiqAi
jex+yCoW24v7wZupp3gzNbc4alSArPxstFpV5F/75zJ67vfT63S6O53xcHtn
+1G8tdOBH/7PdtxLdjpbjzs7j7e2+n4/B+vgEamuBNs6eHZvaV77G2D56p8/
rZ/XNeB5U4/nuN8bWnh+PNqKd7p9/M+j3hO/H5+azY+tRlyF6XX9XOfnMjq/
CTVXWwT26KPwHtUtxv3Hj/wW/+n0I2RH1aMD/dgIc9o4vOdzZnUVljsfBqM4
7g/Hj9e1umq1tLomzqG1/dzOrrhyXk+G3cHjJ/2AgHDgOantx1ziTvrZ2qld
Rnv1suJa63XUuET5h/9cdiL7n67+rUKp/a43TcDO8zHFz3VjffW8gdn+4Zvo
/Vk9v6VZ+Tys82F7Mhj6o3mz6nQq+8/jzdrFFe7nbXGKK3eU4w2Phd0iwJtv
8sDMC8DtOsOHHmz7D2L1gHjzq7z1eh69ZhUxqj5ANfKY1Eh+xP28MApAcHfd
aF5X7q5u90n8aDzcWtfqKq5h1GI2Cdf284W4xvjJsD/ub49vPC8zqWR0luNd
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

-->

</rfc>
