<?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.3.8) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-core-groupcomm-proxy-07" category="std" consensus="true" submissionType="IETF" updates="7252" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.0 -->
  <front>
    <title abbrev="Proxy Operations for Group Communication">Proxy Operations in Group Communication for the Constrained Application Protocol (CoAP)</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-core-groupcomm-proxy-07"/>
    <author initials="M." surname="Tiloca" fullname="Marco Tiloca">
      <organization>RISE AB</organization>
      <address>
        <postal>
          <street>Isafjordsgatan 22</street>
          <city>Kista</city>
          <code>164 40</code>
          <country>Sweden</country>
        </postal>
        <email>marco.tiloca@ri.se</email>
      </address>
    </author>
    <author initials="E." surname="Dijk" fullname="Esko Dijk">
      <organization>IoTconsultancy.nl</organization>
      <address>
        <postal>
          <city>Utrecht</city>
          <country>The Netherlands</country>
        </postal>
        <email>esko.dijk@iotconsultancy.nl</email>
      </address>
    </author>
    <date year="2026" month="September" day="02"/>
    <workgroup>CoRE Working Group</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 78?>

<t>This document defines a specific realization of proxy intended for scenarios that use group communication for the Constrained Application Protocol (CoAP). Such a proxy processes a single request sent by a client typically over unicast and distributes the request to a group of servers, e.g., over UDP/IP multicast as the defined default transport protocol. Then, the proxy collects the individual responses from those servers and relays those responses back to the client, in a way that allows the client to distinguish the responses and their origin servers through embedded addressing information. This document updates RFC7252 with respect to caching of response messages at proxies.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Discussion of this document takes place on the
    Constrained RESTful Environments Working Group mailing list (core@ietf.org),
    which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/core/"/>.</t>
      <t>Source for this draft and an issue tracker can be found at
    <eref target="https://github.com/core-wg/groupcomm-proxy"/>.</t>
    </note>
  </front>
  <middle>
    <?line 82?>

<section anchor="intro">
      <name>Introduction</name>
      <t>The Constrained Application Protocol (CoAP) <xref target="RFC7252"/> allows the presence of proxies, as intermediary entities supporting clients by performing requests on their behalf and relaying back responses.</t>
      <t>CoAP supports group communication <xref target="I-D.ietf-core-groupcomm-bis"/>, e.g., over UDP and IP multicast, so that a group request can be addressed to multiple recipient servers, each of which may reply with an individual unicast response. As discussed in Sections <xref target="I-D.ietf-core-groupcomm-bis" section="E" sectionFormat="bare"/> and <xref target="I-D.ietf-core-groupcomm-bis" section="F" sectionFormat="bare"/> of <xref target="I-D.ietf-core-groupcomm-bis"/>, this group communication scenario poses a number of issues and limitations to proxy operations.</t>
      <t>In particular, the client typically sends to the proxy a single unicast request, which the proxy forwards to a group of CoAP servers, e.g., using UDP/IP multicast as the defined default transport protocol for CoAP group requests (see <xref section="1.1" sectionFormat="of" target="I-D.ietf-core-groupcomm-bis"/>). Later on, the proxy replies to the client's original unicast request, by relaying back the responses from the servers.</t>
      <t>As per <xref target="RFC7252"/>, a CoAP-to-CoAP proxy relays those responses to the client as separate CoAP messages, all matching (by Token value) with the client's original unicast request. A possible alternative approach for aggregating those responses into a single CoAP response sent to the client would require a specific aggregation Content-Format, which is not available yet. Both these approaches pose issues.</t>
      <t>This document takes the former approach and accordingly defines a specific realization of proxy intended for scenarios that use group communication for CoAP. That is, after forwarding a CoAP group request from the client to the group of CoAP servers, the proxy relays the individual responses back to the client as separate CoAP messages. The defined realization of proxy addresses all the related issues raised in Sections <xref target="I-D.ietf-core-groupcomm-bis" section="E" sectionFormat="bare"/> and <xref target="I-D.ietf-core-groupcomm-bis" section="F" sectionFormat="bare"/> of <xref target="I-D.ietf-core-groupcomm-bis"/>. To this end, this document specifies a dedicated signaling protocol based on two new CoAP options, which is used by the client and the proxy.</t>
      <t>By using this protocol, the client explicitly confirms its intent to have a group request proxied and its support for receiving multiple responses as a result, i.e., one or more from each origin server. Also, the client indicates for how long it is willing to wait for those responses. When relaying to the client a response to the group request, the proxy indicates addressing information pertaining to the origin server. This enables the client to distinguish multiple different responses by origin and to possibly contact one or more of the respective servers, by sending individual unicast requests to the indicated addresses. In doing these follow-up unicast requests, the client can optionally bypass the proxy.</t>
      <t>Like <xref target="I-D.ietf-core-groupcomm-bis"/>, this document refers to UDP/IP multicast as the transport protocol that a proxy uses to forward a CoAP group request to a group of servers. While other transport protocols such as broadcast, non-IP multicast, and geocast can also be possible to employ, their use is not considered in this document.</t>
      <t>This document also defines how the proposed protocol is used between an HTTP client and an HTTP-to-CoAP cross-proxy, in order to forward an HTTP group request from the client to a group of CoAP servers and relay back the individual CoAP responses as HTTP responses.</t>
      <t>Finally, this document defines a caching model for proxies and specifies how they can serve a group request by using cached responses. Therefore, this document updates <xref target="RFC7252"/>.</t>
      <section anchor="terminology">
        <name>Terminology</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>Readers are expected to be familiar with the terms and concepts from the following specifications:</t>
        <ul spacing="normal">
          <li>
            <t>CoAP <xref target="RFC7252"/> and group communication for CoAP <xref target="I-D.ietf-core-groupcomm-bis"/>.</t>
          </li>
          <li>
            <t>Object Security for Constrained RESTful Environments (OSCORE) <xref target="RFC8613"/> and Group Object Security for Constrained RESTful Environments (Group OSCORE) <xref target="I-D.ietf-core-oscore-groupcomm"/>.</t>
          </li>
          <li>
            <t>Concise Data Definition Language (CDDL) <xref target="RFC8610"/>, Concise Binary Object Representation (CBOR) <xref target="RFC8949"/>, and CBOR sequences <xref target="RFC8742"/></t>
          </li>
          <li>
            <t>Constrained Resource Identifiers (CRIs) <xref target="I-D.ietf-core-href"/>.</t>
          </li>
        </ul>
        <t>Unless specified otherwise, the term "proxy" refers to a CoAP-to-CoAP forward-proxy, as defined in <xref section="5.7.2" sectionFormat="of" target="RFC7252"/>.</t>
        <t>This document also uses the following terminology.</t>
        <ul spacing="normal">
          <li>
            <t>Individual request: a request that an origin client sends to a single origin server within a group, either directly or instead indirectly via a proxy.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="sec-multicast-timeout-option">
      <name>The Multicast-Timeout Option</name>
      <t>The Multicast-Timeout Option defined in this section has the properties summarized in <xref target="_table-multicast-timeout-option"/>, which extends Table 4 of <xref target="RFC7252"/>.</t>
      <t>The Multicast-Timeout Option is elective, unsafe to forward, and not repeatable. Since the option is not Safe-to-Forward, the column "N" indicates a dash for "not applicable". The value of the Multicast-Timeout Option specifies a timeout value in seconds, encoded as an unsigned integer (see <xref section="3.2" sectionFormat="of" target="RFC7252"/>).</t>
      <table align="center" anchor="_table-multicast-timeout-option">
        <name>The Multicast-Timeout Option. C=Critical, U=Unsafe, N=NoCacheKey, R=Repeatable</name>
        <thead>
          <tr>
            <th align="left">No.</th>
            <th align="left">C</th>
            <th align="left">U</th>
            <th align="left">N</th>
            <th align="left">R</th>
            <th align="left">Name</th>
            <th align="left">Format</th>
            <th align="left">Length</th>
            <th align="left">Default</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">TBD2</td>
            <td align="left"> </td>
            <td align="left">x</td>
            <td align="left">-</td>
            <td align="left"> </td>
            <td align="left">Multicast-Timeout</td>
            <td align="left">uint</td>
            <td align="left">0-4</td>
            <td align="left">(none)</td>
          </tr>
        </tbody>
      </table>
      <t>Note to RFC Editor: Please replace "TBD2" in <xref target="_table-multicast-timeout-option"/> with the assigned option number. Then please delete this paragraph.</t>
      <t>This document specifically defines how a client uses this option in a CoAP request, in order to indicate to a proxy its support for and interest in receiving multiple responses to a proxied CoAP group request (i.e., one or more responses from each origin server) and for how long it is willing to wait for receiving those responses via that proxy (see <xref target="ssec-req-send-steps"/> and <xref target="ssec-req-proc-proxy-steps"/>).</t>
      <t>When sending a CoAP group request to a proxy via IP unicast, to be forwarded by the proxy to a targeted group of servers, the client includes the Multicast-Timeout Option in the request. The option value indicates after how much time in seconds the client will stop accepting responses matching its original unicast request, with the exception of notifications if the CoAP Observe Option <xref target="RFC7641"/> is used in the same request. This allows the proxy to stop relaying responses back to the client, if those are received from servers after the indicated amount of time has elapsed.</t>
      <t>The Multicast-Timeout Option is of class U in terms of OSCORE processing (see <xref section="4.1" sectionFormat="of" target="RFC8613"/>).</t>
    </section>
    <section anchor="sec-reply-from-option">
      <name>The Reply-From Option</name>
      <t>The Reply-From Option defined in this section has the properties summarized in <xref target="_table-reply-from-option"/>, which extends Table 4 of <xref target="RFC7252"/>. The option is intended only for inclusion in CoAP responses and builds on the Base-Uri Option from <xref section="3" sectionFormat="of" target="I-D.bormann-coap-misc"/>.</t>
      <t>The Reply-From Option is elective, safe to forward, and not repeatable. Since the option is intended only for responses, the column "N" indicates a dash for "not applicable".</t>
      <table align="center" anchor="_table-reply-from-option">
        <name>The Reply-From Option. C=Critical, U=Unsafe, N=NoCacheKey, R=Repeatable, (*) See below</name>
        <thead>
          <tr>
            <th align="left">No.</th>
            <th align="left">C</th>
            <th align="left">U</th>
            <th align="left">N</th>
            <th align="left">R</th>
            <th align="left">Name</th>
            <th align="left">Format</th>
            <th align="left">Length</th>
            <th align="left">Default</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">TBD248</td>
            <td align="left"> </td>
            <td align="left"> </td>
            <td align="left">-</td>
            <td align="left"> </td>
            <td align="left">Reply-From</td>
            <td align="left">(*)</td>
            <td align="left">5-1034</td>
            <td align="left">(none)</td>
          </tr>
        </tbody>
      </table>
      <t>Note to RFC Editor: Please replace "TBD248" in <xref target="_table-reply-from-option"/> with the assigned option number. Then please delete this paragraph.</t>
      <t>This document specifically defines how this option is used by a proxy that can perform proxied CoAP group requests.</t>
      <t>Upon receiving a response to such a request from an origin server, the proxy includes the Reply-From Option in the response sent to the origin client (see <xref target="sec-description"/>). The proxy uses the option to indicate addressing information pertaining to that origin server, which the client can use in order to send an individual request intended to that server.</t>
      <t>In particular, the client can use the addressing information specified in the option in order to identify the response originator and to possibly send it individual unicast requests later on, either directly or instead indirectly via the proxy.</t>
      <t>When used as defined in this document, the option value is set to the byte serialization of a CBOR sequence <xref target="RFC8742"/>, which is composed of at most two CBOR arrays.</t>
      <ul spacing="normal">
        <li>
          <t>The first CBOR array is <bcp14>REQUIRED</bcp14> and specifies a CRI <xref target="I-D.ietf-core-href"/>. In particular, both 'scheme' and 'authority' are given, while 'path', 'query', and 'fragment' are not given.</t>
        </li>
        <li>
          <t>The second CBOR array is <bcp14>OPTIONAL</bcp14> and specifies a CRI reference <xref target="I-D.ietf-core-href"/>. In particular, 'scheme' is set to <tt>null</tt> (0xf6), at least one of 'authority' and 'path' is given, and both 'query' and 'fragment' are not given.  </t>
          <t>
If 'authority' is given in this CRI reference, then the CRI specified by the first CBOR array <bcp14>MUST NOT</bcp14> have 'host' of the form host-name within 'authority'.  </t>
          <t>
This CRI reference is relevant in some scenarios where the proxy is a reverse-proxy (see <xref target="sec-reverse-proxies"/>).</t>
        </li>
      </ul>
      <t>The detailed use of this option is specified in <xref target="ssec-resp-proc-proxy-steps"/> and <xref target="ssec-resp-proc-client-steps"/> when the proxy is a forward-proxy, and in <xref target="sec-reverse-proxies-proxy-side"/> and <xref target="sec-reverse-proxies-client-side"/> when the proxy is a reverse-proxy.</t>
      <t>The Reply-From Option is of class U in terms of OSCORE processing (see <xref section="4.1" sectionFormat="of" target="RFC8613"/>).</t>
    </section>
    <section anchor="sec-objectives">
      <name>Requirements and Objectives</name>
      <t>In this section, the word "proxy" is not limited to forward-proxies. Instead, it comprises also reverse-proxies and HTTP-to-CoAP proxies.</t>
      <t>This document assumes that the following requirements are fulfilled.</t>
      <ul spacing="normal">
        <li>
          <t>REQ1. The proxy is explicitly configured with an allow-list for performing proxied group requests on behalf of specific allowed clients.</t>
        </li>
        <li>
          <t>REQ2. The proxy <bcp14>MUST</bcp14> identify a client sending a unicast group request to be proxied, in order to verify whether the client is allowed-listed to do so. For example, this can rely on one of the following security associations.  </t>
          <ul spacing="normal">
            <li>
              <t>A TLS <xref target="RFC9846"/> or DTLS <xref target="RFC9147"/> channel between the client and the proxy, where the client has been authenticated during the secure channel establishment.</t>
            </li>
            <li>
              <t>A pairwise OSCORE <xref target="RFC8613"/> Security Context between the client and the proxy, as defined in <xref target="I-D.ietf-core-oscore-capable-proxies"/>.</t>
            </li>
          </ul>
        </li>
        <li>
          <t>REQ3. If end-to-end secure communication is required between the client and the servers in the CoAP group, exchanged messages <bcp14>MUST</bcp14> be protected by using Group OSCORE <xref target="I-D.ietf-core-oscore-groupcomm"/>, as discussed in Sections <xref target="I-D.ietf-core-groupcomm-bis" section="E" sectionFormat="bare"/> and <xref target="I-D.ietf-core-groupcomm-bis" section="F" sectionFormat="bare"/> of <xref target="I-D.ietf-core-groupcomm-bis"/>. This requires the client and the servers to have previously joined the correct OSCORE group, for instance by using the approach described in <xref target="I-D.ietf-ace-key-groupcomm-oscore"/>. The correct OSCORE group to join can be pre-configured or alternatively discovered, for instance by using the approach described in <xref target="I-D.tiloca-core-oscore-discovery"/>.</t>
        </li>
      </ul>
      <t>This document defines how to achieve the following objectives.</t>
      <ul spacing="normal">
        <li>
          <t>OBJ1. The proxy gets an indication from the client that the client is in fact interested in multiple responses to a proxied group request and is capable to handle those. With particular reference to a unicast CoAP group request sent to the proxy, this means that the client is capable to receive those responses as separate CoAP responses, each matching with the original unicast request.</t>
        </li>
        <li>
          <t>OBJ2. The proxy learns for how long it should wait for responses to a proxied group request, before starting to ignore following responses to it (except for notifications, if a CoAP Observe Option is used <xref target="RFC7641"/>).</t>
        </li>
        <li>
          <t>OBJ3. The proxy relays to the client any multiple responses to the proxied group request. With particular reference to a client's original CoAP unicast request sent to the proxy, the corresponding responses are sent to the client as separate CoAP responses, each matching with the original unicast request.</t>
        </li>
        <li>
          <t>OBJ4. The client is able to distinguish the different responses to the proxied group request, as well as their corresponding origin servers.</t>
        </li>
        <li>
          <t>OBJ5. The client is enabled to optionally contact one or more of the responding origin servers, either directly or via the proxy.</t>
        </li>
      </ul>
    </section>
    <section anchor="sec-description">
      <name>Protocol Description</name>
      <t>This section specifies the steps of the signaling protocol.</t>
      <section anchor="ssec-req-send-client">
        <name>Request Sending at the Client</name>
        <t>This section defines the operations performed by the client, for sending a request targeting a group of servers via the proxy.</t>
        <section anchor="ssec-req-send-steps">
          <name>Request Sending</name>
          <t>The client proceeds according to the following steps.</t>
          <ol spacing="normal" type="1"><li>
              <t>The client prepares a unicast CoAP group request addressed to the proxy and specifies the group URI where the request has to be forwarded to.  </t>
              <t>
The client can specify the group URI as a string in the Proxy-Uri Option, or by using the Proxy-Scheme Option together with the Uri-* options (see <xref section="3.5.1" sectionFormat="of" target="I-D.ietf-core-groupcomm-bis"/>).  </t>
              <t>
Alternatively, the client can rely on the analogous options defined in <xref target="I-D.ietf-core-href"/>, i.e., the Proxy-Cri Option conveying a CRI equivalent to the group URI, or the Proxy-Scheme-Number Option together with the Uri-* options.  </t>
              <t>
When applicable, the client can specify the URI path of the group URI by using the Uri-Path-Abbrev Option <xref target="I-D.ietf-core-uri-path-abbrev"/>, consistent with the restrictions defined in <xref section="2.4" sectionFormat="of" target="I-D.ietf-core-uri-path-abbrev"/>.</t>
            </li>
            <li>
              <t>The client <bcp14>MUST</bcp14> retain the Token value used for this original unicast request beyond the reception of a first CoAP response matching with the request. To this end, the client follows the same rules for Token retention that are defined for multicast CoAP requests in <xref section="3.1.5" sectionFormat="of" target="I-D.ietf-core-groupcomm-bis"/>.  </t>
              <t>
In particular, the client picks an amount of time T that it is fine to wait for before freeing up the Token value. Specifically, the value of T <bcp14>MUST</bcp14> be such that:  </t>
              <ul spacing="normal">
                <li>
                  <t>T &lt; T_r , where T_r is the amount of time that the client is fine to wait for before potentially reusing the Token value. Specifically, T_r <bcp14>MUST NOT</bcp14> be less than MIN_TOKEN_REUSE_TIME defined in <xref section="3.1.5" sectionFormat="of" target="I-D.ietf-core-groupcomm-bis"/>.</t>
                </li>
                <li>
                  <t>T should be at least the expected worst-case amount of time taken by the request and response processing on the proxy and on the servers in the addressed CoAP group.</t>
                </li>
                <li>
                  <t>T should be at least the expected worst-case round-trip delay between the client and the proxy plus the worst-case round-trip delay between the proxy and any of the origin servers.</t>
                </li>
              </ul>
            </li>
            <li>
              <t>The client <bcp14>MUST</bcp14> include the Multicast-Timeout Option defined in <xref target="sec-multicast-timeout-option"/> in the unicast request to send to the proxy. The option value specifies an amount of time T' &lt; T. The difference (T - T') should be at least the expected worst-case round-trip time between the client and the proxy.  </t>
              <t>
The client can specify T' = 0 as option value, thus indicating to be not interested in receiving responses from the origin servers through the proxy. As per <xref section="3.2" sectionFormat="of" target="RFC7252"/>, the option value 0 is represented with an empty option value (a zero-length sequence of bytes). In such a case, the client <bcp14>SHOULD</bcp14> also include a No-Response Option <xref target="RFC7967"/> with value 26 (suppress all response codes), if it supports that option.  </t>
              <t>
If the unicast request to send to the proxy was already intended to include a No-Response Option with value 26, the client <bcp14>SHOULD</bcp14> specify T' = 0 as value of the Multicast-Timeout Option.</t>
            </li>
            <li>
              <t>The client processes the request as defined in <xref target="I-D.ietf-core-groupcomm-bis"/> and also as in <xref target="I-D.ietf-core-oscore-groupcomm"/> when secure group communication is used between the client and the servers.</t>
            </li>
            <li>
              <t>The client sends the request to the proxy as a unicast CoAP message. When doing so, the client protects the request according to the security association that it has with the proxy.</t>
            </li>
          </ol>
          <t>The exact method that the client uses to estimate the worst-case processing times and round-trip delays mentioned above is out of the scope of this document. However, such a method is expected to be already used by the client when generally determining an appropriate Token lifetime and reuse interval.</t>
        </section>
        <section anchor="ssec-req-send-observe">
          <name>Supporting Observe</name>
          <t>When using CoAP Observe <xref target="RFC7641"/>, the client follows what is specified in <xref section="3.7" sectionFormat="of" target="I-D.ietf-core-groupcomm-bis"/>, with the difference that it sends a unicast request to the proxy, to be forwarded to the group of servers as defined in <xref target="ssec-req-send-steps"/> of this document.</t>
          <t>Furthermore, the client especially follows what is specified in <xref section="5" sectionFormat="of" target="RFC7641"/>, i.e., it registers its interest to be an observer with the proxy, as if it was communicating with the servers.</t>
        </section>
        <section anchor="ssec-cancel-forwarding">
          <name>Cancellation of Ongoing Response Forwarding</name>
          <t>After having sent the unicast request to the proxy but before timeout expiration, the client might become not interested in receiving further corresponding responses, i.e., from that point in time until T seconds have elapsed since the request was sent to the proxy.</t>
          <t>In such a case, the client <bcp14>MAY</bcp14> ask the proxy for an early stop of the ongoing response forwarding, i.e., to not forward to the client any further response received from the servers as a reply to the forwarded group request.</t>
          <t>To this end, the client can rely on one of the following two approaches:</t>
          <ul spacing="normal">
            <li>
              <t>The client acts like it would at timeout expiration (see <xref target="ssec-resp-proc-client-steps"/>), i.e., it simply frees up its local Token value associated with the original unicast request sent to the proxy.  </t>
              <t>
Consequently, further responses forwarded by the proxy would result in the client sending a CoAP Reset message (RST), which the proxy would interpret as a loss of interest from the client.  </t>
              <t>
While this approach would work when using CoAP over UDP between the client and the proxy, it might not be suitable if a different transport is used instead.</t>
            </li>
            <li>
              <t>The client sends to the proxy a new CoAP unicast request, namely Early Stop Request, such that:  </t>
              <ul spacing="normal">
                <li>
                  <t>It <bcp14>MUST</bcp14> use the request method GET.</t>
                </li>
                <li>
                  <t>It <bcp14>MUST</bcp14> use the same Token value of the original unicast request sent to the proxy. This explicitly relates the present Early Stop Request to the original unicast request.</t>
                </li>
                <li>
                  <t>It <bcp14>MUST</bcp14> include the Multicast-Timeout Option, specifying 0 as option value. As per <xref section="3.2" sectionFormat="of" target="RFC7252"/>, the option value 0 is represented with an empty option value (a zero-length sequence of bytes). This explicitly indicates the client's wish to stop receiving further responses to the original unicast request.</t>
                </li>
                <li>
                  <t>It <bcp14>MUST NOT</bcp14> include any of the following: the Proxy-Uri Option or the Proxy-Cri Option; the Proxy-Scheme Option or the Proxy-Scheme-Number Option, together with the Uri-* options (also comprising the Uri-Path-Abbrev Option <xref target="I-D.ietf-core-uri-path-abbrev"/>). This explicitly indicates the proxy to not forward the Early Stop Request.</t>
                </li>
              </ul>
              <t>
After sending the Early Stop Request, the client frees up its local Token value associated with the original unicast request sent to the proxy.</t>
            </li>
          </ul>
          <t>Note that, irrespective of the approach used by the client, freeing up the Token value does not make it eligible for possible reuse yet (see <xref target="ssec-req-send-steps"/>).</t>
        </section>
      </section>
      <section anchor="ssec-req-proc-proxy">
        <name>Request Processing at the Proxy</name>
        <t>This section defines the operations performed by the proxy, when receiving a request to forward to a group of servers.</t>
        <section anchor="ssec-req-proc-proxy-steps">
          <name>Request Processing</name>
          <t>Upon receiving the request from the client, the proxy proceeds according to the following steps.</t>
          <ol spacing="normal" type="1"><li>
              <t>The proxy decrypts and verifies the request, according to the security association that it has with the client.</t>
            </li>
            <li>
              <t>The proxy identifies the client and verifies that the client is in fact allowed-listed to have its requests proxied to CoAP group URIs. In particular, the proxy verifies that the client is allowed-listed to have its requests proxied to the group URI specified in the present request.  </t>
              <t>
