<?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.29 (Ruby 3.3.8) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-core-groupcomm-proxy-06" category="std" consensus="true" submissionType="IETF" updates="7252" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.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-06"/>
    <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="March" day="02"/>
    <workgroup>CoRE Working Group</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 65?>

<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 69?>

<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 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 perform a proxied group request and its support for receiving multiple responses as a result, i.e., one or more from each origin server. Also, the client signals for how long it is willing to wait for 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">TBD1</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>This document specifically defines how this option is used by a client 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 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">TBD2</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>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 for 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 (see <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 (see <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 'host' <bcp14>MUST NOT</bcp14> be of the form host-name within 'authority' of the CRI specified by the first CBOR array.  </t>
          <t>
This CRI reference is relevant in some scenarios where the proxy is a reverse-proxy.</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="RFC8446"/> 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 in the future, 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>
            </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. Note that 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. 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>
Consistently, 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 in case 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. 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. 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.  </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"/>, this 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 <bcp14>SHOULD</bcp14> 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 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 case 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 case 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 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>Consistently, 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, in case 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 may 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.  </t>
              <t>
That is, 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. In either case, the client uses the transport protocol that it supports, and has used before, to send the unicast request to the proxy.</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. 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.</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 of 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).</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 in case, 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 Uri-Host, Uri-Port, and Uri-Path Options included in the request. The CRI reference specifies the same information that the proxy expects to be specified in the Uri-Host, Uri-Port, and Uri-Path Options 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 at 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 for 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 case 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 case the proxy stands in for both the whole group of servers and the individual servers in the group).  </t>
            <t>
In case 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 Uri-Host, Uri-Port, and Uri-Path Options in the unicast request, according to what is specified by the corresponding elements of the CRI reference. In particular:  </t>
            <ul spacing="normal">
              <li>
                <t>If 'authority' is given in the CRI reference and it does not include 'port', then the client <bcp14>MUST NOT</bcp14> include 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 for 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 for the CoAP group, i.e., to the corresponding group URI.  </t>
          <t>
That is, a matching group request produces a hit to multiple cache entries, each of which is associated with one of the CoAP servers in the CoAP group.  </t>
          <t>
Note that, as per the freshness model defined in <xref target="sec-proxy-caching-freshness"/>, the proxy might 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 them.</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 may 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 right away, and instead 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 for 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>In case 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 for 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 case 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 for 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 case 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">TBD3</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>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, in case 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, in case 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., in case 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 case of 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 caching of Group OSCORE secured responses 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. However, 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 for 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 proxy 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 previous hop proxy 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 previous hop proxy 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>In case 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>In case 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 proxy 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> respond with a 5.05 (Proxying Not Supported) error response to the (previous hop proxy 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 previous hop proxy 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 proxy closer to the) origin client.  </t>
            <t>