If the verification fails, the proxy <bcp14>MUST</bcp14> stop processing the request and <bcp14>MUST</bcp14> reply to the client with a 4.01 (Unauthorized) response. The proxy protects the response according to the security association that it has with the client.</t>
            </li>
            <li>
              <t>The proxy verifies the presence of the Multicast-Timeout Option, as a confirmation that the client is fine to receive multiple CoAP responses matching with the same original request.  </t>
              <t>
If the Multicast-Timeout Option is not present, the proxy <bcp14>MUST</bcp14> stop processing the request and <bcp14>MUST</bcp14> reply to the client with a 4.00 (Bad Request) response. The proxy protects the response according to the security association that it has with the client.  </t>
              <t>
The response <bcp14>MUST</bcp14> include a Multicast-Timeout Option, whose value <bcp14>MUST</bcp14> be set to 0. As per <xref section="3.2" sectionFormat="of" target="RFC7252"/>, the option value 0 is represented with an empty option value (a zero-length sequence of bytes). By doing so, the proxy indicates that the Multicast-Timeout Option was missing and has to be included in the request. As per <xref section="5.9.2" sectionFormat="of" target="RFC7252"/>, the response should include a diagnostic payload.</t>
            </li>
            <li>
              <t>The proxy retrieves the value T' from the Multicast-Timeout Option and then removes the option from the client's request.</t>
            </li>
            <li>
              <t>The proxy forwards the client's request to the group of servers. In particular, the proxy sends it as a CoAP group request over UDP/IP multicast, addressed to the group URI specified by the client.</t>
            </li>
            <li>
              <t>The proxy sets a timeout with the value T' retrieved from the Multicast-Timeout Option of the original unicast request.  </t>
              <t>
In the case that T' &gt; 0, the proxy will ignore responses to the forwarded group request coming from servers, if received after the timeout expiration, with the exception of Observe notifications (see <xref target="ssec-resp-proc-proxy"/>).  </t>
              <t>
In the case that T' = 0, the proxy will ignore all responses to the forwarded group request coming from servers.</t>
            </li>
          </ol>
          <t>If the proxy supports caching of responses, it can serve the original unicast request also by using cached responses, as per <xref target="sec-proxy-caching"/>.</t>
        </section>
        <section anchor="ssec-req-proc-proxy-observe">
          <name>Supporting Observe</name>
          <t>When using CoAP Observe <xref target="RFC7641"/>, the proxy takes the role of the client and registers its own interest to observe the target resource with the servers as per <xref section="5" sectionFormat="of" target="RFC7641"/>.</t>
          <t>When doing so, the proxy especially follows what is specified for the client in <xref section="3.7" sectionFormat="of" target="I-D.ietf-core-groupcomm-bis"/>, by forwarding the group request to the servers over UDP/IP multicast as defined in <xref target="ssec-req-proc-proxy-steps"/> of this document.</t>
        </section>
        <section anchor="ssec-cancel-forwarding-proxy">
          <name>Cancellation of Ongoing Response Forwarding</name>
          <t>As defined in <xref target="ssec-cancel-forwarding"/>, the client might ask the proxy for an early stop of the ongoing response forwarding, i.e., to stop forwarding to the client any further responses received from the servers as a reply to the forwarded group request.</t>
          <t>In particular, the proxy stops forwarding such responses to the client, after receiving a CoAP Reset message (RST) in reply to one of such responses, or after receiving an Early Stop Request related to the ongoing response forwarding (i.e., conveying the same Token value of the original unicast request from the client).</t>
          <t>After that, if the proxy receives further responses to the forwarded group request from the servers, the proxy <bcp14>MUST NOT</bcp14> forward those responses to the client. In fact, the proxy can safely free up its local Token value associated with that group request, which results in discarding any further responses to the same group request received from then on from the servers.</t>
        </section>
      </section>
      <section anchor="ssec-req-resp-proc-server">
        <name>Request and Response Processing at the Server</name>
        <t>This section defines the operations performed by the server, when receiving a group request from the proxy.</t>
        <section anchor="ssec-req-resp-proc-server-steps">
          <name>Request and Response Processing</name>
          <t>Upon receiving the request from the proxy, the server proceeds according to the following steps.</t>
          <ol spacing="normal" type="1"><li>
              <t>The server processes the group request as defined in <xref target="I-D.ietf-core-groupcomm-bis"/> and also as in <xref target="I-D.ietf-core-oscore-groupcomm"/> when secure group communication is used between the client and the server.</t>
            </li>
            <li>
              <t>The server processes the response to be relayed to the client as defined in <xref target="I-D.ietf-core-groupcomm-bis"/> and also as in <xref target="I-D.ietf-core-oscore-groupcomm"/> when secure group communication is used between the client and the server.</t>
            </li>
          </ol>
        </section>
        <section anchor="ssec-req-resp-proc-server-observe">
          <name>Supporting Observe</name>
          <t>When using CoAP Observe <xref target="RFC7641"/>, the server especially follows what is specified in <xref section="3.7" sectionFormat="of" target="I-D.ietf-core-groupcomm-bis"/> and <xref section="5" sectionFormat="of" target="RFC7641"/>.</t>
        </section>
      </section>
      <section anchor="ssec-resp-proc-proxy">
        <name>Response Processing at the Proxy</name>
        <t>This section defines the operations performed by the proxy, when receiving a response matching with a forwarded group request.</t>
        <section anchor="ssec-resp-proc-proxy-steps">
          <name>Response Processing</name>
          <t>Upon receiving a response matching with the group request before the amount of time T' has elapsed (see Step 6 in <xref target="ssec-req-proc-proxy-steps"/>), the proxy proceeds according to the following steps.</t>
          <ol spacing="normal" type="1"><li>
              <t>The proxy <bcp14>MUST</bcp14> include the Reply-From Option defined in <xref target="sec-reply-from-option"/> in the response. The proxy sets the option value as follows:  </t>
              <ul spacing="normal">
                <li>
                  <t>The CRI present as first element of the CBOR sequence specifies the addressing information of the server generating the response.</t>
                </li>
                <li>
                  <t>The second element of the CBOR sequence <bcp14>MUST NOT</bcp14> be present.</t>
                </li>
              </ul>
              <t>
If the proxy supports caching of responses (see <xref target="sec-proxy-caching"/>), the proxy <bcp14>MUST</bcp14> include the Reply-From Option in the response before caching the response. This ensures that a response to a group request conveys the addressing information of the origin server that generated the response, also when the response is forwarded to a client as retrieved from the proxy's cache.</t>
            </li>
            <li>
              <t>The proxy forwards the response back to the client. When doing so, the proxy protects the response according to the security association that it has with the client.</t>
            </li>
          </ol>
          <t>As discussed in <xref section="3.1.6" sectionFormat="of" target="I-D.ietf-core-groupcomm-bis"/>, it is possible that the same server replies with multiple responses to the same group request, i.e., conveying the same Token value. As long as the proxy forwards responses to a group request back to the origin client, the proxy <bcp14>MUST</bcp14> follow the steps defined above and forward also such multiple responses "as they come".</t>
          <t>Upon timeout expiration, i.e., T' seconds after having sent the group request over IP multicast, the proxy frees up its local Token value associated with that request. Thus, following late responses to the same group request will be discarded and not forwarded back to the client.</t>
        </section>
        <section anchor="ssec-resp-proc-proxy-observe">
          <name>Supporting Observe</name>
          <t>When using CoAP Observe <xref target="RFC7641"/>, the proxy acts as a client registered with the servers, as described earlier in <xref target="ssec-req-proc-proxy-observe"/>.</t>
          <t>Furthermore, the proxy takes the role of a server when forwarding notifications from origin servers back to the client. To this end, the proxy follows what is specified in <xref section="3.7" sectionFormat="of" target="I-D.ietf-core-groupcomm-bis"/> and <xref section="5" sectionFormat="of" target="RFC7641"/>, with the following additions.</t>
          <ul spacing="normal">
            <li>
              <t>At Step 1 in <xref target="ssec-resp-proc-proxy-steps"/>, the proxy includes the Reply-From Option in every notification, including non-2.xx notifications resulting in removing the proxy from the list of observers of the origin server.</t>
            </li>
            <li>
              <t>The proxy frees up its Token value used for a group observation only if, after the timeout expiration, no 2.xx (Success) responses matching with the group request and also including an Observe Option have been received from any origin server.  </t>
              <t>
Otherwise, after the timeout expiration and as long as observations are active with servers in the group for the target resource of the group request, notifications from those servers are forwarded back to the client as defined in <xref target="ssec-resp-proc-proxy-steps"/>, and the Token value used for the group observation is not freed during this time.</t>
            </li>
          </ul>
          <t>Finally, the proxy <bcp14>SHOULD</bcp14> regularly verify that the client is still interested in receiving observe notifications for a group observation. To this end, the proxy can rely on the same approach discussed for servers in <xref section="3.7" sectionFormat="of" target="I-D.ietf-core-groupcomm-bis"/>, with more details available in <xref section="4.5" sectionFormat="of" target="RFC7641"/>.</t>
        </section>
      </section>
      <section anchor="ssec-resp-proc-client">
        <name>Response Processing at the Client</name>
        <t>This section defines the operations performed by the client, when receiving a response matching with a request that targeted a group of servers via the proxy.</t>
        <section anchor="ssec-resp-proc-client-steps">
          <name>Response Processing</name>
          <t>Upon receiving from the proxy a response matching with the original unicast request before the amount of time T has elapsed (see Step 2 in <xref target="ssec-req-send-steps"/>), the client proceeds according to the following steps.</t>
          <ol spacing="normal" type="1"><li>
              <t>The client processes the response as defined in <xref target="I-D.ietf-core-groupcomm-bis"/>. When doing so, the client decrypts and verifies the response according to the security association that it has with the proxy.</t>
            </li>
            <li>
              <t>If secure group communication is used end-to-end between the client and the servers, the client processes the response resulting at the end of Step 1, as defined in <xref target="I-D.ietf-core-oscore-groupcomm"/>.</t>
            </li>
            <li>
              <t>The client retrieves the CRI from the value of the Reply-From Option and identifies the origin server whose addressing information is specified by the CRI. This allows the client to distinguish different responses as generated by different origin servers.  </t>
              <t>
Optionally, the client can contact one or more of those servers individually, i.e., directly (bypassing the proxy) or instead indirectly (via a proxied unicast request). To this end, the client composes the correct URI for the individual request to the origin server, by using the information specified in the CRI retrieved from the Reply-From Option.  </t>
              <t>
In order to individually reach the origin server again through the proxy, the client is not required to support the transport protocol indicated by the CRI and used between the proxy and the origin server. That is, the client uses the transport protocol that it supports and has used before to send the unicast request to the proxy.  </t>
              <t>
In particular, the client simply specifies the URI for the individual request in the unicast request to the proxy. To this end, the client can specify the URI as a string in the Proxy-Uri Option, or by using the Proxy-Scheme Option together with the Uri-* options. Alternatively, the client can rely on the analogous options defined in <xref target="I-D.ietf-core-href"/>, i.e., on the Proxy-Cri Option conveying a CRI equivalent to the URI, or on the Proxy-Scheme-Number Option together with the Uri-* options. When applicable, the client can specify the URI path for the individual request by using the Uri-Path-Abbrev Option <xref target="I-D.ietf-core-uri-path-abbrev"/>, consistent with the restrictions defined in <xref section="2.4" sectionFormat="of" target="I-D.ietf-core-uri-path-abbrev"/>.</t>
            </li>
          </ol>
          <t>As discussed in <xref section="3.1.6" sectionFormat="of" target="I-D.ietf-core-groupcomm-bis"/>, it is possible that the client receives multiple responses to the same group request (i.e., conveying the same Token) from the same origin server. The specific client implementation determines at which layer deduplication of responses is performed, or whether it is necessary in an application at all. If the processing of a response succeeds, then the client delivers the response to the application as usual. Depending on its available context information, the application itself can be in a good position to decide how to handle such responses.</t>
          <t>Upon the timeout expiration, i.e., T seconds after having sent the original unicast request to the proxy, the client frees up its local Token value associated with that request, except for the case where CoAP Observe <xref target="RFC7641"/> is used (see <xref target="ssec-resp-proc-client-observe"/>). Note that, upon this timeout expiration, the Token value is not eligible for possible reuse yet (see <xref target="ssec-req-send-steps"/>). Thus, until the actual amount of time before enabling Token reuse has elapsed, following late responses to the same request forwarded by the proxy will be discarded, as these are not matching (by Token value) with any active request from the client.</t>
        </section>
        <section anchor="ssec-resp-proc-client-observe">
          <name>Supporting Observe</name>
          <t>When using CoAP Observe <xref target="RFC7641"/>, the client frees up its Token value only if, after the timeout T expiration, no 2.xx (Success) responses matching with the original unicast request and also including an Observe Option have been received.</t>
          <t>Instead, if at least one such response has been received, the client continues receiving those notifications as they are forwarded by the proxy, as long as the observation for the target resource of the original unicast request is active.</t>
        </section>
      </section>
      <section anchor="sec-workflow-example">
        <name>Example</name>
        <t>The example in this section refers to the following actors.</t>
        <ul spacing="normal">
          <li>
            <t>One origin client C, with address C_ADDR and port number C_PORT.</t>
          </li>
          <li>
            <t>One proxy P, with address P_ADDR and port number P_PORT.</t>
          </li>
          <li>
            <t>Two origin servers S1 and S2, where the server Sx has address Sx_ADDR and port number Sx_PORT.</t>
          </li>
        </ul>
        <t>The origin servers are members of a CoAP group with IP multicast address G_ADDR and port number G_PORT. Also, the origin servers are members of the same application group and share the same resource at /r.</t>
        <t>The communication between C and P is based on CoAP over UDP, as per <xref target="RFC7252"/>. The communication between P and the origin servers is based on CoAP over UDP and IP multicast, as per <xref target="I-D.ietf-core-groupcomm-bis"/>.</t>
        <t>Finally, cri'X' denotes a CRI corresponding to the URI X, i.e., a CRI that can be converted to the URI X using the procedure defined in <xref section="6.1" sectionFormat="of" target="I-D.ietf-core-href"/>.</t>
        <figure anchor="workflow-example">
          <name>Workflow Example with a Forward-Proxy</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="832" width="568" viewBox="0 0 568 832" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,816" fill="none" stroke="black"/>
                <path d="M 264,48 L 264,768" fill="none" stroke="black"/>
                <path d="M 448,48 L 448,264" fill="none" stroke="black"/>
                <path d="M 448,280 L 448,584" fill="none" stroke="black"/>
                <path d="M 448,632 L 448,816" fill="none" stroke="black"/>
                <path d="M 560,48 L 560,816" fill="none" stroke="black"/>
                <path d="M 8,64 L 256,64" fill="none" stroke="black"/>
                <path d="M 264,240 L 440,240" fill="none" stroke="black"/>
                <path d="M 408,272 L 552,272" fill="none" stroke="black"/>
                <path d="M 272,400 L 448,400" fill="none" stroke="black"/>
                <path d="M 16,480 L 264,480" fill="none" stroke="black"/>
                <path d="M 272,592 L 560,592" fill="none" stroke="black"/>
                <path d="M 16,672 L 264,672" fill="none" stroke="black"/>
                <path d="M 392,240 L 408,272" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="560,272 548,266.4 548,277.6" fill="black" transform="rotate(0,552,272)"/>
                <polygon class="arrowhead" points="448,240 436,234.4 436,245.6" fill="black" transform="rotate(0,440,240)"/>
                <polygon class="arrowhead" points="280,592 268,586.4 268,597.6" fill="black" transform="rotate(180,272,592)"/>
                <polygon class="arrowhead" points="280,400 268,394.4 268,405.6" fill="black" transform="rotate(180,272,400)"/>
                <polygon class="arrowhead" points="264,64 252,58.4 252,69.6" fill="black" transform="rotate(0,256,64)"/>
                <polygon class="arrowhead" points="24,672 12,666.4 12,677.6" fill="black" transform="rotate(180,16,672)"/>
                <polygon class="arrowhead" points="24,480 12,474.4 12,485.6" fill="black" transform="rotate(180,16,480)"/>
                <g class="text">
                  <text x="8" y="36">C</text>
                  <text x="264" y="36">P</text>
                  <text x="452" y="36">S1</text>
                  <text x="556" y="36">S2</text>
                  <text x="36" y="84">Src:</text>
                  <text x="112" y="84">C_ADDR:C_PORT</text>
                  <text x="36" y="100">Dst:</text>
                  <text x="112" y="100">P_ADDR:P_PORT</text>
                  <text x="60" y="116">Proxi-Uri:</text>
                  <text x="132" y="132">"coap://G_ADDR:G_PORT/r"</text>
                  <text x="92" y="148">Multicast-Timeout:</text>
                  <text x="180" y="148">60</text>
                  <text x="292" y="196">Src:</text>
                  <text x="368" y="196">P_ADDR:P_PORT</text>
                  <text x="292" y="212">Dst:</text>
                  <text x="368" y="212">G_ADDR:G_PORT</text>
                  <text x="312" y="228">Uri-Path:</text>
                  <text x="368" y="228">"r"</text>
                  <text x="280" y="324">/</text>
                  <text x="296" y="324">t</text>
                  <text x="312" y="324">=</text>
                  <text x="328" y="324">0</text>
                  <text x="344" y="324">:</text>
                  <text x="360" y="324">P</text>
                  <text x="396" y="324">starts</text>
                  <text x="312" y="340">accepting</text>
                  <text x="392" y="340">responses</text>
                  <text x="288" y="356">for</text>
                  <text x="324" y="356">this</text>
                  <text x="376" y="356">request</text>
                  <text x="416" y="356">/</text>
                  <text x="292" y="420">Src:</text>
                  <text x="372" y="420">S1_ADDR:G_PORT</text>
                  <text x="292" y="436">Dst:</text>
                  <text x="368" y="436">P_ADDR:P_PORT</text>
                  <text x="36" y="500">Src:</text>
                  <text x="112" y="500">P_ADDR:P_PORT</text>
                  <text x="36" y="516">Dst:</text>
                  <text x="112" y="516">C_ADDR:C_PORT</text>
                  <text x="64" y="532">Reply-From:</text>
                  <text x="140" y="548">cri'coap://S1_ADDR:G_PORT'</text>
                  <text x="404" y="612">Src:</text>
                  <text x="488" y="612">S2_ADDR:S2_PORT</text>
                  <text x="404" y="628">Dst:</text>
                  <text x="480" y="628">P_ADDR:P_PORT</text>
                  <text x="36" y="692">Src:</text>
                  <text x="112" y="692">P_ADDR:P_PORT</text>
                  <text x="36" y="708">Dst:</text>
                  <text x="112" y="708">C_ADDR:C_PORT</text>
                  <text x="64" y="724">Reply-From:</text>
                  <text x="144" y="740">cri'coap://S2_ADDR:S2_PORT'</text>
                  <text x="136" y="788">/</text>
                  <text x="156" y="788">At</text>
                  <text x="176" y="788">t</text>
                  <text x="192" y="788">=</text>
                  <text x="216" y="788">60,</text>
                  <text x="240" y="788">P</text>
                  <text x="272" y="788">stops</text>
                  <text x="336" y="788">accepting</text>
                  <text x="168" y="804">responses</text>
                  <text x="224" y="804">for</text>
                  <text x="260" y="804">this</text>
                  <text x="312" y="804">request</text>
                  <text x="352" y="804">/</text>
                  <text x="264" y="820">|</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
C                               P                      S1           S2
|                               |                      |             |
+------------------------------>|                      |             |
| Src: C_ADDR:C_PORT            |                      |             |
| Dst: P_ADDR:P_PORT            |                      |             |
| Proxi-Uri:                    |                      |             |
|   "coap://G_ADDR:G_PORT/r"    |                      |             |
| Multicast-Timeout: 60         |                      |             |
|                               |                      |             |
|                               |                      |             |
|                               | Src: P_ADDR:P_PORT   |             |
|                               | Dst: G_ADDR:G_PORT   |             |
|                               | Uri-Path: "r"        |             |
|                               +---------------+----->|             |
|                               |                \     |             |
|                               |                 `----------------->|
|                               |                      |             |
|                               |                      |             |
|                               | / t = 0 : P starts   |             |
|                               | accepting responses  |             |
|                               | for this request /   |             |
|                               |                      |             |
|                               |                      |             |
|                               |<---------------------+             |
|                               | Src: S1_ADDR:G_PORT  |             |
|                               | Dst: P_ADDR:P_PORT   |             |
|                               |                      |             |
|                               |                      |             |
|<------------------------------+                      |             |
| Src: P_ADDR:P_PORT            |                      |             |
| Dst: C_ADDR:C_PORT            |                      |             |
| Reply-From:                   |                      |             |
|   cri'coap://S1_ADDR:G_PORT'  |                      |             |
|                               |                      |             |
|                               |                      |             |
|                               |<-----------------------------------+
|                               |               Src: S2_ADDR:S2_PORT |
|                               |               Dst: P_ADDR:P_PORT   |
|                               |                      |             |
|                               |                      |             |
|<------------------------------+                      |             |
| Src: P_ADDR:P_PORT            |                      |             |
| Dst: C_ADDR:C_PORT            |                      |             |
| Reply-From:                   |                      |             |
|   cri'coap://S2_ADDR:S2_PORT' |                      |             |
|                               |                      |             |
|                               |                      |             |
|               / At t = 60, P stops accepting         |             |
|               responses for this request /           |             |
|                               |                      |             |
]]></artwork>
          </artset>
        </figure>
      </section>
    </section>
    <section anchor="sec-reverse-proxies">
      <name>Reverse-Proxies</name>
      <t>The use of reverse-proxies in group communication scenarios is defined in <xref section="3.5.2" sectionFormat="of" target="I-D.ietf-core-groupcomm-bis"/>.</t>
      <t>This section clarifies how the Multicast-Timeout Option is effective also in such a context, in order for:</t>
      <ul spacing="normal">
        <li>
          <t>The proxy to effectively reveal itself as a reverse-proxy to the client.</t>
        </li>
        <li>
          <t>The client to indicate to the proxy about being aware that it is communicating with a reverse-proxy and for how long it is willing to receive responses to a proxied group request.</t>
        </li>
      </ul>
      <t>This practically addresses the additional issues compared to the case with a forward-proxy, as compiled in <xref section="F" sectionFormat="of" target="I-D.ietf-core-groupcomm-bis"/>.</t>
      <t><xref target="sec-reverse-proxies-examples"/> provides examples with a reverse-proxy.</t>
      <section anchor="sec-reverse-proxies-proxy-side">
        <name>Processing on the Proxy Side</name>
        <t>If the proxy receives a CoAP request and determines that it should be forwarded to a group of servers over IP multicast, then the proxy performs the steps defined in <xref target="ssec-req-proc-proxy"/>.</t>
        <t>In particular, when such a request does not include a Multicast-Timeout Option, the proxy effectively reveals itself as a reverse-proxy, by replying with a 4.00 (Bad Request) response including a Multicast-Timeout Option with value 0 (which is ultimately represented with an empty option value, as per <xref section="3.2" sectionFormat="of" target="RFC7252"/>).</t>
        <t>The proxy processes the CoAP responses forwarded back to the client as defined in <xref target="ssec-resp-proc-proxy"/>, with the following additions.</t>
        <ul spacing="normal">
          <li>
            <t>As a first possible case, the proxy stands in both for the whole group of servers and for the individual origin servers in the group. That is, the origin client cannot reach the individual servers directly, but only through the proxy.  </t>
            <t>
In such a case, within a response forwarded back to the client, the value of the Reply-From Option specifies an addressing information TARGET that is directly associated with the proxy. The addressing information is such that, when receiving a unicast request that has been sent according to what is specified in TARGET, the proxy forwards the request to the origin server that generated the response. In particular, the proxy sets the option value as follows.  </t>
            <ul spacing="normal">
              <li>
                <t>The CRI that is present as the first element of the CBOR sequence specifies an addressing information TARGET_1, such that a unicast request reaches the proxy if it is sent according to TARGET_1.</t>
              </li>
              <li>
                <t>A CRI reference <bcp14>MUST</bcp14> be present as the second element of the CBOR sequence if, upon receiving a unicast request that has been sent according to TARGET_1, the proxy forwards the request based on further information than TARGET_1 and relying on what is specified by the options Uri-Host, Uri-Port, and Uri-Path or Uri-Path-Abbrev <xref target="I-D.ietf-core-uri-path-abbrev"/> included in the request. The CRI reference specifies the same information that the proxy expects to be specified in the options Uri-Host, Uri-Port, and Uri-Path or Uri-Path-Abbrev of such a unicast request.      </t>
                <t>
Otherwise, the second element of the CBOR sequence <bcp14>MUST NOT</bcp14> be present, in which case the proxy forwards the unicast request solely based on the addressing information TARGET_1 according to which the request has been sent to.</t>
              </li>
            </ul>
            <t>
The client will be able to communicate individually with the origin server that generated the response, by sending a follow-up unicast request to the proxy as per the specified addressing information TARGET, according to which the proxy forwards the request to that server. This is further specified in <xref target="sec-reverse-proxies-client-side"/>. Examples are provided in <xref target="sec-reverse-proxies-examples-ex1"/> and <xref target="sec-reverse-proxies-examples-ex2"/>.</t>
          </li>
          <li>
            <t>As a second possible case, the proxy stands in only for the whole group of servers, but not for the individual servers in the group. That is, the origin client can reach the individual servers directly, without recourse to the proxy.  </t>
            <t>
In such a case, within a response forwarded back to the client, the value of the Reply-From Option specifies an addressing information TARGET that is directly associated with the origin server that generated the response. In particular, the proxy sets the option value as follows.  </t>
            <ul spacing="normal">
              <li>
                <t>The CRI present as the first element of the CBOR sequence specifies the addressing information TARGET, such that a unicast request reaches the origin server if sent according to TARGET.</t>
              </li>
              <li>
                <t>The second element of the CBOR sequence <bcp14>MUST NOT</bcp14> be present.</t>
              </li>
            </ul>
            <t>
The client will be able to use that information for sending a follow-up unicast request directly to that server, i.e., bypassing the proxy. This is further specified in <xref target="sec-reverse-proxies-client-side"/>. An example is provided in <xref target="sec-reverse-proxies-examples-ex3"/>.</t>
          </li>
        </ul>
      </section>
      <section anchor="sec-reverse-proxies-client-side">
        <name>Processing on the Client Side</name>
        <t>If a client sends a CoAP request intended to a group of servers and is aware of actually communicating with a reverse-proxy, then the client <bcp14>MUST</bcp14> perform the steps defined in <xref target="ssec-req-send-steps"/>. In particular, this results in a request sent to the proxy including a Multicast-Timeout Option.</t>
        <t>The client processes the CoAP responses forwarded back by the proxy as defined in <xref target="ssec-resp-proc-client-steps"/>, with the following differences at Step 3.</t>
        <ul spacing="normal">
          <li>
            <t>If the client wishes to send a follow-up unicast request intended only to the origin server that generated the response, then the client sends such a request according to the addressing information specified by the CRI retrieved from the value of the Reply-From Option.  </t>
            <t>
Effectively, the client sends the unicast request either directly to the origin server (in the case that the proxy stands in only for the whole group of servers, but not for the individual servers in the group), or to the proxy (in the case that the proxy stands in for both the whole group of servers and the individual servers in the group).  </t>
            <t>
If the value of the Reply-From Option specifies also a CRI reference as the second element of the CBOR sequence, then the client includes the options Uri-Host, Uri-Port, and Uri-Path or Uri-Path-Abbrev <xref target="I-D.ietf-core-uri-path-abbrev"/> in the unicast request, according to what is specified by the corresponding elements of the CRI reference. When doing so, the following applies:  </t>
            <ul spacing="normal">
              <li>
                <t>If 'authority' is given in the CRI reference and it does not include 'port', this in itself <bcp14>MUST NOT</bcp14> result in the client including the Uri-Port Option in the unicast request.</t>
              </li>
              <li>
                <t>If the client wants to specify additional path segments that identify a specific resource at the origin server, then the corresponding Uri-Path Options are included in the request after the Uri-Path Options corresponding to the path component of the CRI reference.</t>
              </li>
            </ul>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="sec-proxy-caching">
      <name>Caching</name>
      <t>A proxy <bcp14>MAY</bcp14> cache responses to a group request, as defined in <xref section="5.7.1" sectionFormat="of" target="RFC7252"/>. In particular, the same rules apply to determine the set of request options used as "Cache-Key" and to determine the max-age values offered for responses served from the cache.</t>
      <t>A cache entry is associated with one server and stores one response from that server, regardless of whether it is a response to a unicast request or to a group request. The following two types of requests can produce a hit to a cache entry.</t>
      <ul spacing="normal">
        <li>
          <t>A matching request intended to that server, i.e., to the corresponding unicast URI.  </t>
          <t>
When the stored response is a response to a unicast request to the server, the unicast URI of the matching request is the same target URI used for the original unicast request.  </t>
          <t>
When the stored response is a response to a group request to the CoAP group, the unicast URI of the matching request is the target URI obtained by replacing the authority component of the group URI in the original group request with the transport-layer source address and port number of the response.</t>
        </li>
        <li>
          <t>A matching group request intended to the CoAP group, i.e., to the corresponding group URI.  </t>
          <t>
That is, a matching group request can produce a hit to multiple cache entries, each of which is associated with one of the CoAP servers in the CoAP group.  </t>
          <t>
As per the freshness model defined in <xref target="sec-proxy-caching-freshness"/>, the proxy can serve a group request exclusively from its cached responses only when it knows all the CoAP servers that are current members of the CoAP group and it has a valid cache entry for each of those.</t>
        </li>
      </ul>
      <t>When forwarding a GET or FETCH group request to the servers in the CoAP group, the proxy behaves like a CoAP client as defined in <xref section="3.2" sectionFormat="of" target="I-D.ietf-core-groupcomm-bis"/>, with the following additions:</t>
      <ul spacing="normal">
        <li>
          <t>As discussed in <xref target="ssec-resp-proc-proxy-steps"/>, the proxy can receive multiple responses to the same group request from the same origin server and forwards them back to the origin client "as they come". When this happens, each of such multiple responses is stored in the cache entry associated with the server "as it comes", possibly replacing an already stored response from that server.</t>
        </li>
        <li>
          <t>As discussed in <xref target="sec-group-caching"/>, when communications in the group are secured with Group OSCORE <xref target="I-D.ietf-core-oscore-groupcomm"/>, additional means are required to enable cacheability of responses at the proxy.</t>
        </li>
      </ul>
      <t>The following subsections define the freshness model and validation model that the proxy uses for cached responses.</t>
      <section anchor="sec-proxy-caching-freshness">
        <name>Freshness Model</name>
        <t>The proxy relies on the same freshness model defined in <xref section="3.2.1" sectionFormat="of" target="I-D.ietf-core-groupcomm-bis"/>, by taking the role of a CoAP client with respect to the servers in the CoAP group.</t>
        <t>In particular, when receiving a unicast group request from the client, the proxy <bcp14>MAY</bcp14> serve it by using exclusively cached responses without forwarding the group request to the servers in the CoAP group, but only if both the following conditions hold:</t>
        <ul spacing="normal">
          <li>
            <t>The proxy knows all the CoAP servers that are currently members of the CoAP group for which the group request is intended.</t>
          </li>
          <li>
            <t>The proxy's cache currently stores a fresh response for each of those CoAP servers.</t>
          </li>
        </ul>
        <t>The specific way that the proxy uses to determine the CoAP servers that are currently members of the target CoAP group is out of scope for this document. As possible examples, the proxy can synchronize with a group manager server; rely on well-known time patterns used by the application or in the network for the addition of new CoAP group members; observe group join requests or IGMP/MLD multicast group join messages, e.g., if the proxy is embedded in a multicast router.</t>
        <t>When forwarding the group request to the servers, the proxy could have fresh responses stored in its cache for (some of) those servers. In such a case, the proxy uses (also) those cached responses to serve the original unicast group request, as defined below.</t>
        <ul spacing="normal">
          <li>
            <t>The request processing in <xref target="ssec-req-proc-proxy-steps"/> is extended as follows.  </t>
            <t>
After setting the timeout with value T' &gt; 0 at Step 6, the proxy checks whether its cache currently stores fresh responses to the group request. For each of such responses, the proxy compares the residual lifetime L of the corresponding cache entry against the value T'.  </t>
            <t>
If a cached response X is such that L &lt; T', then the proxy forwards X back to the client at its earliest convenience. Otherwise, the proxy does not forward X back to the client at the moment, and instead it waits for approaching the timeout expiration as discussed in the next point.</t>
          </li>
          <li>
            <t>The response processing in <xref target="ssec-resp-proc-proxy-steps"/> is extended as follows.  </t>
            <t>
Before the timeout with original value T' &gt; 0 expires and the proxy stops accepting responses to the group request, the proxy checks whether it stores in its cache any fresh response X to the group request such that both the following conditions hold:  </t>
            <ul spacing="normal">
              <li>
                <t>The cache entry E storing X was already existing when the proxy forwarded the group request.</t>
              </li>
              <li>
                <t>The proxy has received no response to the forwarded group request from the server associated with E.</t>
              </li>
            </ul>
            <t>
Then, the proxy sends back to the client each response X stored in its cache and selected as above, before the timeout expires.  </t>
            <t>
Note that, from the forwarding of the group request until the timeout expiration, the proxy still forwards responses to the group request back to the client "as they come" (see <xref target="ssec-resp-proc-proxy-steps"/>). Also, such responses possibly refresh older responses from the same servers that the proxy has stored in its cache, as defined earlier in <xref target="sec-proxy-caching"/>.</t>
          </li>
        </ul>
      </section>
      <section anchor="sec-proxy-caching-validation">
        <name>Validation Model</name>
        <t>This section defines the revalidation of responses, separately between the proxy and the origin servers as well as between the origin client and the proxy.</t>
        <section anchor="sec-proxy-caching-validation-p-s-unicast">
          <name>Proxy-Servers Revalidation with Unicast Requests</name>
          <t>The proxy <bcp14>MAY</bcp14> revalidate a cached response by making a GET or FETCH request on the related unicast request URI, i.e., by taking the role of a CoAP client with respect to a server in the CoAP group.</t>
          <t>As discussed in <xref target="sec-group-caching"/>, this is however not possible for the proxy if communications in the group are secured end-to-end between origin client and origin servers by using Group OSCORE <xref target="I-D.ietf-core-oscore-groupcomm"/>.</t>
          <t>[ TODO</t>
          <t>It can be actually possible to enable revalidation of responses between proxy and server, also in this case where Group OSCORE is used end-to-end between client and origin servers.</t>
          <t>Fundamentally, this requires to define the possible use of the ETag Option also as an outer option for OSCORE. Thus, in addition to the normal inner ETag, a server can add also an outer ETag Option intended to the proxy.</t>
          <t>Since validation of responses assumes that cacheability of responses is possible in the first place, it would be convenient to define the use of ETag as outer option in <xref target="I-D.ietf-core-cacheable-oscore"/>.</t>
          <t>If OSCORE is also used between the proxy and an individual origin server as per <xref target="I-D.ietf-core-oscore-capable-proxies"/>, then the outer ETag Option would be seamlessly protected with the OSCORE Security Context shared between the proxy and the origin server.</t>
          <t>The following text can be used to replace the last paragraph above.</t>
          <t><br/></t>
          <t>As discussed in <xref target="sec-group-caching"/>, the following applies when Group OSCORE <xref target="I-D.ietf-core-oscore-groupcomm"/> is used to secure communications end-to-end between the origin client and the origin servers in the group.</t>
          <ul spacing="normal">
            <li>
              <t>Additional means are required to enable cacheability of responses at the proxy (see <xref target="sec-det-req"/>).</t>
            </li>
            <li>
              <t>If a cached response included an outer ETag Option intended to the proxy, then the proxy can perform revalidation of the cached response, by making a request to the unicast URI targeting the server, and including outer ETag Option(s).  </t>
              <t>
This is possible also in the case that the proxy and the origin server use OSCORE to further protect the exchanged request and response, as defined in <xref target="I-D.ietf-core-oscore-capable-proxies"/>. In such a case, the originally outer ETag Option is protected with the OSCORE Security Context shared between the proxy and the origin server, before transferring the message over the communication leg between the proxy and origin server.</t>
            </li>
          </ul>
          <t>]</t>
        </section>
        <section anchor="sec-proxy-caching-validation-p-s">
          <name>Proxy-Servers Revalidation with Group Requests</name>
          <t>When forwarding a group request to the servers in the CoAP group, the proxy <bcp14>MAY</bcp14> revalidate one or more stored responses that it has cached.</t>
          <t>To this end, the proxy relies on the same validation model defined in <xref section="3.2.2" sectionFormat="of" target="I-D.ietf-core-groupcomm-bis"/> and using the ETag Option, by taking the role of a CoAP client with respect to the servers in the CoAP group.</t>
          <t>As discussed in <xref target="sec-group-caching"/>, this is however not possible for the proxy if communications in the group are secured end-to-end between origin client and origin servers by using Group OSCORE <xref target="I-D.ietf-core-oscore-groupcomm"/>.</t>
          <t>[ TODO</t>
          <t>See the notes in <xref target="sec-proxy-caching-validation-p-s-unicast"/>.</t>
          <t>The following text can be used to replace the last paragraph above.</t>
          <t><br/></t>
          <t>As discussed in <xref target="sec-group-caching"/>, the following applies when Group OSCORE <xref target="I-D.ietf-core-oscore-groupcomm"/> is used to secure communications end-to-end between the origin client and the origin servers in the group.</t>
          <ul spacing="normal">
            <li>
              <t>Additional means are required to enable cacheability of responses at the proxy (see <xref target="sec-det-req"/>).</t>
            </li>
            <li>
              <t>If a cached response included an outer ETag Option intended to the proxy, then the proxy can perform revalidation of the cached response, by making a request to the group URI targeting the CoAP group, and including outer ETag Option(s).  </t>
              <t>
This is possible also in the case that the proxy and the origin servers use Group OSCORE to further protect the exchanged request and response, as defined in <xref target="I-D.ietf-core-oscore-capable-proxies"/>. In such a case, the originally outer ETag Option is protected with the Group OSCORE Security Context shared between the proxy and the origin server, before transferring the message over the communication leg between the proxy and origin server.</t>
            </li>
          </ul>
          <t>]</t>
        </section>
      </section>
      <section anchor="sec-proxy-caching-validation-c-p">
        <name>Client-Proxy Revalidation with Group Requests</name>
        <t>A client <bcp14>MAY</bcp14> revalidate the full set of responses to a group request by leveraging the corresponding cache entries at the proxy. To this end, this document defines the new Group-ETag Option.</t>
        <t>The Group-ETag Option has the properties summarized in <xref target="_table-response-group-etag-option"/>, which extends Table 4 of <xref target="RFC7252"/>.</t>
        <t>The Group-ETag Option is elective, safe to forward, part of the Cache-Key, and repeatable. The option is intended for group requests sent to a proxy to be forwarded to the servers in a CoAP group as well as for the associated responses.</t>
        <table align="center" anchor="_table-response-group-etag-option">
          <name>The Group-ETag Option. C=Critical, U=Unsafe, N=NoCacheKey, R=Repeatable</name>
          <thead>
            <tr>
              <th align="left">No.</th>
              <th align="left">C</th>
              <th align="left">U</th>
              <th align="left">N</th>
              <th align="left">R</th>
              <th align="left">Name</th>
              <th align="left">Format</th>
              <th align="left">Length</th>
              <th align="left">Default</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">TBD24</td>
              <td align="left"> </td>
              <td align="left"> </td>
              <td align="left"> </td>
              <td align="left">x</td>
              <td align="left">Group-ETag</td>
              <td align="left">opaque</td>
              <td align="left">1-8</td>
              <td align="left">(none)</td>
            </tr>
          </tbody>
        </table>
        <t>Note to RFC Editor: Please replace "TBD24" in <xref target="_table-response-group-etag-option"/> with the assigned option number. Then please delete this paragraph.</t>
        <t>The Group-ETag Option has the same properties of the ETag Option defined in <xref section="5.10.6" sectionFormat="of" target="RFC7252"/>.</t>
        <t>The Group-ETag Option is of class U in terms of OSCORE processing (see <xref section="4.1" sectionFormat="of" target="RFC8613"/>).</t>
        <t>A proxy <bcp14>MUST NOT</bcp14> provide this form of validation if it is not in a position to serve a group request by using exclusively cached responses, i.e., without sending the group request to the servers in the CoAP group (see <xref target="sec-proxy-caching-freshness"/>).</t>
        <t>If the proxy supports this form of response revalidation, the following applies.</t>
        <ul spacing="normal">
          <li>
            <t>The proxy defines J as a joint set including all the cache entries currently storing fresh responses that satisfy a group request. A set J is "complete" if it includes a valid cache entry for each of the CoAP servers that are currently members of the CoAP group.</t>
          </li>
          <li>
            <t>When the set J becomes "complete", the proxy assigns it an entity-tag value. The proxy <bcp14>MUST</bcp14> update the current entity-tag value, when J is "complete" and one of its cache entry is updated.</t>
          </li>
          <li>
            <t>When forwarding to the client a 2.05 (Content) response to a GET or FETCH group request, the proxy <bcp14>MAY</bcp14> include one Group-ETag Option, if the set J is "complete". Such a response <bcp14>MUST NOT</bcp14> include more than one Group-ETag Option. The option value specifies the entity-tag value currently associated with the set J.</t>
          </li>
        </ul>
        <t>When sending to the proxy a GET or FETCH request to be forwarded to the servers in the CoAP group, the client <bcp14>MAY</bcp14> include one or more Group-ETag Options. Each option specifies one entity-tag value, as applicable to the set J of cache entries that can be hit by the group request.</t>
        <t>The proxy <bcp14>MAY</bcp14> perform the following actions, if the group request produces a hit to the cache entry of each CoAP server that is currently a member of the CoAP group, i.e., if the set J associated with the group request is "complete".</t>
        <ul spacing="normal">
          <li>
            <t>The proxy checks whether the current entity-tag value of the set J matches with one of the entity-tag values specified in the Group-ETag Options of the unicast group request from the client.</t>
          </li>
          <li>
            <t>In the case of a positive match, the proxy replies with a single 2.03 (Valid) response. This response has no payload and <bcp14>MUST</bcp14> include one Group-ETag Option, specifying the current entity-tag value of the set J.</t>
          </li>
        </ul>
        <t>That is, the 2.03 (Valid) response from the proxy indicates to the client that the stored responses identified by the entity-tag given in the response's Group-ETag Option can be reused, after updating each of them as described in <xref section="5.9.1.3" sectionFormat="of" target="RFC7252"/>. In effect, the client can determine if any of the stored representations from the respective cache entries at the proxy is current, without needing to transfer any of them again.</t>
      </section>
      <section anchor="sec-group-caching">
        <name>Caching of End-To-End Protected Responses at Proxies</name>
        <t>When using Group OSCORE <xref target="I-D.ietf-core-oscore-groupcomm"/> to protect communications end-to-end between a client and multiple servers in the group, it is normally not possible for an intermediary proxy to effectively cache protected responses.</t>
        <t>In fact, when starting from the same plain CoAP message, different clients generate different protected requests to send on the wire. This prevents different clients to generate potential cache hits and thus makes response caching at the proxy pointless.</t>
        <section anchor="sec-det-req">
          <name>Deterministic Requests to Achieve Cacheability</name>
          <t>For application scenarios that use secure group communication, it is still possible to achieve cacheability of responses at proxies by using the approach defined in <xref target="I-D.ietf-core-cacheable-oscore"/>, which is based on Deterministic Requests protected with the pairwise mode of Group OSCORE. This approach is limited to group requests that are safe (in the RESTful sense) to process and do not yield side effects at the servers. As for any protected group request, it requires the clients and all the servers in the CoAP group to have already joined the correct OSCORE group.</t>
          <t>Starting from the same plain CoAP request, this allows different clients in the OSCORE group to deterministically generate the same request protected with Group OSCORE, which is sent to the proxy for being forwarded to the CoAP group. The proxy can now effectively cache the resulting responses from the servers in the CoAP group, since the same plain CoAP request will result again in the same Deterministic Request and thus will produce a cache hit.</t>
          <t>When the caching of responses protected with Group OSCORE is enabled at the proxy, the same as defined in <xref target="sec-proxy-caching"/> applies, with respect to cache entries and their lifetimes.</t>
          <t>Note that different Deterministic Requests result in different cache entries at the proxy. This includes the case where different plain group requests differ only in their set of ETag Options, as defined in <xref section="3.2.2" sectionFormat="of" target="I-D.ietf-core-groupcomm-bis"/>.</t>
          <t>That is, even though the servers would produce the same plain CoAP responses when replying to two different Deterministic Requests, those will result in different protected responses to each respective Deterministic Request, hence in different cache entries at the proxy.</t>
          <t>Thus, given a plain group request, a client needs to reuse the same set of ETag Options in order to send that group request as a Deterministic Request that can actually produce a cache hit at the proxy. While this would prevent the caching at the proxy from being inefficient and unnecessarily redundant, it would also limit the flexibility of end-to-end response revalidation for a client.</t>
        </section>
        <section anchor="chap-sec-group-caching-validation">
          <name>Validation of Responses</name>
          <t>Response revalidation remains possible end-to-end between the client and the servers in the group, by including inner ETag Options as defined in Sections <xref target="I-D.ietf-core-groupcomm-bis" section="3.2" sectionFormat="bare"/> and <xref target="I-D.ietf-core-groupcomm-bis" section="3.2.2" sectionFormat="bare"/> of <xref target="I-D.ietf-core-groupcomm-bis"/>.</t>
          <t>Furthermore, it remains possible for a client to attempt revalidating responses to a group request from a "complete" set of cache entries at the proxy, by using the Group-ETag Option as defined in <xref target="sec-proxy-caching-validation-c-p"/>.</t>
          <t>When directly interacting with the servers in the CoAP group to refresh its cache entries, the proxy cannot rely on response revalidation anymore. This applies to the case where the request is addressed to a single server and is sent to the related unicast URI (see <xref target="sec-proxy-caching-validation-p-s-unicast"/>) as well as to the case where the request is a group request addressed to the CoAP group and is sent to the related group URI (see <xref target="sec-proxy-caching-validation-p-s"/>).</t>
          <t>[ TODO</t>
          <t>See the notes in <xref target="sec-proxy-caching-validation-p-s-unicast"/>.</t>
          <t>The following text can be used to replace the last paragraph above.</t>
          <t><br/></t>
          <t>When directly interacting with the servers in the CoAP group to refresh its cache entries, the proxy also remains able to perform response revalidation. That is, if a cached response included an outer ETag Option intended to the proxy, then the proxy can perform revalidation of the cached response, by making a request to the unicast URI addressed to a single server and sent to the related unicast URI (see <xref target="sec-proxy-caching-validation-p-s-unicast"/>) or a group request addressed to the CoAP group and sent to the related group URI (see <xref target="sec-proxy-caching-validation-p-s"/>).</t>
          <t>]</t>
        </section>
      </section>
    </section>
    <section anchor="sec-proxy-chain">
      <name>Chain of Proxies</name>
      <t>A client may be interested in accessing a resource at a group of origin servers that is reached through a chain of two or more proxies.</t>
      <t>That is, these proxies are configured into a chain, where each non-last proxy is configured to forward (group) requests to the next hop towards the origin servers. Also, each non-first proxy is configured to forward back responses to the previous hop towards the origin client.</t>
      <t>This section specifies how the signaling protocol defined in <xref target="sec-description"/> is used in that setting. Except for the last proxy before the origin servers, every other proxy in the chain takes the role of client with respect to the next hop towards the origin servers. Also, every proxy in the chain except the first takes the role of server towards the previous proxy closer to the origin client.</t>
      <t>Accordingly, possible caching of responses at each proxy works as defined in <xref target="sec-proxy-caching"/> and <xref target="sec-group-caching"/>. Also, possible revalidation of responses cached at each proxy and based on the Group-ETag Option works as defined in <xref target="sec-proxy-caching-validation-c-p"/> and <xref target="chap-sec-group-caching-validation"/>.</t>
      <t>The requirements REQ1 and REQ2 defined in <xref target="sec-objectives"/> <bcp14>MUST</bcp14> be fulfilled for each proxy in the chain. That is, every proxy in the chain has to be explicitly configured with an allow-list that allows proxied group requests from specific senders and <bcp14>MUST</bcp14> identify those senders upon receiving their group request. For the first proxy in the chain, that sender is the origin client. For each other proxy in the chain, that sender is the proxy acting as the previous hop closer to the origin client. In either case, a proxy can identify the sender of a group request by the same means mentioned in <xref target="sec-objectives"/>.</t>
      <section anchor="sec-proxy-chain-request-processing">
        <name>Request Processing at the Proxy</name>
        <t>Upon receiving a group request to be forwarded to a CoAP group URI, a proxy proceeds as follows.</t>
        <t>If the proxy is the last one in the chain, i.e., it is the last hop before the origin servers, the proxy performs the steps defined in <xref target="ssec-req-proc-proxy"/>, with no modifications.</t>
        <t>Otherwise, the proxy performs the steps defined in <xref target="ssec-req-proc-proxy"/>, with the following differences.</t>
        <ul spacing="normal">
          <li>
            <t>At Steps 1-3, "client" refers to the origin client when the proxy is the first one in the chain, or to the proxy acting as the previous hop closer to the origin client otherwise.</t>
          </li>
          <li>
            <t>At Step 4, the proxy rather performs the following actions.  </t>
            <ol spacing="normal" type="1"><li>
                <t>The proxy retrieves the value T' from the Multicast-Timeout Option and does not remove the option.</t>
              </li>
              <li>
                <t>If T' &gt; 0, the proxy picks an amount of time T that it is fine to wait for before freeing up its local Token value to use with the next hop towards the origin servers. To this end, the proxy <bcp14>MUST</bcp14> follow what is defined at Step 2 of <xref target="ssec-req-send-steps"/> for the origin client, with the following differences.      </t>
                <ul spacing="normal">
                  <li>
                    <t>T <bcp14>MUST</bcp14> be greater than the retrieved value T', i.e., T' &lt; T.</t>
                  </li>
                  <li>
                    <t>The worst-case message processing time takes into account all the next hops towards the origin servers, as well as the origin servers themselves.</t>
                  </li>
                  <li>
                    <t>The worst-case round-trip delay takes into account all the legs between the proxy and the origin servers.</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>If T' &gt; 0, the proxy replaces the value of the Multicast-Timeout Option with a new value T'', such that:      </t>
                <ul spacing="normal">
                  <li>
                    <t>T'' &lt; T. The difference (T - T'') should be at least the expected worst-case round-trip time between the proxy and the next hop towards the origin servers; and</t>
                  </li>
                  <li>
                    <t>T'' &lt; T'. The difference (T' - T'') should be at least the expected worst-case round-trip time between the proxy and the (previous hop closer to the) origin client.</t>
                  </li>
                </ul>
                <t>
If the proxy is not able to determine a value T'' that fulfills both the requirements above, the proxy <bcp14>MUST</bcp14> stop processing the request and <bcp14>MUST</bcp14> reply with a 5.05 (Proxying Not Supported) error response to the (previous hop closer to the) origin client. The proxy <bcp14>SHOULD</bcp14> include a Multicast-Timeout Option, set to the minimum value T' that would be acceptable in the Multicast-Timeout Option of a group request to forward.      </t>
                <t>
If the proxy is the first one in the chain, then the error response is sent to the origin client. Upon receiving the error response, the origin client <bcp14>MAY</bcp14> send an updated group request to the same first proxy in the chain. In the updated request, the Multicast-Timeout Option <bcp14>SHOULD</bcp14> specify a value T' such that: it is greater than the one specified in the original group request; and it is greater than or equal to the one specified in the error response (if present therein).      </t>
                <t>
Otherwise, upon receiving the error response, any other proxy in the chain <bcp14>MAY</bcp14> send an updated group request to the next hop towards the origin servers. In the updated group request, the Multicast-Timeout Option <bcp14>MUST</bcp14> specify a value T' such that: it is greater than the one specified in the previous forwarded request; and it is greater than or equal to the one specified in the error response (if present therein). If the proxy does not send an updated group request, the proxy <bcp14>MUST</bcp14> also send a 5.05 (Proxying Not Supported) error response to the proxy acting as the previous hop closer to the origin client. Like the received one, also this error response <bcp14>SHOULD</bcp14> include a Multicast-Timeout Option, set to the minimum value T' acceptable by the proxy sending the error response.</t>
              </li>
            </ol>
          </li>
          <li>
            <t>At Step 5, the proxy forwards the request to the next hop towards the origin servers.</t>
          </li>
          <li>
            <t>At Step 6, the proxy sets a timeout with the value T' retrieved from the
Multicast-Timeout Option of the request received from the (previous hop closer to the) origin client.  </t>
            <t>
In the case that T' &gt; 0, the proxy will ignore responses to the forwarded group request coming from the next hop towards the origin servers, if received after the timeout expiration, with the exception of Observe notifications (see <xref target="ssec-resp-proc-proxy"/>).  </t>
            <t>
In the case that T' = 0, the proxy will ignore all responses to the forwarded group request coming from the next hop towards the origin servers.</t>
          </li>
        </ul>
        <section anchor="sec-proxy-chain-request-processing-observe">
          <name>Supporting Observe</name>
          <t>When using CoAP Observe <xref target="RFC7641"/>, what is defined in <xref target="ssec-req-proc-proxy-observe"/> applies for the last proxy in the chain, i.e., the last hop before the origin servers.</t>
          <t>Any other proxy in the chain acts as a client and registers its own interest to observe the target resource with the next hop towards the origin servers, as per <xref section="5" sectionFormat="of" target="RFC7641"/>.</t>
        </section>
        <section anchor="ssec-cancel-forwarding-proxy-chain">
          <name>Cancellation of Ongoing Response Forwarding</name>
          <t>Consistent with what is described in <xref target="ssec-cancel-forwarding-proxy"/>, a proxy might be asked by the (previous hop closer to the) origin client for an early stop of the ongoing response forwarding.</t>
          <t>That is, the proxy is asked to stop forwarding to the (previous hop closer to the) origin client any further responses received to the forwarded group request from the (next hop towards the) origin servers.</t>
          <t>When this happens, the proxy proceeds as described in <xref target="ssec-cancel-forwarding-proxy"/>. Furthermore, if the proxy is not the last one in the chain, the proxy <bcp14>MAY</bcp14> send to the next hop towards the origin servers an Early Stop Request (see <xref target="ssec-req-proc-proxy-steps"/>), with the same Token value of the group request that the proxy forwarded to the next hop towards the origin servers.</t>
        </section>
      </section>
      <section anchor="sec-proxy-chain-response-processing">
        <name>Response Processing at the Proxy</name>
        <t>Upon receiving a response matching with the group request before the amount of time T' has elapsed, the proxy proceeds as follows.</t>
        <t>If the proxy is the last one in the chain, i.e., it is the last hop before the origin servers, the proxy performs the steps defined in <xref target="ssec-resp-proc-proxy"/> if it is a forward-proxy or in <xref target="sec-reverse-proxies-proxy-side"/> if it is a reverse-proxy, with no modifications.</t>
        <t>Otherwise, the proxy performs the steps defined in <xref target="ssec-resp-proc-proxy"/>, with the following differences.</t>
        <ul spacing="normal">
          <li>
            <t>In any of the two following cases, the proxy skips Step 1, hence the proxy <bcp14>MUST NOT</bcp14> remove, alter, or replace the Reply-From Option.  </t>
            <ul spacing="normal">
              <li>
                <t>The chain is composed of forward-proxies.</t>
              </li>
              <li>
                <t>The chain is composed of reverse-proxies and the last reverse-proxy (in fact, the whole chain) stands in only for the whole group of servers, but not for the individual servers in the group (see <xref target="sec-reverse-proxies-proxy-side"/>).</t>
              </li>
            </ul>
            <t>
This ensures that, when receiving a response to a group request and consuming the Reply-From Option, the origin client can retrieve addressing information that is directly associated with the origin server that generated the response.</t>
          </li>
          <li>
            <t>At Step 1, the following applies if the chain is composed of reverse-proxies and, at the same time, the last reverse-proxy (in fact, the whole chain) stands in both for the whole group of servers and for the individual origin servers in the group (see <xref target="sec-reverse-proxies-proxy-side"/>).  </t>
            <t>
In the Reply-From Option, the proxy <bcp14>MUST</bcp14> replace the old option value TARGET_OLD. The new option value TARGET_NEW specifies addressing information directly associated with the proxy. The new option value is such that, when receiving a unicast request that has been sent according to what is specified in TARGET_NEW, the proxy forwards the request according to what was specified in TARGET_OLD, i.e., to the next hop towards the origin server that generated the response.  </t>
            <t>
This ensures that, when receiving a response to a group request and consuming the Reply-From Option, the origin client can retrieve addressing information that is directly associated with the first reverse-proxy in the chain, i.e., with the next hop towards the origin server that generated the response.</t>
          </li>
          <li>
            <t>At Step 2, "client" refers to the origin client when the proxy is the first one in the chain, or to the proxy acting as the previous hop closer to the origin client otherwise.</t>
          </li>
        </ul>
        <t>As to the possible reception of multiple responses to the same group request from the same (next hop towards the) origin server, the same as defined in <xref target="ssec-resp-proc-proxy-steps"/> applies. That is, as long as the proxy forwards responses to a group request back to the (previous hop closer to the) origin client, the proxy <bcp14>MUST</bcp14> follow the steps above and forward also such multiple responses "as they come".</t>
        <t>Upon timeout expiration, i.e., T' seconds after having forwarded the group request to the next hop towards the origin servers, the proxy frees up its local Token value associated with that request. Thus, following late responses to the same group request will be discarded and not forwarded back to the (previous hop closer to the) origin client.</t>
        <section anchor="sec-proxy-chain-response-processing-observe">
          <name>Supporting Observe</name>
          <t>When using CoAP Observe <xref target="RFC7641"/>, what is defined in <xref target="ssec-resp-proc-proxy-observe"/> applies for the last proxy in the chain, i.e., the last hop before the origin servers.</t>
          <t>As to any other proxy in the chain, the following applies.</t>
          <ul spacing="normal">
            <li>
              <t>The proxy acts as a client registered with the next hop towards the origin servers, as described earlier in <xref target="sec-proxy-chain-request-processing-observe"/>.</t>
            </li>
            <li>
              <t>The proxy takes the role of a server when forwarding notifications from the next hop towards the origin servers back to the (previous hop closer to the) origin client, as per <xref section="5" sectionFormat="of" target="RFC7641"/>.</t>
            </li>
            <li>
              <t>The proxy frees up its Token value used for a group observation only if, after the timeout expiration, no 2.xx (Success) responses matching with the group request and also including an Observe Option have been received from the next hop towards the origin servers.  </t>
              <t>
Otherwise, after the timeout expiration and as long as the observation for the target resource of the group request is active with the next hop towards the origin servers in the group, notifications from that hop are forwarded back to the (previous hop closer to the) origin client, as defined in <xref target="sec-proxy-chain-response-processing"/>.</t>
            </li>
            <li>
              <t>The proxy <bcp14>SHOULD</bcp14> regularly verify that the (previous hop closer to the) origin client is still interested in receiving observe notifications for a group observation. To this end, the proxy can rely on the same approach defined in <xref section="4.5" sectionFormat="of" target="RFC7641"/>.</t>
            </li>
          </ul>
        </section>
      </section>
    </section>
    <section anchor="sec-http-to-coap-proxies">
      <name>HTTP-to-CoAP Proxies</name>
      <t>This section defines the components needed to use the signaling protocol specified in this document, when an HTTP client wishes to send a group request to the servers of a CoAP group via an HTTP-to-CoAP cross-proxy.</t>
      <t>The following builds on the mapping of the CoAP request/response model to HTTP and vice versa as defined in <xref section="10" sectionFormat="of" target="RFC7252"/>, as well as on the additional details about the HTTP-to-CoAP mapping defined in <xref target="RFC8075"/>.</t>
      <t>Furthermore, the components defined in <xref section="11" sectionFormat="of" target="RFC8613"/> are used to map and transport OSCORE-protected messages over HTTP. This allows an HTTP client to use Group OSCORE end-to-end with the servers in the CoAP group.</t>
      <section anchor="sec-multicast-timeout-header">
        <name>The HTTP Multicast-Timeout Header Field</name>
        <t>The HTTP Multicast-Timeout header field (see <xref target="iana-message-headers"/>) is used for carrying the information that is normally specified in the CoAP Multicast-Timeout Option defined in <xref target="sec-multicast-timeout-option"/>.</t>
        <t>Using the Augmented Backus-Naur Form (ABNF) notation of <xref target="RFC5234"/> and including the core ABNF syntax rule DIGIT (decimal digits) defined by that specification, the HTTP Multicast-Timeout header field value is as follows.</t>
        <t>Multicast-Timeout = *DIGIT</t>
        <t>The empty header field is equivalent to the header field conveying the value 0.</t>
        <t>When translating a CoAP message into an HTTP message, the HTTP Multicast-Timeout header field is set with the value of the CoAP Multicast-Timeout Option, or is left empty if the option is empty.</t>
        <t>When translating an HTTP message into a CoAP message, the CoAP Multicast-Timeout Option is set with the content of the HTTP Multicast-Timeout header field, or is left empty if the header field is empty.</t>
      </section>
      <section anchor="sec-reply-from-header">
        <name>The HTTP Reply-From Header Field</name>
        <t>The HTTP Reply-From header field (see <xref target="iana-message-headers"/>) is used for carrying the information that is normally specified in the CoAP Reply-From Option defined in <xref target="sec-reply-from-option"/>. Its use is intended only for HTTP responses.</t>
        <t>Reply-From is a List Structured Header Field <xref target="RFC9651"/>. The List <bcp14>MUST</bcp14> be composed of exactly one or two members. Each member of the List <bcp14>MUST</bcp14> be a Byte Sequence Item. Any deviation from such format <bcp14>MUST</bcp14> cause the entire header field to be ignored.</t>
        <t>The value of the header field specifies addressing information pertaining to the origin server that generated the CoAP response corresponding to the HTTP response. The client can use this information in order to send an individual request intended to that server.</t>
        <t>When translating a CoAP message into an HTTP message, the value of the HTTP Reply-From header field is built as follows.</t>
        <ul spacing="normal">
          <li>
            <t>The first Byte Sequence Item encodes the byte serialization of the first CBOR array of the CBOR sequence that is specified as the value of the CoAP Reply-From Option.</t>
          </li>
          <li>
            <t>The second Byte Sequence Item encodes the byte serialization of the second CBOR array (if present) of the CBOR sequence that is specified as the value of the CoAP Reply-From Option.  </t>
            <t>
If the CBOR sequence specified in the value of the CoAP Reply-From Option does not include the second CBOR array, then this Byte Sequence Item <bcp14>MUST NOT</bcp14> be included in the List of the HTTP Reply-From header field.</t>
          </li>
        </ul>
        <t>When translating an HTTP message into a CoAP message, the value of the CoAP Reply-From Option is built as follows.</t>
        <ul spacing="normal">
          <li>
            <t>The first CBOR array of the CBOR sequence is obtained by decoding the first Byte Sequence Item in the List that is specified as the value of the HTTP Reply-From header field.</t>
          </li>
          <li>
            <t>The second CBOR array of the CBOR sequence is obtained by decoding the second Byte Sequence Item (if present) in the List that is specified as the value of the HTTP Reply-From header field.  </t>
            <t>
If the List of the HTTP Reply-From header field does not include the second Byte Sequence Item, then this second CBOR array <bcp14>MUST NOT</bcp14> be included in the CBOR sequence specified in the value of the CoAP Reply-From Option.</t>
          </li>
        </ul>
      </section>
      <section anchor="sec-group-etag-header">
        <name>The HTTP Group-ETag Header Field</name>
        <t>The HTTP Group-ETag header field (see <xref target="iana-message-headers"/>) is used for carrying the information that is normally specified in the CoAP Group-ETag Option defined in <xref target="sec-proxy-caching-validation-c-p"/>.</t>
        <t>Group-ETag is a List Structured Header Field <xref target="RFC9651"/>. The List <bcp14>MUST</bcp14> be composed of one or more members in HTTP requests and by exactly one member in HTTP responses. Each member of the List <bcp14>MUST</bcp14> be a Byte Sequence Item. Any deviation from such format <bcp14>MUST</bcp14> cause the entire header field to be ignored.</t>
        <t>The value of the header field specifies a set of entity-tag values, each of which is associated with a set of cache entries at the proxy that can be hit by a group request (see <xref target="sec-proxy-caching-validation-c-p"/>).</t>
        <t>When translating a CoAP message into an HTTP message, the value of the HTTP Group-ETag header field is built as follows.</t>
        <ul spacing="normal">
          <li>
            <t>When translating a CoAP request to an HTTP request, the List of the HTTP Group-ETag header field <bcp14>MUST</bcp14> include N members, where N is the number of CoAP Group-ETag Options in the CoAP request. The i-th member of the List encodes the value specified in the i-th CoAP Group-ETag Option in the CoAP request.</t>
          </li>
          <li>
            <t>When translating a CoAP response to an HTTP response, the List of the HTTP Group-ETag header field <bcp14>MUST</bcp14> include one member, which encodes the value specified in the CoAP Group-ETag Option in the CoAP response.</t>
          </li>
        </ul>
        <t>When translating an HTTP message into a CoAP message, the value of the CoAP Group-ETag Options is built as follows.</t>
        <ul spacing="normal">
          <li>
            <t>When translating an HTTP request to a CoAP request, N CoAP Group-ETag Options are included in the CoAP request, where N is the number of members of the List of the HTTP Group-ETag header field. The value of the i-th CoAP Group-ETag Option is obtained by decoding the i-th member of the List of the HTTP Group-ETag header field.</t>
          </li>
          <li>
            <t>When translating an HTTP response to a CoAP response, one CoAP Group-ETag Option is included in the CoAP response. The value of the CoAP Group-ETag Option is obtained by decoding the only member of the List of the HTTP Group-ETag header field.</t>
          </li>
        </ul>
        <t>When sending to the HTTP-to-CoAP proxy an HTTP GET request to be translated into a CoAP GET request intended to the CoAP group, the client <bcp14>MAY</bcp14> include one HTTP Group-ETag header field in the request. The field value is a list of one or more members, each of which encodes one entity-tag value that is applicable to the set J of cache entries that can be hit by the request (see <xref target="sec-proxy-caching-validation-c-p"/>).</t>
        <t>An HTTP-to-CoAP proxy that performs the form of validation defined in <xref target="sec-proxy-caching-validation-c-p"/> proceeds like defined in <xref target="sec-proxy-caching-validation-c-p"/> for a CoAP-to-CoAP proxy, with the following differences.</t>
        <ul spacing="normal">
          <li>
            <t>When sending to the client an HTTP 200 (OK) response to an HTTP GET request that was translated into a CoAP GET request sent to the CoAP group, the proxy <bcp14>MAY</bcp14> include one HTTP Group-ETag header field in the response, if the set J is "complete". The field value is a List composed of one member, which encodes the entity-tag value currently associated with the set J.</t>
          </li>
          <li>
            <t>When the HTTP-to-CoAP proxy receives an HTTP GET request to be translated into a CoAP GET request intended to the CoAP group and that includes an HTTP Group-ETag header field, the following applies.  </t>
            <ul spacing="normal">
              <li>
                <t>As to the entity-tag values used to check for possible cache hits, the HTTP-to-CoAP proxy obtains those values by decoding the members of the List of the HTTP Group-ETag header field in the HTTP request.</t>
              </li>
              <li>
                <t>If the same conditions for which a CoAP-to-CoAP proxy would reply with a single CoAP 2.03 (Valid) response hold, then the HTTP-to-CoAP proxy replies with a single HTTP 304 (Not Modified) response. The response <bcp14>MUST</bcp14> include one HTTP Group-ETag header field whose value is a List composed of one member, which encodes the current entity-tag value of the set J.</t>
              </li>
            </ul>
          </li>
        </ul>
        <t>An HTTP 304 (Not Modified) response from the HTTP-to-CoAP proxy indicates to the client that it is possible to reuse the stored responses identified by the entity-tag encoded by the only member of the List of the HTTP Group-ETag header field.</t>
      </section>
      <section anchor="sec-cross-proxies-client-req">
        <name>Request Sending at the Client</name>
        <t>The client proceeds according to the following steps.</t>
        <ol spacing="normal" type="1"><li>
            <t>The client prepares an HTTP request to send to the proxy via IP unicast and to be forwarded by the proxy to the targeted group of CoAP servers over UDP/IP multicast. With reference to <xref section="5" sectionFormat="of" target="RFC8075"/>, the request is addressed to a Hosting HTTP URI, such that the proxy can extract the Target CoAP URI as the group URI where to forward the request.</t>
          </li>
          <li>
            <t>The client determines the amount of time T that it is fine to wait for a response to the request from the proxy. Then, the client determines the amount of time T' &lt; T, where the difference (T - T') should be at least the expected worst-case round-trip time between the client and the proxy.</t>
          </li>
          <li>
            <t>If Group OSCORE is used end-to-end between the client and the servers, the client translates the HTTP request into a CoAP request, as per <xref target="RFC8075"/>. Then, the client protects the resulting CoAP request by using Group OSCORE, as defined in <xref target="I-D.ietf-core-oscore-groupcomm"/>. Finally, the protected CoAP request is mapped to HTTP as defined in <xref section="11.2" sectionFormat="of" target="RFC8613"/>. Later on, the resulting HTTP request <bcp14>MUST</bcp14> be sent in compliance with the rules in <xref section="11.1" sectionFormat="of" target="RFC8613"/>.</t>
          </li>
          <li>
            <t>The client includes the HTTP Multicast-Timeout header field in the request, specifying T' as its value. The client can specify T' = 0, thus indicating to be not interested in receiving responses from the origin servers through the proxy.</t>
          </li>
          <li>
            <t>If the client wishes to revalidate responses to a previous group request from the corresponding cache entries at the proxy (see <xref target="sec-proxy-caching-validation-c-p"/>), the client includes one or multiple HTTP Group-ETag header fields in the request (see <xref target="sec-group-etag-header"/>), each specifying an entity-tag value like they would in a corresponding CoAP Group E-Tag Option.</t>
          </li>
          <li>
            <t>The client sends the request to the proxy, as a unicast HTTP message. In particular, the client protects the request according to the security association that it has with the proxy.</t>
          </li>
        </ol>
      </section>
      <section anchor="sec-cross-proxies-proxy-req">
        <name>Request Processing at the Proxy</name>
        <t>The proxy translates the HTTP request to a CoAP request, as per <xref target="RFC8075"/>. The additional rules for HTTP messages with the HTTP Multicast-Timeout header field and HTTP Group-ETag header field are defined in <xref target="sec-multicast-timeout-header"/> and <xref target="sec-group-etag-header"/>, respectively.</t>
        <t>Once translated the HTTP request into a CoAP request, the proxy performs the steps defined in <xref target="ssec-req-proc-proxy"/>. If the proxy supports caching of responses, it can serve the unicast request also by using cached responses as per <xref target="sec-proxy-caching"/>, considering the CoAP request above as the potentially matching request.</t>
        <t>In addition, if the HTTP Multicast-Timeout header field had value 0, the proxy replies to the client with an HTTP response with status code 204 (No Content), right after forwarding the group request to the group of servers.</t>
      </section>
      <section anchor="sec-cross-proxies-proxy-resp">
        <name>Response Processing at the Proxy</name>
        <t>Upon receiving a CoAP response matching with the group request before the amount of time T' &gt; 0 has elapsed, the proxy includes the Reply-From Option in the response, as per Step 1 of <xref target="ssec-resp-proc-proxy-steps"/>. Then, the proxy translates the CoAP response to an HTTP response, as per <xref section="10.1" sectionFormat="of" target="RFC7252"/> and <xref target="RFC8075"/>, as well as <xref section="11.2" sectionFormat="of" target="RFC8613"/> if Group OSCORE is used end-to-end between the client and servers. The additional rules for CoAP messages specifying the Reply-From Option are defined in <xref target="sec-reply-from-header"/>.</t>
        <t>After that, the proxy stores the resulting HTTP response until the timeout with original value T' &gt; 0 expires. If, before then, the proxy receives another response to the same group request from the same CoAP server, the proxy performs the steps above and stores the resulting HTTP response by replacing the currently stored one from that server.</t>
        <t>When the timeout expires, if no responses have been received from the servers, the proxy replies to the client's original unicast group request with an HTTP response with status code 204 (No Content).</t>
        <t>Otherwise, the proxy relays to the client all the collected and stored HTTP responses to the group request, according to the following steps.</t>
        <ol spacing="normal" type="1"><li>
            <t>The proxy prepares a single HTTP batch response, which <bcp14>MUST</bcp14> have 200 (OK) status code and <bcp14>MUST</bcp14> have its HTTP Content-Type header field with value multipart/mixed <xref target="RFC2046"/>.</t>
          </li>
          <li>
            <t>For each stored individual HTTP response RESP, the proxy prepares a corresponding batch part to include in the HTTP batch response, such that:  </t>
            <ul spacing="normal">
              <li>
                <t>The batch part has its own HTTP Content-Type header field with value application/http <xref target="RFC9112"/>.</t>
              </li>
              <li>
                <t>The body of the batch part is the individual HTTP response RESP, including its status code, headers, and body.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>The proxy includes each batch part prepared at Step 2 in the HTTP batch response.</t>
          </li>
          <li>
            <t>The proxy replies to the client's original unicast group request, by sending the HTTP batch response. When doing so, the proxy protects the response according to the security association that it has with the client.</t>
          </li>
        </ol>
      </section>
      <section anchor="sec-cross-proxies-client-resp">
        <name>Response Processing at the Client</name>
        <t>When it receives an HTTP response as a reply to the original unicast group request, the client proceeds as follows:</t>
        <ol spacing="normal" type="1"><li>
            <t>The client decrypts and verifies the response, according to the security association that it has with the proxy.</t>
          </li>
          <li>
            <t>From the resulting HTTP batch response, the client extracts the different batch parts.</t>
          </li>
          <li>
            <t>From each of the extracted batch parts, the client extracts the body as one of the individual HTTP response RESP.</t>
          </li>
          <li>
            <t>For each individual HTTP response RESP, the client performs the following steps:  </t>
            <t>
a. If Group OSCORE is used end-to-end between the client and servers, the client translates the HTTP response RESP into a CoAP response, as per <xref section="11.3" sectionFormat="of" target="RFC8613"/>. Then, the client decrypts and verifies the resulting CoAP response by using Group OSCORE, as defined in <xref target="I-D.ietf-core-oscore-groupcomm"/>. Finally, the decrypted CoAP response is mapped to HTTP as per <xref section="10.2" sectionFormat="of" target="RFC7252"/> as well as <xref target="RFC8075"/>. The additional rules for HTTP messages with the HTTP Reply-From header field are defined in <xref target="sec-reply-from-header"/>.  </t>
            <t>
b. The client delivers the individual HTTP response to the application.  </t>
            <t>
Similarly to Step 3 in <xref target="ssec-resp-proc-client-steps"/>, the client identifies the origin server that originated the CoAP response corresponding to the HTTP response RESP, by means of the addressing information specified as the value of the HTTP Reply-From header field. This allows the client to distinguish different individual HTTP responses as corresponding to different CoAP responses from the servers in the CoAP group.</t>
          </li>
        </ol>
      </section>
      <section anchor="sec-cross-proxies-example">
        <name>Example</name>
        <t>The examples in this section build on <xref target="sec-workflow-example"/>, with the difference that the origin client C is an HTTP client and the proxy P is an HTTP-to-CoAP cross-proxy. The examples are simply illustrative and are not to be intended as a test vector.</t>
        <t>The following is an example of unicast group request sent by C to P. The URI mapping and notation are based on the "Simple Form" defined in <xref section="5.4.1" sectionFormat="of" target="RFC8075"/>.</t>
        <artwork><![CDATA[
POST https://proxy.url/hc/?target_uri=coap://G_ADDR:G_PORT/ HTTP/1.1
Content-Length: <REQUEST_TOTAL_CONTENT_LENGTH>
Content-Type: text/plain
Multicast-Timeout: 60

Body: Do that!
]]></artwork>
        <t><br/></t>
        <t>The following is an example of HTTP batch response sent by P to C, as a reply to the client's original unicast group request.</t>
        <t>For readability, base64url(cri'X') denotes the base64url encoding of cri'X' without padding (see <xref section="5" sectionFormat="of" target="RFC4648"/>) and cri'X' denotes the byte serialization of a CRI corresponding to the URI X, i.e., of a CRI that can be converted to the URI X using the procedure defined in <xref section="6.1" sectionFormat="of" target="I-D.ietf-core-href"/>.</t>
        <artwork><![CDATA[
HTTP/1.1 200 OK
Content-Length: <BATCH_RESPONSE_TOTAL_CONTENT_LENGTH>
Content-Type: multipart/mixed; boundary=batch_foo_bar

--batch_foo_bar
Content-Type: application/http

HTTP/1.1 200 OK
Content-Type: text/plain
Content-Length: <INDIVIDUAL_RESPONSE_1_CONTENT_LENGTH>
Reply-From: base64url(cri'coap://S1_ADDR:G_PORT')

Body: Done!
--batch_foo_bar
Content-Type: application/http

HTTP/1.1 200 OK
Content-Type: text/plain
Content-Length: <INDIVIDUAL_RESPONSE_2_CONTENT_LENGTH>
Reply-From: base64url(cri'coap://S2_ADDR:S2_PORT')

Body: More than done!
--batch_foo_bar--
]]></artwork>
      </section>
      <section anchor="sec-resp-streaming">
        <name>Streamed Delivery of Responses to the Client</name>
        <t>[ TODO</t>
        <t>The proxy might still be able to forward back individual responses to the client in a streamed fashion.</t>
        <t>Individual responses can be forwarded back one by one as they come (like a CoAP-to-CoAP proxy does), or as soon as a certain amount of them has been received from the servers.</t>
        <t>This can be achieved by combining the Content-Type multipart/mixed used in the previous sections with the Transfer-Coding "chunked" specified in RFC 9112.</t>
        <t>The above applies to HTTP 1.1, while HTTP/2 has its own mechanisms for data streaming.</t>
        <t>]</t>
      </section>
      <section anchor="sec-reverse-proxies-http-to-coap">
        <name>Reverse-Proxies</name>
        <t>If an HTTP-to-CoAP proxy acts specifically as a reverse-proxy, the same principles defined in <xref target="sec-reverse-proxies"/> apply, as specified in the following subsections.</t>
        <section anchor="sec-reverse-proxies-client-side-http">
          <name>Processing on the Client Side</name>
          <t>If an HTTP client sends a request intended to a group of servers and is aware of actually communicating with a reverse-proxy, then the client performs the steps defined in <xref target="sec-cross-proxies-client-req"/>. In particular, this results in a request sent to the proxy and including a Multicast-Timeout header field.</t>
          <t>The client processes the HTTP response forwarded back by the proxy as defined in <xref target="sec-cross-proxies-client-resp"/>. If the client wishes to send a follow-up unicast request intended only for one of the CoAP servers that generated the response, the same concepts defined in <xref target="sec-reverse-proxies-client-side"/> apply to the composition of HTTP requests.</t>
        </section>
        <section anchor="sec-reverse-proxies-proxy-side-http">
          <name>Processing on the Proxy Side</name>
          <t>If the proxy receives a request and determines that the request should be forwarded to a group of servers over UDP/IP multicast, then the same as defined in <xref target="sec-cross-proxies-proxy-req"/> applies, with the following difference.</t>
          <ul spacing="normal">
            <li>
              <t>Once translated the HTTP request into a CoAP request, the proxy performs what is defined in <xref target="sec-reverse-proxies-proxy-side"/>.</t>
            </li>
          </ul>
          <t>The proxy processes the HTTP response sent to the client as defined in <xref target="sec-cross-proxies-proxy-resp"/>.</t>
        </section>
      </section>
    </section>
    <section anchor="sec-security-considerations">
      <name>Security Considerations</name>
      <t>The security considerations from <xref target="RFC7252"/>, <xref target="I-D.ietf-core-groupcomm-bis"/>, <xref target="RFC8613"/>, and <xref target="I-D.ietf-core-oscore-groupcomm"/> hold for this document.</t>
      <t>When a chain of proxies is used (see <xref target="sec-proxy-chain"/>), the secure communication between any two adjacent hops is independent of that between any other two adjacent hops.</t>
      <t>When Group OSCORE is used for end-to-end secure group communication between the origin client and the origin servers, this security association is unaffected by the possible presence of a proxy or a chain of proxies.</t>
      <t>Furthermore, the following additional considerations hold.</t>
      <section anchor="sec-security-considerations-client-auth">
        <name>Client Authentication</name>
        <t>As per the requirement REQ2 (see <xref target="sec-objectives"/>), the client has to authenticate to the proxy when sending a group request to forward. This leverages an established security association between the client and the proxy, which the client uses to protect the group request before sending it to the proxy.</t>
        <t>If the group request is also protected end-to-end between the client and the origin servers using the group mode of Group OSCORE, the proxy can act as an external signature checker (see <xref section="7.5" sectionFormat="of" target="I-D.ietf-core-oscore-groupcomm"/>) and authenticate the client by successfully verifying the signature embedded in the group request.</t>
        <t>However, this requires the proxy to store, for each client to authenticate, the authentication credential that the client uses in the OSCORE group and the public key included therein, and to also store the authentication credential of the Group Manager responsible for the OSCORE group. This in turn would require a form of active synchronization between the proxy and the Group Manager for that group <xref target="I-D.ietf-core-oscore-groupcomm"/>.</t>
        <t>Furthermore, when specifically acting as an external signature checker for an OSCORE group, the proxy can leverage its knowledge of the authentication credential of the Group Manager for that group, combined with the IP multicast address where to forward a group request and the Group Identifier of the OSCORE group (i.e., the ID Context specified in the OSCORE Option of the group request). Such combined information enables the proxy to fully identify the OSCORE group that the client is communicating in, which might not be desirable for that specific host acting as a proxy. Conversely, if the proxy does not act as an external signature checker and does not have the authentication credential of the Group Manager, the proxy is not able to fully and unambiguously identify the security group that the client is communicating in.</t>
        <t>Irrespective of the above, the client and the proxy <bcp14>SHOULD</bcp14> still rely on a full-fledged pairwise secure association. In addition to ensuring the integrity of group requests sent to the proxy (see <xref target="sec-security-considerations-opt1"/>, <xref target="sec-security-considerations-opt2"/>, and <xref target="sec-security-considerations-opt3"/>), this prevents the proxy from forwarding replayed group requests with a valid signature, as possibly injected by an active, on-path adversary.</t>
        <t>The same considerations above apply when a chain of proxies is used (see <xref target="sec-proxy-chain"/>), with each proxy but the last one in the chain acting as a client with the next hop towards the origin servers.</t>
      </section>
      <section anchor="sec-security-considerations-opt1">
        <name>Multicast-Timeout Option</name>
        <t>The Multicast-Timeout Option is of class U for OSCORE <xref target="RFC8613"/>. Hence, also when Group OSCORE is used between the client and the servers <xref target="I-D.ietf-core-oscore-groupcomm"/>, a proxy is able to access the option value and retrieve the timeout value T', as well as to remove the option altogether before forwarding the group request to the servers. When a chain of proxies is used (see <xref target="sec-proxy-chain"/>), this also allows each proxy but the last one in the chain to update the option value, as an indication for the next hop towards the origin servers (see <xref target="sec-proxy-chain-request-processing"/>).</t>
        <t>The security association between the client and the proxy <bcp14>MUST</bcp14> provide message integrity, so that further intermediaries between the two as well as on-path active adversaries are not able to undetectably remove the option or alter its value, before the group request reaches the proxy.</t>
        <t>Removing the option would result in not forwarding the group request to the servers. Altering the option value would result in the proxy accepting and forwarding back responses for an amount of time different from the one actually indicated by the client.</t>
        <t>The security association between the client and the proxy <bcp14>SHOULD</bcp14> also provide message confidentiality. Otherwise, any further intermediaries between the two as well as any on-path passive adversaries would be able to access the option value, thereby learning for how long the client is willing to receive responses from the servers in the group via the proxy. This may in turn be used by an on-path active adversary to perform a more efficient, selective suppression of responses from the servers.</t>
        <t>When the client protects the unicast request sent to the proxy using OSCORE (see <xref target="I-D.ietf-core-oscore-capable-proxies"/>) and/or (D)TLS, both message integrity and message confidentiality are achieved in the leg between the client and the proxy.</t>
        <t>The same considerations above about security associations apply when a chain of proxies is used (see <xref target="sec-proxy-chain"/>), with each proxy but the last one in the chain acting as a client with the next hop towards the origin servers.</t>
      </section>
      <section anchor="sec-security-considerations-opt2">
        <name>Reply-From Option</name>
        <t>The Reply-From Option is of class U for OSCORE <xref target="RFC8613"/>. Hence, also when Group OSCORE is used between the client and the servers <xref target="I-D.ietf-core-oscore-groupcomm"/>, the proxy that has forwarded the group request to the servers is able to include the option into a response, before forwarding this response back to the (previous hop closer to the) origin client.</t>
        <t>The security association between the client and the proxy <bcp14>MUST</bcp14> provide message integrity, so that further intermediaries between the two as well as on-path active adversaries are not able to undetectably remove the option from a forwarded response or alter its value. This ensures that the client can correctly distinguish the different responses and identify the corresponding origin servers.</t>
        <t>The security association between the client and the proxy <bcp14>SHOULD</bcp14> also provide message confidentiality. Otherwise, any further intermediaries between the two as well as any on-path passive adversaries would be able to access the option value, thereby learning the addressing information of servers in the group. This may in turn be used by an on-path active adversary to perform a more efficient, selective suppression of follow-up requests that the client sends to a specific server, either directly or instead indirectly via the proxy.</t>
        <t>When the proxy protects the response forwarded back to the client using OSCORE (see <xref target="I-D.ietf-core-oscore-capable-proxies"/>) and/or (D)TLS, both message integrity and message confidentiality are achieved in the leg between the client and the proxy.</t>
        <t>The same considerations above about security associations apply when a chain of proxies is used (see <xref target="sec-proxy-chain"/>), with each proxy but the last one in the chain acting as a client with the next hop towards the origin servers.</t>
      </section>
      <section anchor="sec-security-considerations-opt3">
        <name>Group-ETag Option</name>
        <t>The Group-ETag Option is of class U for OSCORE <xref target="RFC8613"/>. Hence, also when Group OSCORE is used between the client and the servers <xref target="I-D.ietf-core-oscore-groupcomm"/>, a proxy is able to access the option value and use it to possibly perform response revalidation at its cache entries associated with the servers in the CoAP group, as well as to remove the option altogether before forwarding the group request to the servers. When a chain of proxies is used (see <xref target="sec-proxy-chain"/>), this also allows each proxy but the last one in the chain to update the option value, in order to possibly ask the next hop towards the origin servers to perform response revalidation at its cache entries.</t>
        <t>The security association between the client and the proxy <bcp14>MUST</bcp14> provide message integrity, so that further intermediaries between the two as well as on-path active adversaries are not able to undetectably remove the option or alter its value, before the group request reaches the proxy.</t>
        <t>Removing the option would result in the proxy not performing response revalidation at its cache entries associated with the servers in the CoAP group, even though that was what the client asked for.</t>
        <t>Altering the option value in a group request would result in the proxy performing response revalidation based on different entity-tag values from those actually specified by the client. Consequently, the proxy would erroneously reply with multiple 2.05 (Content) responses conveying the full resource representations from its cache entries instead of with a single 2.03 (Valid) response, or vice versa. Instead, altering the option value in a 2.03 (Valid) or 2.05 (Content) response would result in the client wrongly believing that the already stored or the just received representation, respectively, is also the current one, as per the entity value of the tampered Group-ETag Option.</t>
        <t>The security association between the client and the proxy <bcp14>SHOULD</bcp14> also provide message confidentiality. Otherwise, any further intermediaries between the two as well as any on-path passive adversaries would be able to access the option value, thereby learning the rate and pattern according to which the group resource in question changes over time, as inferable from the entity values read over time.</t>
        <t>When the client protects the unicast request sent to the proxy using OSCORE (see <xref target="I-D.ietf-core-oscore-capable-proxies"/>) and/or (D)TLS, both message integrity and message confidentiality are achieved in the leg between the client and the proxy.</t>
        <t>The same considerations above about security associations apply when a chain of proxies is used (see <xref target="sec-proxy-chain"/>), with each proxy but the last one in the chain acting as a client with the next hop towards the origin servers.</t>
        <t>When the caching of responses protected with Group OSCORE is enabled at the proxy, the same as defined in <xref target="sec-proxy-caching"/> applies, with respect to cache entries and the way they are maintained.</t>
      </section>
      <section anchor="sec-http-to-coap-proxies-sec-con">
        <name>HTTP-to-CoAP Proxies</name>
        <t>Consistent with what is discussed in <xref target="sec-security-considerations-client-auth"/>, an HTTP client has to authenticate to the HTTP-to-CoAP proxy and they <bcp14>SHOULD</bcp14> rely on a full-fledged pairwise secure association. This can rely on a TLS <xref target="RFC9846"/> channel as also recommended in <xref section="12.1" sectionFormat="of" target="RFC8613"/> for when OSCORE is used with HTTP, or on a pairwise OSCORE Security Context shared between the client and the proxy as defined in <xref target="I-D.ietf-core-oscore-capable-proxies"/>.</t>
        <t>[ TODO</t>
        <t>Revisit security considerations from <xref target="RFC8075"/></t>
        <t>]</t>
      </section>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>This document has the following actions for IANA.</t>
      <t>Note to RFC Editor: Please replace all occurrences of "[RFC-XXXX]" with the RFC number of this specification and delete this paragraph.</t>
      <section anchor="iana-coap-options">
        <name>CoAP Option Numbers Registry</name>
        <t>IANA is asked to enter the following option numbers to the "CoAP Option Numbers" registry <xref target="IANA.CoAP.Option.Numbers"/> within the "Constrained RESTful Environments (CoRE) Parameters" registry group.</t>
        <table align="center" anchor="tab-iana-coap-option-numbers">
          <name>Registrations in the CoAP Option Numbers Registry</name>
          <thead>
            <tr>
              <th align="left">Number</th>
              <th align="left">Name</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">TBD2</td>
              <td align="left">Multicast-Timeout</td>
              <td align="left">[RFC-XXXX]</td>
            </tr>
            <tr>
              <td align="left">TBD248</td>
              <td align="left">Reply-From</td>
              <td align="left">[RFC-XXXX]</td>
            </tr>
            <tr>
              <td align="left">TBD24</td>
              <td align="left">Group-ETag</td>
              <td align="left">[RFC-XXXX]</td>
            </tr>
          </tbody>
        </table>
        <t>Note to RFC Editor: Please replace "TBD2", "TBD248", and "TBD24" in <xref target="tab-iana-coap-option-numbers"/> with the assigned option numbers. Then please delete this paragraph and the following text within the present <xref target="iana-coap-options"/>.</t>
        <t>For all the three requested options, it is preferred to assign an option number from the value range 0-255.</t>
        <t>For the Multicast-Timeout option, the number suggested to IANA is 2.</t>
        <t>For the Reply-From option, the number suggested to IANA is 248.</t>
        <t>For the Group-ETag option, the number suggested to IANA is 24.</t>
      </section>
      <section anchor="iana-message-headers">
        <name>Hypertext Transfer Protocol (HTTP) Field Name Registry</name>
        <t>IANA is asked to enter the following HTTP header fields to the "Hypertext Transfer Protocol (HTTP) Field Name Registry" <xref target="IANA.HTTP.Field.Name"/>.</t>
        <table align="center" anchor="tab-iana-http-field-names">
          <name>Registrations in the Hypertext Transfer Protocol (HTTP) Field Name Registry</name>
          <thead>
            <tr>
              <th align="left">Field Name</th>
              <th align="left">Status</th>
              <th align="left">Structured Type</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Multicast-Timeout</td>
              <td align="left">permanent</td>
              <td align="left"> </td>
              <td align="left">[RFC-XXXX]</td>
            </tr>
            <tr>
              <td align="left">Reply-From</td>
              <td align="left">permanent</td>
              <td align="left">List</td>
              <td align="left">[RFC-XXXX]</td>
            </tr>
            <tr>
              <td align="left">Group-ETag</td>
              <td align="left">permanent</td>
              <td align="left">List</td>
              <td align="left">[RFC-XXXX]</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="I-D.ietf-core-groupcomm-bis">
          <front>
            <title>Group Communication for the Constrained Application Protocol (CoAP)</title>
            <author fullname="Esko Dijk" initials="E." surname="Dijk">
              <organization>IoTconsultancy.nl</organization>
            </author>
            <author fullname="Marco Tiloca" initials="M." surname="Tiloca">
              <organization>RISE AB</organization>
            </author>
            <date day="10" month="February" year="2026"/>
            <abstract>
              <t>   The Constrained Application Protocol (CoAP) is a web transfer
   protocol for constrained devices and constrained networks.  In a
   number of use cases, constrained devices often naturally operate in
   groups (e.g., in a building automation scenario, all lights in a
   given room may need to be switched on/off as a group).  This document
   specifies the use of CoAP for group communication, including the use
   of UDP/IP multicast as the default underlying data transport.  Both
   unsecured and secured CoAP group communication are specified.
   Security is achieved by use of the Group Object Security for
   Constrained RESTful Environments (Group OSCORE) protocol.  The target
   application area of this specification is any group communication use
   cases that involve resource-constrained devices or networks that
   support CoAP.  This document replaces and obsoletes RFC 7390, while
   it updates RFC 7252 and RFC 7641.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-core-groupcomm-bis-18"/>
        </reference>
        <reference anchor="I-D.ietf-core-oscore-groupcomm">
          <front>
            <title>Group Object Security for Constrained RESTful Environments (Group OSCORE)</title>
            <author fullname="Marco Tiloca" initials="M." surname="Tiloca">
              <organization>RISE AB</organization>
            </author>
            <author fullname="Göran Selander" initials="G." surname="Selander">
              <organization>Ericsson AB</organization>
            </author>
            <author fullname="Francesca Palombini" initials="F." surname="Palombini">
              <organization>Ericsson AB</organization>
            </author>
            <author fullname="John Preuß Mattsson" initials="J. P." surname="Mattsson">
              <organization>Ericsson AB</organization>
            </author>
            <author fullname="Rikard Höglund" initials="R." surname="Höglund">
              <organization>RISE AB</organization>
            </author>
            <date day="23" month="December" year="2025"/>
            <abstract>
              <t>   This document defines the security protocol Group Object Security for
   Constrained RESTful Environments (Group OSCORE), providing end-to-end
   security of messages exchanged with the Constrained Application
   Protocol (CoAP) between members of a group, e.g., sent over IP
   multicast.  In particular, the described protocol defines how OSCORE
   is used in a group communication setting to provide source
   authentication for CoAP group requests, sent by a client to multiple
   servers, and for protection of the corresponding CoAP responses.
   Group OSCORE also defines a pairwise mode where each member of the
   group can efficiently derive a symmetric pairwise key with each other
   member of the group for pairwise OSCORE communication.  Group OSCORE
   can be used between endpoints communicating with CoAP or CoAP-
   mappable HTTP.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-core-oscore-groupcomm-28"/>
        </reference>
        <reference anchor="I-D.ietf-core-href">
          <front>
            <title>Constrained Resource Identifiers</title>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <author fullname="Henk Birkholz" initials="H." surname="Birkholz">
              <organization>Fraunhofer SIT</organization>
            </author>
            <date day="21" month="November" year="2025"/>
            <abstract>
              <t>   The Constrained Resource Identifier (CRI) is a complement to the
   Uniform Resource Identifier (URI) that represents the URI components
   in Concise Binary Object Representation (CBOR) rather than as a
   sequence of characters.  This approach simplifies parsing,
   comparison, and reference resolution in environments with severe
   limitations on processing power, code size, and memory size.

   This RFC updates RFC 7595 by adding a column on the "URI Schemes"
   registry.


   // (This "cref" paragraph will be removed by the RFC editor:) After
   // approval of -28 and nit fixes in -29, the present revision -30
   // contains two more small fixes for nits that were uncovered in the
   // RPC intake process.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-core-href-30"/>
        </reference>
        <reference anchor="I-D.ietf-core-uri-path-abbrev">
          <front>
            <title>URI Path abbreviation in CoAP</title>
            <author fullname="Christian Amsüss" initials="C." surname="Amsüss">
         </author>
            <author fullname="Michael Richardson" initials="M." surname="Richardson">
              <organization>Sandelman Software Works</organization>
            </author>
            <date day="6" month="July" year="2026"/>
            <abstract>
              <t>   Applications built on CoAP face a conflict between the technical need
   for short message sizes and the interoperability requirement of
   following BCP190 and thus using (relatively verbose) well-known URI
   paths.  This document introduces the Uri-Path-Abbrev CoAP option that
   allows expressing well-known URI paths in as little as two bytes.

   Using this option revealed a subtle flaw in RFC7252 that severely
   limited the extension point of critical options.  This document
   updates RFC7252 to rectify that.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-core-uri-path-abbrev-05"/>
        </reference>
        <reference anchor="RFC2046">
          <front>
            <title>Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types</title>
            <author fullname="N. Freed" initials="N." surname="Freed"/>
            <author fullname="N. Borenstein" initials="N." surname="Borenstein"/>
            <date month="November" year="1996"/>
            <abstract>
              <t>This second document defines the general structure of the MIME media typing system and defines an initial set of media types. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2046"/>
          <seriesInfo name="DOI" value="10.17487/RFC2046"/>
        </reference>
        <reference anchor="RFC4648">
          <front>
            <title>The Base16, Base32, and Base64 Data Encodings</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <date month="October" year="2006"/>
            <abstract>
              <t>This document describes the commonly used base 64, base 32, and base 16 encoding schemes. It also discusses the use of line-feeds in encoded data, use of padding in encoded data, use of non-alphabet characters in encoded data, use of different encoding alphabets, and canonical encodings. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4648"/>
          <seriesInfo name="DOI" value="10.17487/RFC4648"/>
        </reference>
        <reference anchor="RFC5234">
          <front>
            <title>Augmented BNF for Syntax Specifications: ABNF</title>
            <author fullname="D. Crocker" initials="D." role="editor" surname="Crocker"/>
            <author fullname="P. Overell" initials="P." surname="Overell"/>
            <date month="January" year="2008"/>
            <abstract>
              <t>Internet technical specifications often need to define a formal syntax. Over the years, a modified version of Backus-Naur Form (BNF), called Augmented BNF (ABNF), has been popular among many Internet specifications. The current specification documents ABNF. It balances compactness and simplicity with reasonable representational power. The differences between standard BNF and ABNF involve naming rules, repetition, alternatives, order-independence, and value ranges. This specification also supplies additional rule definitions and encoding for a core lexical analyzer of the type common to several Internet specifications. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="68"/>
          <seriesInfo name="RFC" value="5234"/>
          <seriesInfo name="DOI" value="10.17487/RFC5234"/>
        </reference>
        <reference anchor="RFC7252">
          <front>
            <title>The Constrained Application Protocol (CoAP)</title>
            <author fullname="Z. Shelby" initials="Z." surname="Shelby"/>
            <author fullname="K. Hartke" initials="K." surname="Hartke"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="June" year="2014"/>
            <abstract>
              <t>The Constrained Application Protocol (CoAP) is a specialized web transfer protocol for use with constrained nodes and constrained (e.g., low-power, lossy) networks. The nodes often have 8-bit microcontrollers with small amounts of ROM and RAM, while constrained networks such as IPv6 over Low-Power Wireless Personal Area Networks (6LoWPANs) often have high packet error rates and a typical throughput of 10s of kbit/s. The protocol is designed for machine- to-machine (M2M) applications such as smart energy and building automation.</t>
              <t>CoAP provides a request/response interaction model between application endpoints, supports built-in discovery of services and resources, and includes key concepts of the Web such as URIs and Internet media types. CoAP is designed to easily interface with HTTP for integration with the Web while meeting specialized requirements such as multicast support, very low overhead, and simplicity for constrained environments.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7252"/>
          <seriesInfo name="DOI" value="10.17487/RFC7252"/>
        </reference>
        <reference anchor="RFC7641">
          <front>
            <title>Observing Resources in the Constrained Application Protocol (CoAP)</title>
            <author fullname="K. Hartke" initials="K." surname="Hartke"/>
            <date month="September" year="2015"/>
            <abstract>
              <t>The Constrained Application Protocol (CoAP) is a RESTful application protocol for constrained nodes and networks. The state of a resource on a CoAP server can change over time. This document specifies a simple protocol extension for CoAP that enables CoAP clients to "observe" resources, i.e., to retrieve a representation of a resource and keep this representation updated by the server over a period of time. The protocol follows a best-effort approach for sending new representations to clients and provides eventual consistency between the state observed by each client and the actual resource state at the server.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7641"/>
          <seriesInfo name="DOI" value="10.17487/RFC7641"/>
        </reference>
        <reference anchor="RFC7967">
          <front>
            <title>Constrained Application Protocol (CoAP) Option for No Server Response</title>
            <author fullname="A. Bhattacharyya" initials="A." surname="Bhattacharyya"/>
            <author fullname="S. Bandyopadhyay" initials="S." surname="Bandyopadhyay"/>
            <author fullname="A. Pal" initials="A." surname="Pal"/>
            <author fullname="T. Bose" initials="T." surname="Bose"/>
            <date month="August" year="2016"/>
            <abstract>
              <t>There can be machine-to-machine (M2M) scenarios where server responses to client requests are redundant. This kind of open-loop exchange (with no response path from the server to the client) may be desired to minimize resource consumption in constrained systems while updating many resources simultaneously or performing high-frequency updates. CoAP already provides Non-confirmable (NON) messages that are not acknowledged by the recipient. However, the request/response semantics still require the server to respond with a status code indicating "the result of the attempt to understand and satisfy the request", per RFC 7252.</t>
              <t>This specification introduces a CoAP option called 'No-Response'. Using this option, the client can explicitly express to the server its disinterest in all responses against the particular request. This option also provides granular control to enable expression of disinterest to a particular response class or a combination of response classes. The server MAY decide to suppress the response by not transmitting it back to the client according to the value of the No-Response option in the request. This option may be effective for both unicast and multicast requests. This document also discusses a few examples of applications that benefit from this option.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7967"/>
          <seriesInfo name="DOI" value="10.17487/RFC7967"/>
        </reference>
        <reference anchor="RFC8075">
          <front>
            <title>Guidelines for Mapping Implementations: HTTP to the Constrained Application Protocol (CoAP)</title>
            <author fullname="A. Castellani" initials="A." surname="Castellani"/>
            <author fullname="S. Loreto" initials="S." surname="Loreto"/>
            <author fullname="A. Rahman" initials="A." surname="Rahman"/>
            <author fullname="T. Fossati" initials="T." surname="Fossati"/>
            <author fullname="E. Dijk" initials="E." surname="Dijk"/>
            <date month="February" year="2017"/>
            <abstract>
              <t>This document provides reference information for implementing a cross-protocol network proxy that performs translation from the HTTP protocol to the Constrained Application Protocol (CoAP). This will enable an HTTP client to access resources on a CoAP server through the proxy. This document describes how an HTTP request is mapped to a CoAP request and how a CoAP response is mapped back to an HTTP response. This includes guidelines for status code, URI, and media type mappings, as well as additional interworking advice.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8075"/>
          <seriesInfo name="DOI" value="10.17487/RFC8075"/>
        </reference>
        <reference anchor="RFC8323">
          <front>
            <title>CoAP (Constrained Application Protocol) over TCP, TLS, and WebSockets</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <author fullname="S. Lemay" initials="S." surname="Lemay"/>
            <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
            <author fullname="K. Hartke" initials="K." surname="Hartke"/>
            <author fullname="B. Silverajan" initials="B." surname="Silverajan"/>
            <author fullname="B. Raymor" initials="B." role="editor" surname="Raymor"/>
            <date month="February" year="2018"/>
            <abstract>
              <t>The Constrained Application Protocol (CoAP), although inspired by HTTP, was designed to use UDP instead of TCP. The message layer of CoAP over UDP includes support for reliable delivery, simple congestion control, and flow control.</t>
              <t>Some environments benefit from the availability of CoAP carried over reliable transports such as TCP or Transport Layer Security (TLS). This document outlines the changes required to use CoAP over TCP, TLS, and WebSockets transports. It also formally updates RFC 7641 for use with these transports and RFC 7959 to enable the use of larger messages over a reliable transport.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8323"/>
          <seriesInfo name="DOI" value="10.17487/RFC8323"/>
        </reference>
        <reference anchor="RFC8610">
          <front>
            <title>Concise Data Definition Language (CDDL): A Notational Convention to Express Concise Binary Object Representation (CBOR) and JSON Data Structures</title>
            <author fullname="H. Birkholz" initials="H." surname="Birkholz"/>
            <author fullname="C. Vigano" initials="C." surname="Vigano"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="June" year="2019"/>
            <abstract>
              <t>This document proposes a notational convention to express Concise Binary Object Representation (CBOR) data structures (RFC 7049). Its main goal is to provide an easy and unambiguous way to express structures for protocol messages and data formats that use CBOR or JSON.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8610"/>
          <seriesInfo name="DOI" value="10.17487/RFC8610"/>
        </reference>
        <reference anchor="RFC8613">
          <front>
            <title>Object Security for Constrained RESTful Environments (OSCORE)</title>
            <author fullname="G. Selander" initials="G." surname="Selander"/>
            <author fullname="J. Mattsson" initials="J." surname="Mattsson"/>
            <author fullname="F. Palombini" initials="F." surname="Palombini"/>
            <author fullname="L. Seitz" initials="L." surname="Seitz"/>
            <date month="July" year="2019"/>
            <abstract>
              <t>This document defines Object Security for Constrained RESTful Environments (OSCORE), a method for application-layer protection of the Constrained Application Protocol (CoAP), using CBOR Object Signing and Encryption (COSE). OSCORE provides end-to-end protection between endpoints communicating using CoAP or CoAP-mappable HTTP. OSCORE is designed for constrained nodes and networks supporting a range of proxy operations, including translation between different transport protocols.</t>
              <t>Although an optional functionality of CoAP, OSCORE alters CoAP options processing and IANA registration. Therefore, this document updates RFC 7252.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8613"/>
          <seriesInfo name="DOI" value="10.17487/RFC8613"/>
        </reference>
        <reference anchor="RFC8742">
          <front>
            <title>Concise Binary Object Representation (CBOR) Sequences</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="February" year="2020"/>
            <abstract>
              <t>This document describes the Concise Binary Object Representation (CBOR) Sequence format and associated media type "application/cbor-seq". A CBOR Sequence consists of any number of encoded CBOR data items, simply concatenated in sequence.</t>
              <t>Structured syntax suffixes for media types allow other media types to build on them and make it explicit that they are built on an existing media type as their foundation. This specification defines and registers "+cbor-seq" as a structured syntax suffix for CBOR Sequences.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8742"/>
          <seriesInfo name="DOI" value="10.17487/RFC8742"/>
        </reference>
        <reference anchor="RFC8949">
          <front>
            <title>Concise Binary Object Representation (CBOR)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
            <date month="December" year="2020"/>
            <abstract>
              <t>The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation. These design goals make it different from earlier binary serializations such as ASN.1 and MessagePack.</t>
              <t>This document obsoletes RFC 7049, providing editorial improvements, new details, and errata fixes while keeping full compatibility with the interchange format of RFC 7049. It does not create a new version of the format.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="94"/>
          <seriesInfo name="RFC" value="8949"/>
          <seriesInfo name="DOI" value="10.17487/RFC8949"/>
        </reference>
        <reference anchor="RFC9112">
          <front>
            <title>HTTP/1.1</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document specifies the HTTP/1.1 message syntax, message parsing, connection management, and related security concerns.</t>
              <t>This document obsoletes portions of RFC 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="99"/>
          <seriesInfo name="RFC" value="9112"/>
          <seriesInfo name="DOI" value="10.17487/RFC9112"/>
        </reference>
        <reference anchor="RFC9651">
          <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="September" year="2024"/>
            <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.</t>
              <t>This document obsoletes RFC 8941.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9651"/>
          <seriesInfo name="DOI" value="10.17487/RFC9651"/>
        </reference>
        <reference anchor="IANA.CoAP.Option.Numbers" target="https://www.iana.org/assignments/core-parameters/core-parameters.xhtml#option-numbers">
          <front>
            <title>CoAP Option Numbers</title>
            <author>
              <organization>IANA</organization>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="IANA.HTTP.Field.Name" target="https://www.iana.org/assignments/http-fields/http-fields.xhtml#field-names">
          <front>
            <title>Hypertext Transfer Protocol (HTTP) Field Name Registry</title>
            <author>
              <organization>IANA</organization>
            </author>
            <date/>
          </front>
        </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>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="I-D.bormann-coap-misc">
          <front>
            <title>Miscellaneous additions to CoAP</title>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universitaet Bremen TZI</organization>
            </author>
            <author fullname="Klaus Hartke" initials="K." surname="Hartke">
              <organization>Universitaet Bremen TZI</organization>
            </author>
            <date day="14" month="November" year="2014"/>
            <abstract>
              <t>   This short I-D makes a number of partially interrelated proposals how
   to solve certain problems in the CoRE WG's main protocol, the
   Constrained Application Protocol (CoAP).  The current version has
   been resubmitted to keep information about these proposals available;
   the proposals are not all fleshed out at this point in time.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-bormann-coap-misc-27"/>
        </reference>
        <reference anchor="I-D.tiloca-core-oscore-discovery">
          <front>
            <title>Discovery of OSCORE Groups with the CoRE Resource Directory</title>
            <author fullname="Marco Tiloca" initials="M." surname="Tiloca">
              <organization>RISE AB</organization>
            </author>
            <author fullname="Christian Amsüss" initials="C." surname="Amsüss">
         </author>
            <author fullname="Peter Van der Stok" initials="P." surname="Van der Stok">
         </author>
            <date day="2" month="March" year="2026"/>
            <abstract>
              <t>   Group communication over the Constrained Application Protocol (CoAP)
   can be secured by means of Group Object Security for Constrained
   RESTful Environments (Group OSCORE).  At deployment time, devices may
   not know the exact security groups to join, the respective Group
   Manager, or other information required to perform the joining
   process.  This document defines how a CoAP endpoint can use
   descriptions and links of resources registered at the CoRE Resource
   Directory to discover security groups and to acquire information for
   joining them through the respective Group Manager.  A given security
   group can be used to protect communications in multiple application
   groups, which are separately announced in the Resource Directory as
   sets of endpoints sharing a pool of resources.  This approach is
   consistent with, but not limited to, the joining of security groups
   based on the ACE framework for Authentication and Authorization in
   constrained environments.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-tiloca-core-oscore-discovery-19"/>
        </reference>
        <reference anchor="I-D.ietf-core-cacheable-oscore">
          <front>
            <title>End-to-End Protected and Cacheable CoAP Responses using Group Object Security for Constrained RESTful Environments (Group OSCORE)</title>
            <author fullname="Christian Amsüss" initials="C." surname="Amsüss">
         </author>
            <author fullname="Marco Tiloca" initials="M." surname="Tiloca">
              <organization>RISE AB</organization>
            </author>
            <date day="6" month="July" year="2026"/>
            <abstract>
              <t>   When using the Constrained Application Protocol (CoAP), exchanged
   messages can be protected end-to-end also across untrusted
   intermediary proxies.  This can be achieved with Object Security for
   Constrained RESTful Environments (OSCORE) or, in the case of group
   communication, with Group Object Security for Constrained RESTful
   Environments (Group OSCORE).  However, this sidesteps the proxies'
   abilities to cache responses from the origin server(s).  This
   document restores cacheability of end-to-end protected responses at
   proxies, by using Group OSCORE and introducing consensus requests,
   which any client in an OSCORE group can send to one server or
   multiple servers in the same group.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-core-cacheable-oscore-02"/>
        </reference>
        <reference anchor="I-D.ietf-ace-key-groupcomm-oscore">
          <front>
            <title>Key Management for Group Object Security for Constrained RESTful Environments (Group OSCORE) Using Authentication and Authorization for Constrained Environments (ACE)</title>
            <author fullname="Marco Tiloca" initials="M." surname="Tiloca">
              <organization>RISE AB</organization>
            </author>
            <author fullname="Francesca Palombini" initials="F." surname="Palombini">
              <organization>Ericsson AB</organization>
            </author>
            <date day="14" month="March" year="2026"/>
            <abstract>
              <t>   This document defines an application profile of the Authentication
   and Authorization for Constrained Environments (ACE) framework, to
   request and provision keying material in group communication
   scenarios that are based on the Constrained Application Protocol
   (CoAP) and are secured with Group Object Security for Constrained
   RESTful Environments (Group OSCORE).  This application profile
   delegates the authentication and authorization of Clients, which join
   an OSCORE group through a Resource Server acting as Group Manager for
   that group.  This application profile leverages protocol-specific
   transport profiles of ACE to achieve communication security, server
   authentication, and proof of possession of a key owned by the Client
   and bound to an OAuth 2.0 access token.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-ace-key-groupcomm-oscore-21"/>
        </reference>
        <reference anchor="I-D.ietf-core-oscore-capable-proxies">
          <front>
            <title>OSCORE-capable Proxies</title>
            <author fullname="Marco Tiloca" initials="M." surname="Tiloca">
              <organization>RISE AB</organization>
            </author>
            <author fullname="Rikard Höglund" initials="R." surname="Höglund">
              <organization>RISE AB</organization>
            </author>
            <date day="6" month="July" year="2026"/>
            <abstract>
              <t>   When using the Constrained Application Protocol (CoAP), messages
   exchanged between two endpoints can be protected end-to-end at the
   application layer by means of Object Security for Constrained RESTful
   Environments (OSCORE), also in the presence of intermediaries such as
   proxies.  This document defines how to use OSCORE for protecting CoAP
   messages also between an origin application endpoint and an
   intermediary, or between two intermediaries.  Also, it defines rules
   to escalate the protection of a CoAP option, in order to encrypt and
   integrity-protect it whenever possible.  Finally, it defines how to
   secure a CoAP message by applying multiple, nested OSCORE
   protections, e.g., both end-to-end between origin application
   endpoints; and between an application endpoint and an intermediary or
   between two intermediaries.  Therefore, this document updates RFC
   8613.  Furthermore, this document updates RFC 8768, by explicitly
   defining the processing with OSCORE for the CoAP Hop-Limit Option.
   The approach defined in this document can be seamlessly employed also
   with Group OSCORE, for protecting CoAP messages when group
   communication is used in the presence of intermediaries.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-core-oscore-capable-proxies-07"/>
        </reference>
        <reference anchor="RFC9147">
          <front>
            <title>The Datagram Transport Layer Security (DTLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
            <author fullname="N. Modadugu" initials="N." surname="Modadugu"/>
            <date month="April" year="2022"/>
            <abstract>
              <t>This document specifies version 1.3 of the Datagram Transport Layer Security (DTLS) protocol. DTLS 1.3 allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>The DTLS 1.3 protocol is based on the Transport Layer Security (TLS) 1.3 protocol and provides equivalent security guarantees with the exception of order protection / non-replayability. Datagram semantics of the underlying transport are preserved by the DTLS protocol.</t>
              <t>This document obsoletes RFC 6347.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9147"/>
          <seriesInfo name="DOI" value="10.17487/RFC9147"/>
        </reference>
        <reference anchor="RFC9846">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="July" year="2026"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document obsoletes RFC 8446, which specified TLS 1.3. This document obsoletes RFC 5246 (specifying TLS 1.2) and RFCs 5077, 6961, 7627, and 8422, all of which pertain to TLS 1.2 or earlier, and updates RFCs 5705 and 6066. This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9846"/>
          <seriesInfo name="DOI" value="10.17487/RFC9846"/>
        </reference>
      </references>
    </references>
    <?line 1207?>

<section anchor="sec-reverse-proxies-examples">
      <name>Examples with a Reverse-Proxy</name>
      <t>The examples in this section refer to the following actors.</t>
      <ul spacing="normal">
        <li>
          <t>One origin client C, with address C_ADDR and port number C_PORT.</t>
        </li>
        <li>
          <t>One proxy P, with address P_ADDR and server port number P_PORT.</t>
        </li>
        <li>
          <t>Two origin servers S1 and S2, where the server Sx has address Sx_ADDR and port number Sx_PORT.</t>
        </li>
      </ul>
      <t>The origin servers are members of a CoAP group with IP multicast address G_ADDR and port number G_PORT. Also, the origin servers are members of the same application group and share the same resource at /r.</t>
      <t>The communication between C and P is based on CoAP over TCP, as per <xref target="RFC8323"/>. The group communication between P and the origin servers is based on CoAP over UDP/IP multicast, as per <xref target="I-D.ietf-core-groupcomm-bis"/>.</t>
      <t>Finally, cri'X' denotes a CRI or CRI reference corresponding to the URI or URI reference X, i.e., a CRI or CRI reference that can be converted to the URI or URI reference X using the procedure defined in <xref section="6.1" sectionFormat="of" target="I-D.ietf-core-href"/>.</t>
      <section anchor="sec-reverse-proxies-examples-ex1">
        <name>Example 1</name>
        <t>The example shown in <xref target="workflow-example-reverse-1"/> considers a reverse-proxy P that provides access to both the whole group of servers {S1,S2} and also to each of those servers individually. The client C may not have a way to reach the servers directly (e.g., P is acting as a firewall).</t>
        <t>After the client C has received two responses to its group request sent via the proxy, it selects one server (S1) and sends a new request again via the proxy, intended only to that server and targeting a different resource at /r1 in unicast.</t>
        <t>In particular:</t>
        <ul spacing="normal">
          <li>
            <t>In its group request to P, the client C includes the Uri-Host Option with value "group1.com" and the Uri-Path Option with value "r".</t>
          </li>
          <li>
            <t>The hostname 'group1.com' resolves to the IPv6 multicast address G_ADDR. The proxy P performs this resolution upon receiving the group request from C.  </t>
            <t>
Since such a request does not include the Uri-Port Option, P infers G_PORT to be the default port number 5683 for CoAP over UDP with the "coap" URI scheme.  </t>
            <t>
Based on this information, P composes the group request and sends it to the CoAP group at G_ADDR:G_PORT.</t>
          </li>
          <li>
            <t>Typically, S1_PORT and S2_PORT will be equal to G_PORT, but a server Sx is allowed to reply to the multicast request from another port number that is not equal to G_PORT. For this reason, the notation Sx_PORT is used.</t>
          </li>
        </ul>
        <t>Note that this type of reverse-proxy only requires one unicast IP address (P_ADDR) for the proxy, so it scales well with a large number of servers Sx. Instead, the type of reverse-proxy in the example in <xref target="sec-reverse-proxies-examples-ex2"/> requires one IP address for each server Sx and one for each CoAP group that the proxy supports.</t>
        <figure anchor="workflow-example-reverse-1">
          <name>Workflow Example with a Reverse-Proxy Standing in for Both the Whole Group of Servers and Each Individual Server. This Configuration Requires the Proxy to Have Only One Pair (IP Address, Port Number)</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="1504" width="576" viewBox="0 0 576 1504" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,1488" fill="none" stroke="black"/>
                <path d="M 304,48 L 304,1056" fill="none" stroke="black"/>
                <path d="M 304,1104 L 304,1488" fill="none" stroke="black"/>
                <path d="M 488,48 L 488,520" fill="none" stroke="black"/>
                <path d="M 488,536 L 488,856" fill="none" stroke="black"/>
                <path d="M 488,912 L 488,1488" fill="none" stroke="black"/>
                <path d="M 568,48 L 568,1488" fill="none" stroke="black"/>
                <path d="M 8,64 L 296,64" fill="none" stroke="black"/>
                <path d="M 16,176 L 304,176" fill="none" stroke="black"/>
                <path d="M 8,320 L 296,320" fill="none" stroke="black"/>
                <path d="M 304,496 L 480,496" fill="none" stroke="black"/>
                <path d="M 448,528 L 560,528" fill="none" stroke="black"/>
                <path d="M 312,656 L 488,656" fill="none" stroke="black"/>
                <path d="M 16,736 L 304,736" fill="none" stroke="black"/>
                <path d="M 312,864 L 568,864" fill="none" stroke="black"/>
                <path d="M 16,944 L 304,944" fill="none" stroke="black"/>
                <path d="M 8,1136 L 296,1136" fill="none" stroke="black"/>
                <path d="M 304,1312 L 480,1312" fill="none" stroke="black"/>
                <path d="M 312,1360 L 488,1360" fill="none" stroke="black"/>
                <path d="M 16,1440 L 304,1440" fill="none" stroke="black"/>
                <path d="M 432,496 L 448,528" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="568,528 556,522.4 556,533.6" fill="black" transform="rotate(0,560,528)"/>
                <polygon class="arrowhead" points="488,1312 476,1306.4 476,1317.6" fill="black" transform="rotate(0,480,1312)"/>
                <polygon class="arrowhead" points="488,496 476,490.4 476,501.6" fill="black" transform="rotate(0,480,496)"/>
                <polygon class="arrowhead" points="320,1360 308,1354.4 308,1365.6" fill="black" transform="rotate(180,312,1360)"/>
                <polygon class="arrowhead" points="320,864 308,858.4 308,869.6" fill="black" transform="rotate(180,312,864)"/>
                <polygon class="arrowhead" points="320,656 308,650.4 308,661.6" fill="black" transform="rotate(180,312,656)"/>
                <polygon class="arrowhead" points="304,1136 292,1130.4 292,1141.6" fill="black" transform="rotate(0,296,1136)"/>
                <polygon class="arrowhead" points="304,320 292,314.4 292,325.6" fill="black" transform="rotate(0,296,320)"/>
                <polygon class="arrowhead" points="304,64 292,58.4 292,69.6" fill="black" transform="rotate(0,296,64)"/>
                <polygon class="arrowhead" points="24,1440 12,1434.4 12,1445.6" fill="black" transform="rotate(180,16,1440)"/>
                <polygon class="arrowhead" points="24,944 12,938.4 12,949.6" fill="black" transform="rotate(180,16,944)"/>
                <polygon class="arrowhead" points="24,736 12,730.4 12,741.6" fill="black" transform="rotate(180,16,736)"/>
                <polygon class="arrowhead" points="24,176 12,170.4 12,181.6" fill="black" transform="rotate(180,16,176)"/>
                <g class="text">
                  <text x="8" y="36">C</text>
                  <text x="304" y="36">P</text>
                  <text x="492" y="36">S1</text>
                  <text x="564" y="36">S2</text>
                  <text x="320" y="68">/</text>
                  <text x="336" y="68">C</text>
                  <text x="356" y="68">is</text>
                  <text x="384" y="68">not</text>
                  <text x="424" y="68">aware</text>
                  <text x="36" y="84">Src:</text>
                  <text x="112" y="84">C_ADDR:C_PORT</text>
                  <text x="332" y="84">that</text>
                  <text x="360" y="84">P</text>
                  <text x="380" y="84">is</text>
                  <text x="404" y="84">in</text>
                  <text x="436" y="84">fact</text>
                  <text x="36" y="100">Dst:</text>
                  <text x="112" y="100">P_ADDR:P_PORT</text>
                  <text x="320" y="100">a</text>
                  <text x="384" y="100">reverse-proxy</text>
                  <text x="448" y="100">/</text>
                  <text x="56" y="116">Uri-Host:</text>
                  <text x="148" y="116">"group1.com"</text>
                  <text x="56" y="132">Uri-Path:</text>
                  <text x="112" y="132">"r"</text>
                  <text x="36" y="196">Src:</text>
                  <text x="112" y="196">P_ADDR:P_PORT</text>
                  <text x="36" y="212">Dst:</text>
                  <text x="112" y="212">C_ADDR:C_PORT</text>
                  <text x="36" y="228">4.00</text>
                  <text x="72" y="228">Bad</text>
                  <text x="120" y="228">Request</text>
                  <text x="92" y="244">Multicast-Timeout:</text>
                  <text x="176" y="244">-</text>
                  <text x="216" y="244">(empty)</text>
                  <text x="52" y="260">Payload:</text>
                  <text x="120" y="260">"Please</text>
                  <text x="168" y="260">use</text>
                  <text x="108" y="276">Multicast-Timeout"</text>
                  <text x="36" y="340">Src:</text>
                  <text x="112" y="340">C_ADDR:C_PORT</text>
                  <text x="36" y="356">Dst:</text>
                  <text x="112" y="356">P_ADDR:P_PORT</text>
                  <text x="56" y="372">Uri-Host:</text>
                  <text x="148" y="372">"group1.com"</text>
                  <text x="56" y="388">Uri-Path:</text>
                  <text x="112" y="388">"r"</text>
                  <text x="92" y="404">Multicast-Timeout:</text>
                  <text x="180" y="404">60</text>
                  <text x="332" y="452">Src:</text>
                  <text x="408" y="452">P_ADDR:P_PORT</text>
                  <text x="332" y="468">Dst:</text>
                  <text x="408" y="468">G_ADDR:G_PORT</text>
                  <text x="352" y="484">Uri-Path:</text>
                  <text x="408" y="484">"r"</text>
                  <text x="320" y="580">/</text>
                  <text x="336" y="580">t</text>
                  <text x="352" y="580">=</text>
                  <text x="368" y="580">0</text>
                  <text x="384" y="580">:</text>
                  <text x="400" y="580">P</text>
                  <text x="436" y="580">starts</text>
                  <text x="352" y="596">accepting</text>
                  <text x="432" y="596">responses</text>
                  <text x="328" y="612">for</text>
                  <text x="364" y="612">this</text>
                  <text x="416" y="612">request</text>
                  <text x="456" y="612">/</text>
                  <text x="332" y="676">Src:</text>
                  <text x="416" y="676">S1_ADDR:S1_PORT</text>
                  <text x="332" y="692">Dst:</text>
                  <text x="408" y="692">P_ADDR:P_PORT</text>
                  <text x="36" y="756">Src:</text>
                  <text x="112" y="756">P_ADDR:P_PORT</text>
                  <text x="36" y="772">Dst:</text>
                  <text x="112" y="772">C_ADDR:C_PORT</text>
                  <text x="64" y="788">Reply-From:</text>
                  <text x="156" y="804">cri'coap+tcp://P_ADDR:P_PORT',</text>
                  <text x="124" y="820">cri'//S1_ADDR:S1_PORT'</text>
                  <text x="412" y="884">Src:</text>
                  <text x="496" y="884">S2_ADDR:S2_PORT</text>
                  <text x="412" y="900">Dst:</text>
                  <text x="488" y="900">P_ADDR:P_PORT</text>
                  <text x="36" y="964">Src:</text>
                  <text x="112" y="964">P_ADDR:P_PORT</text>
                  <text x="36" y="980">Dst:</text>
                  <text x="112" y="980">C_ADDR:C_PORT</text>
                  <text x="64" y="996">Reply-From:</text>
                  <text x="156" y="1012">cri'coap+tcp://P_ADDR:P_PORT',</text>
                  <text x="124" y="1028">cri'//S2_ADDR:S2_PORT'</text>
                  <text x="176" y="1076">/</text>
                  <text x="196" y="1076">At</text>
                  <text x="216" y="1076">t</text>
                  <text x="232" y="1076">=</text>
                  <text x="256" y="1076">60,</text>
                  <text x="280" y="1076">P</text>
                  <text x="312" y="1076">stops</text>
                  <text x="376" y="1076">accepting</text>
                  <text x="208" y="1092">responses</text>
                  <text x="264" y="1092">for</text>
                  <text x="300" y="1092">this</text>
                  <text x="352" y="1092">request</text>
                  <text x="392" y="1092">/</text>
                  <text x="320" y="1140">/</text>
                  <text x="360" y="1140">Request</text>
                  <text x="428" y="1140">intended</text>
                  <text x="36" y="1156">Src:</text>
                  <text x="112" y="1156">C_ADDR:C_PORT</text>
                  <text x="332" y="1156">only</text>
                  <text x="368" y="1156">for</text>
                  <text x="400" y="1156">S1,</text>
                  <text x="432" y="1156">via</text>
                  <text x="464" y="1156">the</text>
                  <text x="36" y="1172">Dst:</text>
                  <text x="112" y="1172">P_ADDR:P_PORT</text>
                  <text x="336" y="1172">proxy</text>
                  <text x="368" y="1172">P</text>
                  <text x="384" y="1172">/</text>
                  <text x="56" y="1188">Uri-Host:</text>
                  <text x="136" y="1188">"S1_ADDR"</text>
                  <text x="56" y="1204">Uri-Port:</text>
                  <text x="128" y="1204">S1_PORT</text>
                  <text x="56" y="1220">Uri-Path:</text>
                  <text x="116" y="1220">"r1"</text>
                  <text x="332" y="1268">Src:</text>
                  <text x="408" y="1268">P_ADDR:P_PORT</text>
                  <text x="332" y="1284">Dst:</text>
                  <text x="416" y="1284">S1_ADDR:S1_PORT</text>
                  <text x="352" y="1300">Uri-Path:</text>
                  <text x="412" y="1300">"r1"</text>
                  <text x="332" y="1380">Src:</text>
                  <text x="416" y="1380">S1_ADDR:S1_PORT</text>
                  <text x="332" y="1396">Dst:</text>
                  <text x="408" y="1396">P_ADDR:P_PORT</text>
                  <text x="164" y="1460">Src:</text>
                  <text x="240" y="1460">P_ADDR:P_PORT</text>
                  <text x="164" y="1476">Dst:</text>
                  <text x="240" y="1476">C_ADDR:C_PORT</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
C                                    P                      S1       S2
|                                    |                      |         |
+----------------------------------->| / C is not aware     |         |
| Src: C_ADDR:C_PORT                 | that P is in fact    |         |
| Dst: P_ADDR:P_PORT                 | a reverse-proxy /    |         |
| Uri-Host: "group1.com"             |                      |         |
| Uri-Path: "r"                      |                      |         |
|                                    |                      |         |
|                                    |                      |         |
|<-----------------------------------+                      |         |
| Src: P_ADDR:P_PORT                 |                      |         |
| Dst: C_ADDR:C_PORT                 |                      |         |
| 4.00 Bad Request                   |                      |         |
| Multicast-Timeout: - (empty)       |                      |         |
| Payload: "Please use               |                      |         |
|   Multicast-Timeout"               |                      |         |
|                                    |                      |         |
|                                    |                      |         |
+----------------------------------->|                      |         |
| Src: C_ADDR:C_PORT                 |                      |         |
| Dst: P_ADDR:P_PORT                 |                      |         |
| Uri-Host: "group1.com"             |                      |         |
| Uri-Path: "r"                      |                      |         |
| Multicast-Timeout: 60              |                      |         |
|                                    |                      |         |
|                                    |                      |         |
|                                    | Src: P_ADDR:P_PORT   |         |
|                                    | Dst: G_ADDR:G_PORT   |         |
|                                    | Uri-Path: "r"        |         |
|                                    +---------------+----->|         |
|                                    |                \     |         |
|                                    |                 `------------->|
|                                    |                      |         |
|                                    |                      |         |
|                                    | / t = 0 : P starts   |         |
|                                    | accepting responses  |         |
|                                    | for this request /   |         |
|                                    |                      |         |
|                                    |                      |         |
|                                    |<---------------------+         |
|                                    | Src: S1_ADDR:S1_PORT |         |
|                                    | Dst: P_ADDR:P_PORT   |         |
|                                    |                      |         |
|                                    |                      |         |
|<-----------------------------------+                      |         |
| Src: P_ADDR:P_PORT                 |                      |         |
| Dst: C_ADDR:C_PORT                 |                      |         |
| Reply-From:                        |                      |         |
|   cri'coap+tcp://P_ADDR:P_PORT',   |                      |         |
|   cri'//S1_ADDR:S1_PORT'           |                      |         |
|                                    |                      |         |
|                                    |                      |         |
|                                    |<-------------------------------+
|                                    |           Src: S2_ADDR:S2_PORT |
|                                    |           Dst: P_ADDR:P_PORT   |
|                                    |                      |         |
|                                    |                      |         |
|<-----------------------------------+                      |         |
| Src: P_ADDR:P_PORT                 |                      |         |
| Dst: C_ADDR:C_PORT                 |                      |         |
| Reply-From:                        |                      |         |
|   cri'coap+tcp://P_ADDR:P_PORT',   |                      |         |
|   cri'//S2_ADDR:S2_PORT'           |                      |         |
|                                    |                      |         |
|                                    |                      |         |
|                    / At t = 60, P stops accepting         |         |
|                    responses for this request /           |         |
|                                    |                      |         |
|                                    |                      |         |
+----------------------------------->| / Request intended   |         |
| Src: C_ADDR:C_PORT                 | only for S1, via the |         |
| Dst: P_ADDR:P_PORT                 | proxy P /            |         |
| Uri-Host: "S1_ADDR"                |                      |         |
| Uri-Port: S1_PORT                  |                      |         |
| Uri-Path: "r1"                     |                      |         |
|                                    |                      |         |
|                                    |                      |         |
|                                    | Src: P_ADDR:P_PORT   |         |
|                                    | Dst: S1_ADDR:S1_PORT |         |
|                                    | Uri-Path: "r1"       |         |
|                                    +--------------------->|         |
|                                    |                      |         |
|                                    |                      |         |
|                                    |<---------------------+         |
|                                    | Src: S1_ADDR:S1_PORT |         |
|                                    | Dst: P_ADDR:P_PORT   |         |
|                                    |                      |         |
|                                    |                      |         |
|<-----------------------------------+                      |         |
|                 Src: P_ADDR:P_PORT |                      |         |
|                 Dst: C_ADDR:C_PORT |                      |         |
|                                    |                      |         |
]]></artwork>
          </artset>
        </figure>
      </section>
      <section anchor="sec-reverse-proxies-examples-ex2">
        <name>Example 2</name>
        <t>The example shown in <xref target="workflow-example-reverse-2"/> considers a reverse-proxy that stands in for both the whole group of servers {S1,S2} and for each of those servers Sx. The client C may not have a way to reach the servers directly (e.g., P is acting as a firewall).</t>
        <t>After the client C has received two responses to its group request sent via the proxy, it selects one server (S1) and sends a new request again via the proxy, intended only for that server and targeting the same resource at /r in unicast.</t>
        <t>In particular:</t>
        <ul spacing="normal">
          <li>
            <t>When receiving a request addressed to the unicast address P_ADDR and port number P_PORT, the proxy forwards the request towards the CoAP group at G_ADDR:G_PORT leaving the URI path unchanged.</t>
          </li>
          <li>
            <t>The address Dx_ADDR and port number Dx_PORT are also used by the proxy, which forwards an incoming request to that address towards the server at Sx_ADDR:Sx_PORT. The different addresses Dx_ADDR are effectively "proxy IP addresses" used to provide access to the servers.</t>
          </li>
        </ul>
        <t>Note that this type of reverse-proxy implementation requires the proxy to use a (potentially) large number of distinct IP addresses, hence it is not very scalable. Instead, the type of reverse-proxy shown in the example in <xref target="sec-reverse-proxies-examples-ex1"/> uses only one IPv6 unicast address to provide access to all servers and all CoAP groups that the proxy supports.</t>
        <figure anchor="workflow-example-reverse-2">
          <name>Workflow Example With a Reverse-Proxy Standing in for Both the Whole Group of Servers and Each Individual Server. This Configuration Requires the Proxy to Have One Pair (IP Address, Port Number) for Each Group and One for Each Origin Server</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="1392" width="576" viewBox="0 0 576 1392" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,1376" fill="none" stroke="black"/>
                <path d="M 296,48 L 296,992" fill="none" stroke="black"/>
                <path d="M 296,1040 L 296,1376" fill="none" stroke="black"/>
                <path d="M 480,48 L 480,488" fill="none" stroke="black"/>
                <path d="M 480,504 L 480,808" fill="none" stroke="black"/>
                <path d="M 480,864 L 480,1376" fill="none" stroke="black"/>
                <path d="M 568,48 L 568,1376" fill="none" stroke="black"/>
                <path d="M 8,64 L 288,64" fill="none" stroke="black"/>
                <path d="M 16,160 L 296,160" fill="none" stroke="black"/>
                <path d="M 8,304 L 288,304" fill="none" stroke="black"/>
                <path d="M 296,464 L 472,464" fill="none" stroke="black"/>
                <path d="M 440,496 L 560,496" fill="none" stroke="black"/>
                <path d="M 304,624 L 480,624" fill="none" stroke="black"/>
                <path d="M 16,704 L 296,704" fill="none" stroke="black"/>
                <path d="M 304,816 L 568,816" fill="none" stroke="black"/>
                <path d="M 16,896 L 296,896" fill="none" stroke="black"/>
                <path d="M 8,1072 L 288,1072" fill="none" stroke="black"/>
                <path d="M 296,1200 L 472,1200" fill="none" stroke="black"/>
                <path d="M 304,1248 L 480,1248" fill="none" stroke="black"/>
                <path d="M 16,1328 L 296,1328" fill="none" stroke="black"/>
                <path d="M 424,464 L 440,496" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="568,496 556,490.4 556,501.6" fill="black" transform="rotate(0,560,496)"/>
                <polygon class="arrowhead" points="480,1200 468,1194.4 468,1205.6" fill="black" transform="rotate(0,472,1200)"/>
                <polygon class="arrowhead" points="480,464 468,458.4 468,469.6" fill="black" transform="rotate(0,472,464)"/>
                <polygon class="arrowhead" points="312,1248 300,1242.4 300,1253.6" fill="black" transform="rotate(180,304,1248)"/>
                <polygon class="arrowhead" points="312,816 300,810.4 300,821.6" fill="black" transform="rotate(180,304,816)"/>
                <polygon class="arrowhead" points="312,624 300,618.4 300,629.6" fill="black" transform="rotate(180,304,624)"/>
                <polygon class="arrowhead" points="296,1072 284,1066.4 284,1077.6" fill="black" transform="rotate(0,288,1072)"/>
                <polygon class="arrowhead" points="296,304 284,298.4 284,309.6" fill="black" transform="rotate(0,288,304)"/>
                <polygon class="arrowhead" points="296,64 284,58.4 284,69.6" fill="black" transform="rotate(0,288,64)"/>
                <polygon class="arrowhead" points="24,1328 12,1322.4 12,1333.6" fill="black" transform="rotate(180,16,1328)"/>
                <polygon class="arrowhead" points="24,896 12,890.4 12,901.6" fill="black" transform="rotate(180,16,896)"/>
                <polygon class="arrowhead" points="24,704 12,698.4 12,709.6" fill="black" transform="rotate(180,16,704)"/>
                <polygon class="arrowhead" points="24,160 12,154.4 12,165.6" fill="black" transform="rotate(180,16,160)"/>
                <g class="text">
                  <text x="8" y="36">C</text>
                  <text x="296" y="36">P</text>
                  <text x="484" y="36">S1</text>
                  <text x="564" y="36">S2</text>
                  <text x="312" y="68">/</text>
                  <text x="328" y="68">C</text>
                  <text x="348" y="68">is</text>
                  <text x="376" y="68">not</text>
                  <text x="416" y="68">aware</text>
                  <text x="36" y="84">Src:</text>
                  <text x="112" y="84">C_ADDR:C_PORT</text>
                  <text x="324" y="84">that</text>
                  <text x="352" y="84">P</text>
                  <text x="372" y="84">is</text>
                  <text x="396" y="84">in</text>
                  <text x="428" y="84">fact</text>
                  <text x="36" y="100">Dst:</text>
                  <text x="112" y="100">P_ADDR:P_PORT</text>
                  <text x="312" y="100">a</text>
                  <text x="376" y="100">reverse-proxy</text>
                  <text x="440" y="100">/</text>
                  <text x="56" y="116">Uri-Path:</text>
                  <text x="112" y="116">"r"</text>
                  <text x="36" y="180">Src:</text>
                  <text x="112" y="180">P_ADDR:P_PORT</text>
                  <text x="36" y="196">Dst:</text>
                  <text x="112" y="196">C_ADDR:C_PORT</text>
                  <text x="36" y="212">4.00</text>
                  <text x="72" y="212">Bad</text>
                  <text x="120" y="212">Request</text>
                  <text x="92" y="228">Multicast-Timeout:</text>
                  <text x="176" y="228">-</text>
                  <text x="216" y="228">(empty)</text>
                  <text x="52" y="244">Payload:</text>
                  <text x="120" y="244">"Please</text>
                  <text x="168" y="244">use</text>
                  <text x="108" y="260">Multicast-Timeout"</text>
                  <text x="36" y="324">Src:</text>
                  <text x="112" y="324">C_ADDR:C_PORT</text>
                  <text x="36" y="340">Dst:</text>
                  <text x="112" y="340">P_ADDR:P_PORT</text>
                  <text x="56" y="356">Uri-Path:</text>
                  <text x="112" y="356">"r"</text>
                  <text x="92" y="372">Multicast-Timeout:</text>
                  <text x="180" y="372">60</text>
                  <text x="324" y="420">Src:</text>
                  <text x="400" y="420">P_ADDR:P_PORT</text>
                  <text x="324" y="436">Dst:</text>
                  <text x="400" y="436">G_ADDR:G_PORT</text>
                  <text x="344" y="452">Uri-Path:</text>
                  <text x="400" y="452">"r"</text>
                  <text x="312" y="548">/</text>
                  <text x="328" y="548">t</text>
                  <text x="344" y="548">=</text>
                  <text x="360" y="548">0</text>
                  <text x="376" y="548">:</text>
                  <text x="392" y="548">P</text>
                  <text x="428" y="548">starts</text>
                  <text x="344" y="564">accepting</text>
                  <text x="424" y="564">responses</text>
                  <text x="320" y="580">for</text>
                  <text x="356" y="580">this</text>
                  <text x="408" y="580">request</text>
                  <text x="448" y="580">/</text>
                  <text x="324" y="644">Src:</text>
                  <text x="408" y="644">S1_ADDR:S1_PORT</text>
                  <text x="324" y="660">Dst:</text>
                  <text x="400" y="660">P_ADDR:P_PORT</text>
                  <text x="36" y="724">Src:</text>
                  <text x="112" y="724">P_ADDR:P_PORT</text>
                  <text x="36" y="740">Dst:</text>
                  <text x="112" y="740">C_ADDR:C_PORT</text>
                  <text x="64" y="756">Reply-From:</text>
                  <text x="160" y="772">cri'coap+tcp://D1_ADDR:D1_PORT'</text>
                  <text x="412" y="836">Src:</text>
                  <text x="496" y="836">S2_ADDR:S2_PORT</text>
                  <text x="412" y="852">Dst:</text>
                  <text x="488" y="852">P_ADDR:P_PORT</text>
                  <text x="36" y="916">Src:</text>
                  <text x="112" y="916">P_ADDR:P_PORT</text>
                  <text x="36" y="932">Dst:</text>
                  <text x="112" y="932">C_ADDR:C_PORT</text>
                  <text x="64" y="948">Reply-From:</text>
                  <text x="160" y="964">cri'coap+tcp://D2_ADDR:D2_PORT'</text>
                  <text x="168" y="1012">/</text>
                  <text x="188" y="1012">At</text>
                  <text x="208" y="1012">t</text>
                  <text x="224" y="1012">=</text>
                  <text x="248" y="1012">60,</text>
                  <text x="272" y="1012">P</text>
                  <text x="304" y="1012">stops</text>
                  <text x="368" y="1012">accepting</text>
                  <text x="200" y="1028">responses</text>
                  <text x="256" y="1028">for</text>
                  <text x="292" y="1028">this</text>
                  <text x="344" y="1028">request</text>
                  <text x="384" y="1028">/</text>
                  <text x="312" y="1076">/</text>
                  <text x="352" y="1076">Request</text>
                  <text x="420" y="1076">intended</text>
                  <text x="36" y="1092">Src:</text>
                  <text x="112" y="1092">C_ADDR:C_PORT</text>
                  <text x="324" y="1092">only</text>
                  <text x="360" y="1092">for</text>
                  <text x="392" y="1092">S1,</text>
                  <text x="424" y="1092">for</text>
                  <text x="456" y="1092">the</text>
                  <text x="36" y="1108">Dst:</text>
                  <text x="120" y="1108">D1_ADDR:D1_PORT</text>
                  <text x="324" y="1108">same</text>
                  <text x="380" y="1108">resource</text>
                  <text x="428" y="1108">/r</text>
                  <text x="448" y="1108">/</text>
                  <text x="56" y="1124">Uri-Path:</text>
                  <text x="112" y="1124">"r"</text>
                  <text x="324" y="1156">Src:</text>
                  <text x="400" y="1156">P_ADDR:P_PORT</text>
                  <text x="324" y="1172">Dst:</text>
                  <text x="408" y="1172">S1_ADDR:S1_PORT</text>
                  <text x="344" y="1188">Uri-Path:</text>
                  <text x="400" y="1188">"r"</text>
                  <text x="324" y="1268">Src:</text>
                  <text x="408" y="1268">S1_ADDR:S1_PORT</text>
                  <text x="324" y="1284">Dst:</text>
                  <text x="400" y="1284">P_ADDR:P_PORT</text>
                  <text x="140" y="1348">Src:</text>
                  <text x="224" y="1348">D1_ADDR:D1_PORT</text>
                  <text x="140" y="1364">Dst:</text>
                  <text x="216" y="1364">C_ADDR:C_PORT</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