In case 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 case 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>Consistently with what is described in <xref target="ssec-cancel-forwarding-proxy"/>, a proxy might be asked by the (previous hop proxy 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 proxy closer to the) origin client any further responses received to the forwarded group request from the (next hop proxy 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 proxy 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 proxy 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 in case 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 value TARGET_OLD. The new value TARGET_NEW specifies addressing information directly associated with the proxy. The new 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 previous hop proxy 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 proxy 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 proxy 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 proxy 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 proxy 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 proxy 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 proxy 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 content otherwise 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 content of the CoAP Multicast-Timeout Option, or is left empty in case 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 in case 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 content otherwise 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 for 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 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 value of the CoAP Reply-From Option.  </t>
            <t>
If the CBOR sequence in 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 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 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 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 content otherwise 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 for 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, in case 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 for 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 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, in case 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 superseding 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 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.</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>In case 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 for 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 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.</t>
        <t>Regardless, 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 content, 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 content 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 content, 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 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 server response, before forwarding this response back to the (previous hop proxy 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 server response or alter its content. 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 content, 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 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 content, 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 content 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 content 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 content, 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 client with the next hop towards the origin servers.</t>
        <t>When caching of Group OSCORE secured responses 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>Consistently 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="RFC8446"/> 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 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">TBD1</td>
              <td align="left">Multicast-Timeout</td>
              <td align="left">[RFC-XXXX]</td>
            </tr>
            <tr>
              <td align="left">TBD2</td>
              <td align="left">Reply-From</td>
              <td align="left">[RFC-XXXX]</td>
            </tr>
            <tr>
              <td align="left">TBD3</td>
              <td align="left">Group-ETag</td>
              <td align="left">[RFC-XXXX]</td>
            </tr>
          </tbody>
        </table>
        <t>Note to RFC Editor: Please replace "TBD1", "TBD2", and "TBD3" 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.</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="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="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="3" month="September" year="2025"/>
            <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 describes 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 may protect 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-18"/>
        </reference>
        <reference anchor="I-D.ietf-core-cacheable-oscore">
          <front>
            <title>Cacheable 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="22" month="September" year="2025"/>
            <abstract>
              <t>   Group communication with the Constrained Application Protocol (CoAP)
   can be secured end-to-end using Group Object Security for Constrained
   RESTful Environments (Group OSCORE), also across untrusted
   intermediary proxies.  However, this sidesteps the proxies' abilities
   to cache responses from the origin server(s).  This specification
   restores cacheability of protected responses at proxies, by
   introducing consensus requests which any client in a 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-00"/>
        </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="25" month="February" 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-20"/>
        </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="3" month="September" year="2025"/>
            <abstract>
              <t>   Object Security for Constrained RESTful Environments (OSCORE) can be
   used to protect CoAP messages end-to-end between two endpoints at the
   application layer, 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 option Hop-Limit.
   The approach defined in this document can be seamlessly used 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-05"/>
        </reference>
        <reference anchor="RFC8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2018"/>
            <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 updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </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>
      </references>
    </references>
    <?line 1186?>

<section anchor="sec-reverse-proxies-examples">
      <name>Examples with 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 and 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.</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 for 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-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:
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
zKwslotRlhyP0XMD0g14ZPPg9LisLw/d1rSk1zPQYkorD8d8+93AdAeWfZJ1
ugrW1e0c2KJyL5grA06pUem1Vp482f5qexfvAi0TI5ca3+EegyopSRtxrC0P
EtN7pAXK/U4awczoWEb3ND4Ma2V6mh2dGfIs0q4PkiwnTWAMBuYIle0CBVJZ
wemjy0o+fZunRvlACU8GzQ9GHRie59OsWFbJq7l145XZaGj1hWHFPxiyLiU3
QOPziqwkkkuh7HVqdS/UX9lpN52C+fh3swkVudcbX/zemCnZu4rodE6m8WPc
Lv8Sa50gqsYTVlIHoECW6WWmFAdmaVR0FhkIeJrSdnKWoyeSNG07CP7mDB5G
FntuHibdopgspzO4vNa1Kp+M05JdDOtk2rNHFEZfZwuT/BlGj26cvLb3hDzy
JDEJCNAxOqpmGFQbk000wzWCSUNErrIrYJfA0fQo4PgtoODPyctiO0mSn5MD
+N9r+N9L+N8p/jedZon35+eEnRfwlxfZ7Aqk+s8oeMj99TOMdP7scAd/hf97
B/8byt/ri/w5WcIc6cuHw8c89ibor9kW/G3tp73ki3YWSSgO/O162/5vJwff
HoAQRq/hIHn97WvigEHy8tuXxQFqT3/IQD6cfntqt38djjwQ8Nv1UYa6xPr7
UCLYq2miHCmstcHPHMcY29pGSugoiyopZqDWZQ33sEAQ4zCwiclOxmmhUMln
7TayHQfFaMTo2KzbzYEPsG5Bb9EUehvLZnZuXJROJA15gcKcJcogmNcQReIQ
RNq8lBtVfYdRKQmkyy+Qd8kMNyZns3HFr8O3g3UkhuTAKCl8np0rhH9Mz1Xp
4oq0yXq8SlkWIDAmy7FcEs2yaKbDYCwIhF/MqbYChDxmSOMp2njI+OrMe35H
IHxSVsUcHXygTvnktq5U5KRmh7DVzrJ3NAb7u0ByOR0syS8loggEfnXBloks
jOXx08c7sGmG82WxJQoQteK89MM+QmhagHWmdATbLsVXmxLHIo+hhxIZ1ppz
RL7AwzDF2D3JXKQm3lDwvjnMtccdAk+NJuhQeE0LIx0WPmNtzcRLyWXtS9vH
7Na3WuKWvZJPMWozfI6zDu5iiucMcT3+JVx/4oNv3/qr+l67mnnz0jmKyXC6
JM0EjkQpbB8a0HCwL5b5ZGwCdMmztMyGrxe5WRntprq0jN+0lipgNYA6dbyr
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
UEpfHVjU+jnni3w2ykmpiCjW3jwEBInDj7X0d2WnLS8M8QXZSdn/ogfIwTkD
nVhXOPvrNro0/Iho8J7AYAM9ikOlrhuql0CY1iIjpqtueoO6Cd4vpsc3mkh0
W7reszGyeeZkZ1CtLR/qfSRYS01E0QYs+YTH0k5NirUGOIg1EAgyuJQpJHAz
UWM3EBJeclQMz6bZc/O+OZ9AwFGYZ4awQWGksF4UrrwOXipWCwygYvNRMUNc
vW4m10xnGN6KXsokzI1m4tV3NXI6R9raGd2hdio+j0UzXLwTm5zpZCmxOyy/
2CSooD9f7TzUUtkUl8dBAVvC+BYmrSOHm5KJ7y2iHYdz60BH3daXctuB0EfP
2G69SVLOBcXozDgDDySMLahKhiWMs3A48r4XO9W6Ev1v+T5laDtB5gmdQEFL
+4E4Z8g1NZD4ZJfbiLJ9JSFbISCZmJTqcizLt864elIP4fubHB5aVqYlL5re
4rVDSDyEZEjHf0tHSHVq8UZFMuNsjtLBqBpp5T3EEb/ao2a6Ua8htVF1nkOZ
GB+W+PTqVn68u9vAOhbqzmB8+yyFQ8FOWBG1JvWXK5pHApYnmeWLCLljmEkq
6d053wLuwW1lp4lcx/tLPPqVWeoXHcxpZGUKj70nJMO5gMCplmXc1lYxgm5Y
6udySTPa1M0i8++8G1300dLMi31UEzz95FxE07rENjl4AY3je9GV+2lifur7
pajlEkSphx9NeNpMOffvcAduX8e4w0wZl0bZL7U0yPFbWhglHh6hv5BrfB+y
oy4q4ZhNnIovAm4XZBpCRavonGIxBOxwYN9/xahtXVJki71T3ua6NVBgnKAO
L5cTi3JnS//tHDB/fawq5EK/xvfFTSYxe9KliA81Hi2328BjYlsnOw+mnh2T
JvWPxGiRjTm3yN25mhtkViJddNkKvH8JDDhK3mQ2gkifY9ergUlMZ1zayqbM
NL5dVCHeyx/SGfC5zXIg6WHqZ/RU5GDgJJeLma38IBpx+4KpqMToTCxvZ6Pr
RTEzzpjmFon+LCx0Cy+/R1gikF98zD0TZsQVll2cKe1Z9JpDDjdSgYy1N7Pi
ZpKNr6xquSLB/aUOxGjVtVNaszKe+Hoqfgyv273t2AQObOGGx1+bDnH2+JAt
5XdV3UCTZ/w+Wt5rt7aTM4zo21XocEE2Q1dFcJL4rHrtrL2phWeEIfiVmYWs
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

-->

</rfc>