C                                   P                      S1        S2
|                                   |                      |          |
+---------------------------------->| / C is not aware     |          |
| Src: C_ADDR:C_PORT                | that P is in fact    |          |
| Dst: P_ADDR:P_PORT                | a reverse-proxy /    |          |
| Uri-Path: "r"                     |                      |          |
|                                   |                      |          |
|                                   |                      |          |
|<----------------------------------+                      |          |
| Src: P_ADDR:P_PORT                |                      |          |
| Dst: C_ADDR:C_PORT                |                      |          |
| 4.00 Bad Request                  |                      |          |
| Multicast-Timeout: - (empty)      |                      |          |
| Payload: "Please use              |                      |          |
|   Multicast-Timeout"              |                      |          |
|                                   |                      |          |
|                                   |                      |          |
+---------------------------------->|                      |          |
| Src: C_ADDR:C_PORT                |                      |          |
| Dst: P_ADDR:P_PORT                |                      |          |
| Uri-Path: "r"                     |                      |          |
| Multicast-Timeout: 60             |                      |          |
|                                   |                      |          |
|                                   |                      |          |
|                                   | Src: P_ADDR:P_PORT   |          |
|                                   | Dst: G_ADDR:G_PORT   |          |
|                                   | Uri-Path: "r"        |          |
|                                   +---------------+----->|          |
|                                   |                \     |          |
|                                   |                 `-------------->|
|                                   |                      |          |
|                                   |                      |          |
|                                   | / t = 0 : P starts   |          |
|                                   | accepting responses  |          |
|                                   | for this request /   |          |
|                                   |                      |          |
|                                   |                      |          |
|                                   |<---------------------+          |
|                                   | Src: S1_ADDR:S1_PORT |          |
|                                   | Dst: P_ADDR:P_PORT   |          |
|                                   |                      |          |
|                                   |                      |          |
|<----------------------------------+                      |          |
| Src: P_ADDR:P_PORT                |                      |          |
| Dst: C_ADDR:C_PORT                |                      |          |
| Reply-From:                       |                      |          |
|   cri'coap+tcp://D1_ADDR:D1_PORT' |                      |          |
|                                   |                      |          |
|                                   |                      |          |
|                                   |<--------------------------------+
|                                   |            Src: S2_ADDR:S2_PORT |
|                                   |            Dst: P_ADDR:P_PORT   |
|                                   |                      |          |
|                                   |                      |          |
|<----------------------------------+                      |          |
| Src: P_ADDR:P_PORT                |                      |          |
| Dst: C_ADDR:C_PORT                |                      |          |
| Reply-From:                       |                      |          |
|   cri'coap+tcp://D2_ADDR:D2_PORT' |                      |          |
|                                   |                      |          |
|                                   |                      |          |
|                   / At t = 60, P stops accepting         |          |
|                   responses for this request /           |          |
|                                   |                      |          |
|                                   |                      |          |
+---------------------------------->| / Request intended   |          |
| Src: C_ADDR:C_PORT                | only for S1, for the |          |
| Dst: D1_ADDR:D1_PORT              | same resource /r /   |          |
| Uri-Path: "r"                     |                      |          |
|                                   |                      |          |
|                                   | Src: P_ADDR:P_PORT   |          |
|                                   | Dst: S1_ADDR:S1_PORT |          |
|                                   | Uri-Path: "r"        |          |
|                                   +--------------------->|          |
|                                   |                      |          |
|                                   |                      |          |
|                                   |<---------------------+          |
|                                   | Src: S1_ADDR:S1_PORT |          |
|                                   | Dst: P_ADDR:P_PORT   |          |
|                                   |                      |          |
|                                   |                      |          |
|<----------------------------------+                      |          |
|              Src: D1_ADDR:D1_PORT |                      |          |
|              Dst: C_ADDR:C_PORT   |                      |          |
|                                   |                      |          |
]]></artwork>
          </artset>
        </figure>
      </section>
      <section anchor="sec-reverse-proxies-examples-ex3">
        <name>Example 3</name>
        <t>The example shown in <xref target="workflow-example-reverse-3"/> builds on the example in <xref target="sec-reverse-proxies-examples-ex2"/>.</t>
        <t>However, it considers a reverse-proxy that stands in only for the whole group of servers, but not for each individual server Sx. Therefore, it is possible for the client C to reach an individual server directly.</t>
        <t>The final exchange between C and S1 occurs with CoAP over UDP.</t>
        <figure anchor="workflow-example-reverse-3">
          <name>Workflow Example with a Reverse-Proxy Standing in Only for the Whole Group of Servers, but Not for Each Individual Server. This Configuration Requires the Proxy to Have One Pair (IP Address, Port Number) for Each Group</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="1216" width="568" viewBox="0 0 568 1216" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,1200" fill="none" stroke="black"/>
                <path d="M 264,48 L 264,976" fill="none" stroke="black"/>
                <path d="M 264,1024 L 264,1048" fill="none" stroke="black"/>
                <path d="M 264,1064 L 264,1144" fill="none" stroke="black"/>
                <path d="M 264,1160 L 264,1200" fill="none" stroke="black"/>
                <path d="M 448,48 L 448,472" fill="none" stroke="black"/>
                <path d="M 448,488 L 448,792" fill="none" stroke="black"/>
                <path d="M 448,840 L 448,1200" fill="none" stroke="black"/>
                <path d="M 560,48 L 560,1200" fill="none" stroke="black"/>
                <path d="M 8,64 L 256,64" fill="none" stroke="black"/>
                <path d="M 16,144 L 264,144" fill="none" stroke="black"/>
                <path d="M 8,288 L 256,288" fill="none" stroke="black"/>
                <path d="M 264,448 L 440,448" fill="none" stroke="black"/>
                <path d="M 408,480 L 552,480" fill="none" stroke="black"/>
                <path d="M 272,608 L 448,608" fill="none" stroke="black"/>
                <path d="M 16,688 L 264,688" fill="none" stroke="black"/>
                <path d="M 272,800 L 560,800" fill="none" stroke="black"/>
                <path d="M 16,880 L 264,880" fill="none" stroke="black"/>
                <path d="M 8,1056 L 440,1056" fill="none" stroke="black"/>
                <path d="M 16,1152 L 448,1152" fill="none" stroke="black"/>
                <path d="M 392,448 L 408,480" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="560,480 548,474.4 548,485.6" fill="black" transform="rotate(0,552,480)"/>
                <polygon class="arrowhead" points="448,1056 436,1050.4 436,1061.6" fill="black" transform="rotate(0,440,1056)"/>
                <polygon class="arrowhead" points="448,448 436,442.4 436,453.6" fill="black" transform="rotate(0,440,448)"/>
                <polygon class="arrowhead" points="280,800 268,794.4 268,805.6" fill="black" transform="rotate(180,272,800)"/>
                <polygon class="arrowhead" points="280,608 268,602.4 268,613.6" fill="black" transform="rotate(180,272,608)"/>
                <polygon class="arrowhead" points="264,288 252,282.4 252,293.6" fill="black" transform="rotate(0,256,288)"/>
                <polygon class="arrowhead" points="264,64 252,58.4 252,69.6" fill="black" transform="rotate(0,256,64)"/>
                <polygon class="arrowhead" points="24,1152 12,1146.4 12,1157.6" fill="black" transform="rotate(180,16,1152)"/>
                <polygon class="arrowhead" points="24,880 12,874.4 12,885.6" fill="black" transform="rotate(180,16,880)"/>
                <polygon class="arrowhead" points="24,688 12,682.4 12,693.6" fill="black" transform="rotate(180,16,688)"/>
                <polygon class="arrowhead" points="24,144 12,138.4 12,149.6" fill="black" transform="rotate(180,16,144)"/>
                <g class="text">
                  <text x="8" y="36">C</text>
                  <text x="264" y="36">P</text>
                  <text x="452" y="36">S1</text>
                  <text x="556" y="36">S2</text>
                  <text x="280" y="68">/</text>
                  <text x="296" y="68">C</text>
                  <text x="316" y="68">is</text>
                  <text x="344" y="68">not</text>
                  <text x="384" y="68">aware</text>
                  <text x="36" y="84">Src:</text>
                  <text x="112" y="84">C_ADDR:C_PORT</text>
                  <text x="292" y="84">that</text>
                  <text x="320" y="84">P</text>
                  <text x="340" y="84">is</text>
                  <text x="364" y="84">in</text>
                  <text x="396" y="84">fact</text>
                  <text x="36" y="100">Dst:</text>
                  <text x="112" y="100">P_ADDR:P_PORT</text>
                  <text x="280" y="100">a</text>
                  <text x="344" y="100">reverse-proxy</text>
                  <text x="408" y="100">/</text>
                  <text x="56" y="116">Uri-Path:</text>
                  <text x="112" y="116">"r"</text>
                  <text x="36" y="164">Src:</text>
                  <text x="112" y="164">P_ADDR:P_PORT</text>
                  <text x="36" y="180">Dst:</text>
                  <text x="112" y="180">C_ADDR:C_PORT</text>
                  <text x="36" y="196">4.00</text>
                  <text x="72" y="196">Bad</text>
                  <text x="120" y="196">Request</text>
                  <text x="92" y="212">Multicast-Timeout:</text>
                  <text x="176" y="212">-</text>
                  <text x="216" y="212">(empty)</text>
                  <text x="52" y="228">Payload:</text>
                  <text x="120" y="228">"Please</text>
                  <text x="168" y="228">use</text>
                  <text x="108" y="244">Multicast-Timeout"</text>
                  <text x="36" y="308">Src:</text>
                  <text x="112" y="308">C_ADDR:C_PORT</text>
                  <text x="36" y="324">Dst:</text>
                  <text x="112" y="324">P_ADDR:P_PORT</text>
                  <text x="56" y="340">Uri-Path:</text>
                  <text x="112" y="340">"r"</text>
                  <text x="92" y="356">Multicast-Timeout:</text>
                  <text x="180" y="356">60</text>
                  <text x="292" y="404">Src:</text>
                  <text x="368" y="404">P_ADDR:P_PORT</text>
                  <text x="292" y="420">Dst:</text>
                  <text x="368" y="420">G_ADDR:G_PORT</text>
                  <text x="312" y="436">Uri-Path:</text>
                  <text x="368" y="436">"r"</text>
                  <text x="280" y="532">/</text>
                  <text x="296" y="532">t</text>
                  <text x="312" y="532">=</text>
                  <text x="328" y="532">0</text>
                  <text x="344" y="532">:</text>
                  <text x="360" y="532">P</text>
                  <text x="396" y="532">starts</text>
                  <text x="312" y="548">accepting</text>
                  <text x="392" y="548">responses</text>
                  <text x="288" y="564">for</text>
                  <text x="324" y="564">this</text>
                  <text x="376" y="564">request</text>
                  <text x="416" y="564">/</text>
                  <text x="292" y="628">Src:</text>
                  <text x="376" y="628">S1_ADDR:S1_PORT</text>
                  <text x="292" y="644">Dst:</text>
                  <text x="368" y="644">P_ADDR:P_PORT</text>
                  <text x="36" y="708">Dst:</text>
                  <text x="112" y="708">P_ADDR:P_PORT</text>
                  <text x="36" y="724">Dst:</text>
                  <text x="112" y="724">C_ADDR:C_PORT</text>
                  <text x="64" y="740">Reply-From:</text>
                  <text x="144" y="756">cri'coap://S1_ADDR:S1_PORT'</text>
                  <text x="404" y="820">Src:</text>
                  <text x="488" y="820">S2_ADDR:S2_PORT</text>
                  <text x="404" y="836">Dst:</text>
                  <text x="480" y="836">P_ADDR:P_PORT</text>
                  <text x="36" y="900">Dst:</text>
                  <text x="112" y="900">P_ADDR:P_PORT</text>
                  <text x="36" y="916">Dst:</text>
                  <text x="112" y="916">C_ADDR:C_PORT</text>
                  <text x="64" y="932">Reply-From:</text>
                  <text x="144" y="948">cri'coap://S2_ADDR:S2_PORT'</text>
                  <text x="136" y="996">/</text>
                  <text x="156" y="996">At</text>
                  <text x="176" y="996">t</text>
                  <text x="192" y="996">=</text>
                  <text x="216" y="996">60,</text>
                  <text x="240" y="996">P</text>
                  <text x="272" y="996">stops</text>
                  <text x="336" y="996">accepting</text>
                  <text x="168" y="1012">responses</text>
                  <text x="224" y="1012">for</text>
                  <text x="260" y="1012">this</text>
                  <text x="312" y="1012">request</text>
                  <text x="352" y="1012">/</text>
                  <text x="36" y="1076">Src:</text>
                  <text x="112" y="1076">C_ADDR:C_PORT</text>
                  <text x="280" y="1076">/</text>
                  <text x="320" y="1076">Request</text>
                  <text x="388" y="1076">intended</text>
                  <text x="36" y="1092">Dst:</text>
                  <text x="120" y="1092">S1_ADDR:S1_PORT</text>
                  <text x="292" y="1092">only</text>
                  <text x="328" y="1092">for</text>
                  <text x="360" y="1092">S1,</text>
                  <text x="392" y="1092">for</text>
                  <text x="424" y="1092">the</text>
                  <text x="56" y="1108">Uri-Path:</text>
                  <text x="112" y="1108">"r"</text>
                  <text x="292" y="1108">same</text>
                  <text x="348" y="1108">resource</text>
                  <text x="396" y="1108">/r</text>
                  <text x="416" y="1108">/</text>
                  <text x="292" y="1172">Src:</text>
                  <text x="376" y="1172">S1_ADDR:S1_PORT</text>
                  <text x="292" y="1188">Dst:</text>
                  <text x="368" y="1188">C_ADDR:C_PORT</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
C                               P                      S1           S2
|                               |                      |             |
+------------------------------>| / C is not aware     |             |
| Src: C_ADDR:C_PORT            | that P is in fact    |             |
| Dst: P_ADDR:P_PORT            | a reverse-proxy /    |             |
| Uri-Path: "r"                 |                      |             |
|                               |                      |             |
|<------------------------------+                      |             |
| Src: P_ADDR:P_PORT            |                      |             |
| Dst: C_ADDR:C_PORT            |                      |             |
| 4.00 Bad Request              |                      |             |
| Multicast-Timeout: - (empty)  |                      |             |
| Payload: "Please use          |                      |             |
|   Multicast-Timeout"          |                      |             |
|                               |                      |             |
|                               |                      |             |
+------------------------------>|                      |             |
| Src: C_ADDR:C_PORT            |                      |             |
| Dst: P_ADDR:P_PORT            |                      |             |
| Uri-Path: "r"                 |                      |             |
| Multicast-Timeout: 60         |                      |             |
|                               |                      |             |
|                               |                      |             |
|                               | Src: P_ADDR:P_PORT   |             |
|                               | Dst: G_ADDR:G_PORT   |             |
|                               | Uri-Path: "r"        |             |
|                               +---------------+----->|             |
|                               |                \     |             |
|                               |                 `----------------->|
|                               |                      |             |
|                               |                      |             |
|                               | / t = 0 : P starts   |             |
|                               | accepting responses  |             |
|                               | for this request /   |             |
|                               |                      |             |
|                               |                      |             |
|                               |<---------------------+             |
|                               | Src: S1_ADDR:S1_PORT |             |
|                               | Dst: P_ADDR:P_PORT   |             |
|                               |                      |             |
|                               |                      |             |
|<------------------------------+                      |             |
| Dst: P_ADDR:P_PORT            |                      |             |
| Dst: C_ADDR:C_PORT            |                      |             |
| Reply-From:                   |                      |             |
|   cri'coap://S1_ADDR:S1_PORT' |                      |             |
|                               |                      |             |
|                               |                      |             |
|                               |<-----------------------------------+
|                               |               Src: S2_ADDR:S2_PORT |
|                               |               Dst: P_ADDR:P_PORT   |
|                               |                      |             |
|                               |                      |             |
|<------------------------------+                      |             |
| Dst: P_ADDR:P_PORT            |                      |             |
| Dst: C_ADDR:C_PORT            |                      |             |
| Reply-From:                   |                      |             |
|   cri'coap://S2_ADDR:S2_PORT' |                      |             |
|                               |                      |             |
|                               |                      |             |
|               / At t = 60, P stops accepting         |             |
|               responses for this request /           |             |
|                               |                      |             |
|                               |                      |             |
+----------------------------------------------------->|             |
| Src: C_ADDR:C_PORT            | / Request intended   |             |
| Dst: S1_ADDR:S1_PORT          | only for S1, for the |             |
| Uri-Path: "r"                 | same resource /r /   |             |
|                               |                      |             |
|                               |                      |             |
|<-----------------------------------------------------+             |
|                               | Src: S1_ADDR:S1_PORT |             |
|                               | Dst: C_ADDR:C_PORT   |             |
|                               |                      |             |
]]></artwork>
          </artset>
        </figure>
      </section>
    </section>
    <section anchor="sec-document-updates" removeInRFC="true">
      <name>Document Updates</name>
      <section anchor="sec-07-07">
        <name>Version -06 to -07</name>
        <ul spacing="normal">
          <li>
            <t>Clarifications:  </t>
            <ul spacing="normal">
              <li>
                <t>Representing the option value 0.</t>
              </li>
              <li>
                <t>Checks at the proxy about the client being allowed-listed.</t>
              </li>
              <li>
                <t>Privacy benefits if the proxy is not a Group OSCORE signature checker.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Mentioned the possible use of the Uri-Path-Abbrev Option.</t>
          </li>
          <li>
            <t>Avoided unnecessary normative language.</t>
          </li>
          <li>
            <t>Use suggested CoAP option numbers in the placeholders.</t>
          </li>
          <li>
            <t>Updated references.</t>
          </li>
          <li>
            <t>Editorial improvements.</t>
          </li>
        </ul>
      </section>
      <section anchor="sec-05-06">
        <name>Version -05 to -06</name>
        <ul spacing="normal">
          <li>
            <t>Updated title.</t>
          </li>
          <li>
            <t>Updated references.</t>
          </li>
          <li>
            <t>Clarified handling of the Reply-From Option on the client side.</t>
          </li>
          <li>
            <t>Extended security considerations on client authentication.</t>
          </li>
          <li>
            <t>Clarifications and editorial improvements.</t>
          </li>
        </ul>
      </section>
      <section anchor="sec-04-05">
        <name>Version -04 to -05</name>
        <ul spacing="normal">
          <li>
            <t>Abstract and introduction: the scope is one possible realization of proxy.</t>
          </li>
          <li>
            <t>Generalized transport indication: still based on the CRI in the Reply-From Option, but not on 'scheme' only.</t>
          </li>
          <li>
            <t>Suggested option numbers for the three new CoAP options.</t>
          </li>
          <li>
            <t>Clarifications and editorial improvements.</t>
          </li>
        </ul>
      </section>
      <section anchor="sec-03-04">
        <name>Version -03 to -04</name>
        <ul spacing="normal">
          <li>
            <t>More appropriate pointers to sections of draft-ietf-core-groupcomm-bis.</t>
          </li>
          <li>
            <t>More precise semantics for the Reply-From Option.</t>
          </li>
          <li>
            <t>Defined early cancellation of ongoing response forwarding.</t>
          </li>
          <li>
            <t>Suggested value ranges for codepoints to register.</t>
          </li>
          <li>
            <t>Clarifications and editorial improvements.</t>
          </li>
        </ul>
      </section>
      <section anchor="sec-02-03">
        <name>Version -02 to -03</name>
        <ul spacing="normal">
          <li>
            <t>Made RFC 7967 a normative reference.</t>
          </li>
          <li>
            <t>Improved error handling for request reception at the proxy.</t>
          </li>
          <li>
            <t>Improved security considerations for the new CoAP options.</t>
          </li>
          <li>
            <t>Aligned handling of multiple responses with draft-ietf-core-groupcomm-bis.</t>
          </li>
          <li>
            <t>Revised HTTP Reply-From header field to be a Structured Header Field.</t>
          </li>
          <li>
            <t>Revised HTTP Group-ETag header field to be a Structured Header Field.</t>
          </li>
          <li>
            <t>Clarifications and editorial improvements.</t>
          </li>
        </ul>
      </section>
      <section anchor="sec-01-02">
        <name>Version -01 to -02</name>
        <ul spacing="normal">
          <li>
            <t>Reply-To Option renamed as Reply-From.</t>
          </li>
          <li>
            <t>Multicast-Timeout Option set to 0 ultimately yields an empty value.</t>
          </li>
          <li>
            <t>Removed moot text on reverse-proxies that might use default timeouts.</t>
          </li>
          <li>
            <t>Improved description on using Proxy-Cri and Proxy-Scheme-Number.</t>
          </li>
          <li>
            <t>Improved error handling for inadequate timeouts with proxy chains.</t>
          </li>
          <li>
            <t>Revised the examples of message exchange with a reverse-proxy.</t>
          </li>
          <li>
            <t>Fixes in the IANA considerations.</t>
          </li>
          <li>
            <t>Editorial fixes and improvements.</t>
          </li>
        </ul>
      </section>
      <section anchor="sec-00-01">
        <name>Version -00 to -01</name>
        <ul spacing="normal">
          <li>
            <t>Definition of "individual request" in the terminology.</t>
          </li>
          <li>
            <t>UDP/IP multicast treated as the default transport protocol.</t>
          </li>
          <li>
            <t>Always use the Multicast-Timeout Option, also with reverse-proxies.</t>
          </li>
          <li>
            <t>Response-Forwarding Option:  </t>
            <ul spacing="normal">
              <li>
                <t>Renamed as "Reply-To".</t>
              </li>
              <li>
                <t>Revised encoding to use CRIs.</t>
              </li>
              <li>
                <t>Revised semantics to better address setups with reverse-proxies.</t>
              </li>
              <li>
                <t>Added before possible response caching.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Clarified response processing at reverse-proxies.</t>
          </li>
          <li>
            <t>Updated IANA considerations.</t>
          </li>
          <li>
            <t>Editorial fixes and improvements.</t>
          </li>
        </ul>
      </section>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The authors sincerely thank <contact fullname="Christian Amsüss"/>, <contact fullname="Carsten Bormann"/>, <contact fullname="Rikard Höglund"/>, <contact fullname="Jim Schaad"/>, and <contact fullname="Göran Selander"/> for their comments and feedback.</t>
      <t>The work on this document has been partly supported by the Sweden's Innovation Agency VINNOVA and the Celtic-Next projects CRITISEC and CYPRESS; and by the H2020 project SIFIS-Home (Grant agreement 952652).</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+297XbbRpYu/F9XgVHWei2lSdmSZSdRd3qOLMuJph1bI8nd
PWt6VhoiIQltkuAAoGV14nMt5yrOr/fXOzf27q+q2lUogCCtpJ2ZeE1PbBIs
1Meu/b2fPRwON94dJI83Nuq8nmQHyWlZvL9LXs+zMq3zYlYl+Sz5piwW8+So
mE4Xs3xEnydXRZnUNxl8OqvqMs1n2Tg5nM8n5nsYpy5GxSTZOioOT7c30svL
MnsXGR8HirxgY1yMZukUZjQu06t6mGf11XBUlNnwGh8ewbPDOY41nKR1VtUb
G7fXBzDE2XHyp6J8m8+uedSNt7cHycmszspZVg+f41gb8IaDpKrHG9XicppX
FbyuvpvDq06OL15sLOZjHPEg+WLvyd7GxqgYw2AHyQLe/+XGRrqob4ryYCOh
P0P5bwLbBL/4bie5yCfFKLUf8xK+S8tREX5VlDDq2cn5cXL4zH4Ie5llMLuT
Kr36W1GOq+u0TmfJ3p59YpTXdwfJH/KqdkPBHOEt58fD3af7yf4j9fliVpfw
+PltNs5m9vNsmuaTg2SK09qpaVr/q8x3qiy+rOOd5Hn+t7fBoo6rt4X/Oa0I
/pwUFyM42sUEpj6625lNgsm/gUWOburmNC+AoF5lQFblJJ2Nq3C+GbxxZwxv
/F95UQdv2JgV5RQo512GZ3MyfL4To5jLvGp+XVT+U80nbsrsqvnposyH87S+
GQptwwNnL472Hu0/lb/uP93/Uv76ZO/xvvwVycr89en+rvnrV0+/kL9++eiL
J+avj/cem78+3X3k/mo//WLfDPblV/tfyV+/2t01n3719Am94uTw1eEOXsWd
13O8XzuvFtPLrKyYkn2qpnPEH9C/8TYcJFfpRMhDGAWOlfBYiYzFX6flNVLw
TV3Pq4OHD29vb3fydJbuwKgPU7hs17NpNqurh7SH87QEYoLb2fj3zvubejr5
rKA3DGf2DbSQby8uTnde5NlkvPMKiXHdRXwL176ss/d1clGms+oqKxXjwpds
J/SWBN+SnGXXcO3Ku9XWiQ8Mr3AU7++yPvrHEG9UtbGRz65CKr7ED2YzoLh0
PgRmNTJf8LX1KHgMXxfvMrhJDVodpaObLL2cmGe9J9JRNnyb3al7EnlIv2iU
zmksZMB5Vlmq2zck/NWXeAk2YP144eGz8+OXLw6SzX+H74Z/hj//sbmxMRwO
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
/6tzWcrE+MLEp9d0LcT7zw2sN6Pphca3z1K4FOz9FXZrEo65zHok2H5zA4fe
3O4Y6JNKtXdev4B68FjZUyMS+XCBV782S/1sCXEafpnCzz4Q8OJckOtUfzXu
x6sIQfdW9bPHpItu6mYRNBG61UUmHR3I2DE2wdtPXk205yvs5oNCaBw/i2XZ
pibYqL5fiFIu0Ztm3NNExc2Uc1+OO1z+JjAf5ua4xM1+yaxBVqGzrXl4xC5D
qvGd1253UQXH/OVUHCAgYZBoCNatpnuKJRhwwoFT4QuGnVvGRdjb4B+uWwOG
zxif8WoxsQB9Fo/AzgGz5seqIC90pnxb3GaSKkD6FNGhhsytCw7VDlzPZ+c2
1bPjrUn9KzEqszFnMzm5q6lBZiXcRRfLwPsXQICj5G1mQ5f0ObbqGph0eAbQ
rW2mTuvbRR3is/wunQGd2+QK4h4GClJPRS4GTnJRzmy9Ce0Rd16YilqMHszq
bja6KYuZcQG1d3L0Z8FvTo2jq0c8JOBffM09K8YCQXdTpnSQ0WsOKdxwBTLV
3s6K20k2vrbq5Yob7i91ICarLtjSmpUJATST/2PQ4u5tJyZiYctFPPracgC5
J8/ZTn5fN200+Y3f7st77fZOco6pBHYVOk6RzdBREdwkvqte521vauEd4RYC
ytRC0me+yl4R9JYjJHJW5WXqyFjhxoHUokRZSxCmfOGIPIxVhjaq193GQoT0
Ym5eb2PKGFmdLoJWRLpNKe8YvgQkP2zz9aJYVOEeWgHVexdRlJQuR9WSs2tt
Go11mH6U5IsyaKMpTXJ4RRdjDEZqTllCRilSQpOMWKNf4OoITd9hitTZNS0D
ZhO0tm/atEpDaFM3inm9yyrskqf2nG675MnHooNgoRdaC7Pag1dH9VqlfVLG
2F02DlcjDgPKjXckxWFp1uaQ5f/NqnksaPN3VH4+nKf46zFhiJYGpdRYrlpf
c44oUYXW07xptiT4eJWXi47WT95N09m0+ETvbkqtuIFLVUw6c96SLvBBjIDA
/KvkDXEMYULK1tlJvkVdWjpH3rYaAstrhXoINNcTDVU5ufkpaTe8RbopB7ea
k34Q+K1JLHS9vXV3bcwwDBquY/ef4jojs8d0Su+Rq2wzVD/KijPKqoShe9MV
4sBS/9HGjgyESZsiG4Vr3QefOj7bCLQ6l+d75vUqBgHnFMJf36F/R6GEMNMb
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

-->

</rfc>
