<?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  (Ruby 3.2.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-core-groupcomm-proxy-03" category="std" consensus="true" submissionType="IETF" updates="7252" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.21.0 -->
  <front>
    <title abbrev="Proxy Operations for Group Communication">Proxy Operations for CoAP Group Communication</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-core-groupcomm-proxy-03"/>
    <author initials="M." surname="Tiloca" fullname="Marco Tiloca">
      <organization>RISE AB</organization>
      <address>
        <postal>
          <street>Isafjordsgatan 22</street>
          <city>Kista</city>
          <code>16440 Stockholm</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="2024" month="October" day="21"/>
    <workgroup>CoRE Working Group</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>This document specifies the operations performed by a proxy, when using the Constrained Application Protocol (CoAP) in group communication scenarios. Such a proxy processes a single request sent by a client 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>
    <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 also group communication over IP multicast <xref target="I-D.ietf-core-groupcomm-bis"/>, where a group request can be addressed to multiple recipient servers, each of which may reply with an individual unicast response. As discussed in <xref section="3.5" sectionFormat="of" 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 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) 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 have open issues.</t>
      <t>This document takes the former approach. 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 described method addresses all the related issues raised in <xref section="3.5" sectionFormat="of" target="I-D.ietf-core-groupcomm-bis"/>. To this end, this document defines a dedicated signaling protocol based on two new CoAP options and 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 the addressing information of 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 request(s) to the indicated address(es). In doing these follow-up unicast requests, the client may 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>
        <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 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 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>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, 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 into 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>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 into the response sent to the origin client (see <xref target="sec-description"/>). The proxy uses the option to indicate addressing information pertaining to that origin server, which the client can use in order to send an individual request intended to that server.</t>
      <t>In particular, the client can use the addressing information specified in the option in order to identify the response originator and to possibly send it individual unicast requests later on, either directly or 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. 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 <xref section="5" sectionFormat="of" 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, those 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., on the Proxy-Cri Option conveying a CRI equivalent to the group URI, or on 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 it. To this end, the client follows the same rules for Token retention 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 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"/> into 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 the option.  </t>
              <t>
Consistently, if the unicast request to send to the proxy already included 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>
      <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>
      <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"/> into the response. The proxy sets the option value as follows.  </t>
              <t>
The CRI present as first element of the CBOR sequence specifies the addressing information of the server generating the response. The second element of the CBOR sequence <bcp14>MUST NOT</bcp14> be present.  </t>
              <t>
If the proxy supports caching of responses (see <xref target="sec-proxy-caching"/>), the proxy <bcp14>MUST</bcp14> include the Reply-From Option into 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 a same server replies with multiple responses to the same group request, i.e., with the same Token. 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"/>, 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"/>, 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 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 'scheme' in the CRI and used between the proxy and the origin server, in case the protocol is not CoAP over UDP (CRI scheme number: 0).  </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., with 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 reusage has elapsed, following late responses to the same request forwarded by the proxy will be discarded, as these are not matching (by Token) 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 a same application group, and share the same resource /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="3.5.2" 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 present as 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 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 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.
 * The CRI present as 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. The second element of the CBOR sequence <bcp14>MUST NOT</bcp14> be present.  </t>
            <t>
The client will be able to use that information for sending a follow-up unicast request directly to that server, i.e., bypassing the proxy. This is further specified in <xref target="sec-reverse-proxies-client-side"/>. An example is provided in <xref target="sec-reverse-proxies-examples-ex3"/>.</t>
          </li>
        </ul>
      </section>
      <section anchor="sec-reverse-proxies-client-side">
        <name>Processing on the Client Side</name>
        <t>If a client sends a CoAP request intended to a group of servers and is aware of actually communicating with a reverse-proxy, then the client <bcp14>MUST</bcp14> perform the steps defined in <xref target="ssec-req-send-steps"/>. In particular, this results in a request sent to the proxy including a Multicast-Timeout Option.</t>
        <t>The client processes the CoAP responses forwarded back by the proxy as defined in <xref target="ssec-resp-proc-client"/>, 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 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. 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>
      </section>
    </section>
    <section anchor="sec-proxy-caching">
      <name>Caching</name>
      <t>A proxy <bcp14>MAY</bcp14> cache responses to a group request, as defined in <xref section="5.7.1" sectionFormat="of" target="RFC7252"/>. In particular, the same rules apply to determine the set of request options used as "Cache-Key" and to determine the max-age values offered for responses served from the cache.</t>
      <t>A cache entry is associated with one server and stores one response from that server, regardless of whether it is a response to a unicast request or to a group request. The following two types of requests can produce a hit to a cache entry.</t>
      <ul spacing="normal">
        <li>
          <t>A matching request intended to that server, i.e., to the corresponding unicast URI.  </t>
          <t>
When the stored response is a response to a unicast request to the server, the unicast URI of the matching request is the same target URI used for the original unicast request.  </t>
          <t>
When the stored response is a response to a group request to the CoAP group, the unicast URI of the matching request is the target URI obtained by replacing the authority component of the group URI in the original group request with the transport-layer source address and port number of the response.</t>
        </li>
        <li>
          <t>A matching group request intended to the CoAP group, i.e., to the corresponding group URI.  </t>
          <t>
That is, a matching group request produces a hit to multiple cache entries, each of which associated with one of the CoAP servers currently member of 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 a 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 to.</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 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 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 in 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 rather waits for approaching the timeout expiration, as discussed in the next point.</t>
          </li>
          <li>
            <t>The response processing in <xref target="ssec-resp-proc-proxy-steps"/> is extended as follows.  </t>
            <t>
Before the timeout with original value T' &gt; 0 expires and the proxy stops accepting responses to the group request, the proxy checks whether it stores in its cache any fresh response X to the group request such that both the following conditions hold.  </t>
            <ul spacing="normal">
              <li>
                <t>The cache entry E storing X was already existing when the proxy forwarded the group request.</t>
              </li>
              <li>
                <t>The proxy has received no response to the forwarded group request from the server associated with E.</t>
              </li>
            </ul>
            <t>
Then, the proxy sends back to the client each response X stored in its cache and selected as above, before the timeout expires.  </t>
            <t>
Note that, from the forwarding of the group request until the timeout expiration, the proxy still forwards responses to the group request back to the client "as they come" (see <xref target="ssec-resp-proc-proxy-steps"/>). Also, such responses possibly refresh older responses from the same servers that the proxy has stored in its cache, as defined earlier in <xref target="sec-proxy-caching"/>.</t>
          </li>
        </ul>
      </section>
      <section anchor="sec-proxy-caching-validation">
        <name>Validation Model</name>
        <t>This section defines the revalidation of responses, separately between the proxy and the origin servers, as well as between the origin client and the proxy.</t>
        <section anchor="sec-proxy-caching-validation-p-s-unicast">
          <name>Proxy-Servers Revalidation with Unicast Requests</name>
          <t>The proxy <bcp14>MAY</bcp14> revalidate a cached response by making a GET or FETCH request on the related unicast request URI, i.e., by taking the role of a CoAP client with respect to a server in the CoAP group.</t>
          <t>As discussed in <xref target="sec-group-caching"/>, this is however not possible for the proxy if communications in the group are secured end-to-end between origin client and origin servers by using Group OSCORE <xref target="I-D.ietf-core-oscore-groupcomm"/>.</t>
          <t>[ TODO</t>
          <t>It can be actually possible to enable revalidation of responses between proxy and server, also in this case where Group OSCORE is used end-to-end between client and origin servers.</t>
          <t>Fundamentally, this requires to define the possible use of the ETag Option also as an outer option for OSCORE. Thus, in addition to the normal inner ETag, a server can add also an outer ETag option intended to the proxy.</t>
          <t>Since validation of responses assumes that cacheability of responses is possible in the first place, it would be convenient to define the use of ETag as outer option in <xref target="I-D.amsuess-core-cachable-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> </t>
          <t>As discussed in <xref target="sec-group-caching"/>, the following applies when Group OSCORE <xref target="I-D.ietf-core-oscore-groupcomm"/> is used to secure communications end-to-end between the origin client and the origin servers in the group.</t>
          <ul spacing="normal">
            <li>
              <t>Additional means are required to enable cacheability of responses at the proxy (see <xref target="sec-det-req"/>).</t>
            </li>
            <li>
              <t>If a cached response included an outer ETag Option intended to the proxy, then the proxy can perform revalidation of the cached response, by making a request to the unicast URI targeting the server, and including outer ETag Option(s).  </t>
              <t>
This is possible also in 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> </t>
          <t>As discussed in <xref target="sec-group-caching"/>, the following applies when Group OSCORE <xref target="I-D.ietf-core-oscore-groupcomm"/> is used to secure communications end-to-end between the origin client and the origin servers in the group.</t>
          <ul spacing="normal">
            <li>
              <t>Additional means are required to enable cacheability of responses at the proxy (see <xref target="sec-det-req"/>).</t>
            </li>
            <li>
              <t>If a cached response included an outer ETag Option intended to the proxy, then the proxy can perform revalidation of the cached response, by making a request to the group URI targeting the CoAP group, and including outer ETag Option(s).  </t>
              <t>
This is possible also in 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"/>. The Group-ETag Option is elective, safe to forward, part of the cache key, and repeatable.</t>
        <t>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 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, 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 currently 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.amsuess-core-cachable-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 a 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 both the case where the request is addressed to a single server and sent to the related unicast URI (see <xref target="sec-proxy-caching-validation-p-s-unicast"/>) or instead is 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>[ 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> </t>
          <t>When directly interacting with the servers in the CoAP group to refresh its cache entries, the proxy also remains able to perform response revalidation. That is, if a cached response included an outer ETag Option intended to the proxy, then the proxy can perform revalidation of the cached response, by making a request to the unicast URI addressed to a single server and sent to the related unicast URI (see <xref target="sec-proxy-caching-validation-p-s-unicast"/>) or a group request addressed to the CoAP group and sent to the related group URI (see <xref target="sec-proxy-caching-validation-p-s"/>).</t>
          <t>]</t>
        </section>
      </section>
    </section>
    <section anchor="sec-proxy-chain">
      <name>Chain of Proxies</name>
      <t>A client may be interested to access 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.</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>
      <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 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 also 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 to that server.</t>
        <t>When translating a CoAP message into an HTTP message, the value of the HTTP Reply-From header field is built as follows.</t>
        <ul spacing="normal">
          <li>
            <t>The first Byte Sequence Item encodes the byte serialization of the first CBOR array of the CBOR sequence that is specified as 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 to the CoAP group, the client <bcp14>MAY</bcp14> include one HTTP Group-ETag header field in the request. The field value is a list of one or more members, each of which encodes one entity-tag value that is applicable to the set J of cache entries that can be hit by the request (see <xref target="sec-proxy-caching-validation-c-p"/>).</t>
        <t>An HTTP-to-CoAP proxy that performs the form of validation defined in <xref target="sec-proxy-caching-validation-c-p"/> proceeds like defined in <xref target="sec-proxy-caching-validation-c-p"/> for a CoAP-to-CoAP proxy, with the following differences.</t>
        <ul spacing="normal">
          <li>
            <t>When sending to the client an HTTP 200 (OK) response to an HTTP GET request that was translated into a CoAP GET request sent to the CoAP group, the proxy <bcp14>MAY</bcp14> include one HTTP Group-ETag header field in the response, 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 to the CoAP group and that includes an HTTP Group-ETag header field, the following applies.  </t>
            <ul spacing="normal">
              <li>
                <t>As to the entity-tag values used to check for possible cache hits, the HTTP-to-CoAP proxy obtains those values by decoding the members of the List of the HTTP Group-ETag header field in the HTTP request.</t>
              </li>
              <li>
                <t>If the same conditions for which a CoAP-to-CoAP proxy would reply with a single CoAP 2.03 (Valid) response hold, then the HTTP-to-CoAP proxy replies with a single HTTP 304 (Not Modified) response. The response <bcp14>MUST</bcp14> include one HTTP Group-ETag header field whose value is a List composed of one member, which encodes the current entity-tag value of the set J.</t>
              </li>
            </ul>
          </li>
        </ul>
        <t>An HTTP 304 (Not Modified) response from the HTTP-to-CoAP proxy indicates to the client that it is possible to reuse the stored responses identified by the entity-tag encoded by the only member of the List of the HTTP Group-ETag header field.</t>
      </section>
      <section anchor="sec-cross-proxies-client-req">
        <name>Request Sending at the Client</name>
        <t>The client proceeds according to the following steps.</t>
        <ol spacing="normal" type="1"><li>
            <t>The client prepares an HTTP request to send to the proxy via IP unicast, and to be forwarded by the proxy to the targeted group of CoAP servers over 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 <bcp14>MUST</bcp14> perform 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>
            <ul spacing="normal">
              <li>
                <t>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>
              </li>
              <li>
                <t>The client delivers to the application the individual HTTP response.</t>
              </li>
            </ul>
            <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> </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 below.</t>
        <section anchor="sec-reverse-proxies-client-side-http">
          <name>Processing on the Client Side</name>
          <t>If an HTTP client sends a request intended to a group of servers and is aware of actually communicating with a reverse-proxy, then the client <bcp14>MUST</bcp14> perform the steps defined in <xref target="sec-cross-proxies-client-req"/>. In particular, this results in a request sent to the proxy 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 to 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 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. 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>Nevertheless, 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 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-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, and thus learn 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, and thus learn 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 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, 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, and thus learn 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>
      </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>
      <name>References</name>
      <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="Chonggang Wang" initials="C." surname="Wang">
              <organization>InterDigital</organization>
            </author>
            <author fullname="Marco Tiloca" initials="M." surname="Tiloca">
              <organization>RISE AB</organization>
            </author>
            <date day="24" month="April" year="2024"/>
            <abstract>
              <t>   This document specifies the use of the Constrained Application
   Protocol (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-11"/>
        </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="26" month="September" year="2024"/>
            <abstract>
              <t>   This document defines the security protocol Group Object Security for
   Constrained RESTful Environments (Group OSCORE), providing end-to-end
   security of CoAP messages exchanged 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 any 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-23"/>
        </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="24" month="July" year="2024"/>
            <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) instead of in a
   sequence of characters.  This simplifies parsing, comparison, and
   reference resolution in environments with severe limitations on
   processing power, code size, and memory size.

   This RFC updates RFC 7595 to add a note on how the URI Schemes
   registry RFC 7595 describes cooperates with the CRI Scheme Numbers
   registry created by the present RFC.


   // (This "cref" paragraph will be removed by the RFC editor:) The
   // present revision –16 of this draft continues -15 by picking up
   // more comments; it was made specifically for IETF 120.  This
   // revision still contains open issues and is intended to serve as a
   // snapshot.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-core-href-16"/>
        </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>
        <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="4" month="September" year="2024"/>
            <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-16"/>
        </reference>
        <reference anchor="I-D.amsuess-core-cachable-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="8" month="July" year="2024"/>
            <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-amsuess-core-cachable-oscore-09"/>
        </reference>
        <reference anchor="I-D.ietf-ace-key-groupcomm-oscore">
          <front>
            <title>Key Management for OSCORE Groups in ACE</title>
            <author fullname="Marco Tiloca" initials="M." surname="Tiloca">
              <organization>RISE AB</organization>
            </author>
            <author fullname="Jiye Park" initials="J." surname="Park">
              <organization>Universitaet Duisburg-Essen</organization>
            </author>
            <author fullname="Francesca Palombini" initials="F." surname="Palombini">
              <organization>Ericsson AB</organization>
            </author>
            <date day="6" month="March" year="2023"/>
            <abstract>
              <t>   This document defines an application profile of the ACE framework for
   Authentication and Authorization, to request and provision keying
   material in group communication scenarios that are based on CoAP and
   are secured with Group Object Security for Constrained RESTful
   Environments (Group OSCORE).  This application profile delegates the
   authentication and authorization of Clients, that 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 for 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-16"/>
        </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="8" month="July" year="2024"/>
            <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-02"/>
        </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>
    <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 a same application group, and share the same resource /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 requests another resource from it in unicast, again via the proxy.</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 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 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 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="364" y="1156">to</text>
                  <text x="392" y="1156">S1,</text>
                  <text x="424" y="1156">via</text>
                  <text x="456" 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 to 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 requests at a later time the same resource from it in unicast, again via the proxy.</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 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 (potentially) a 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.</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 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="1472" width="576" viewBox="0 0 576 1472" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,1056" fill="none" stroke="black"/>
                <path d="M 8,1120 L 8,1456" fill="none" stroke="black"/>
                <path d="M 296,48 L 296,992" fill="none" stroke="black"/>
                <path d="M 296,1040 L 296,1056" fill="none" stroke="black"/>
                <path d="M 296,1120 L 296,1456" 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,1056" fill="none" stroke="black"/>
                <path d="M 480,1120 L 480,1456" fill="none" stroke="black"/>
                <path d="M 568,48 L 568,1056" fill="none" stroke="black"/>
                <path d="M 568,1120 L 568,1456" 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,1152 L 288,1152" fill="none" stroke="black"/>
                <path d="M 296,1280 L 472,1280" fill="none" stroke="black"/>
                <path d="M 304,1328 L 480,1328" fill="none" stroke="black"/>
                <path d="M 16,1408 L 296,1408" 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,1280 468,1274.4 468,1285.6" fill="black" transform="rotate(0,472,1280)"/>
                <polygon class="arrowhead" points="480,464 468,458.4 468,469.6" fill="black" transform="rotate(0,472,464)"/>
                <polygon class="arrowhead" points="312,1328 300,1322.4 300,1333.6" fill="black" transform="rotate(180,304,1328)"/>
                <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,1152 284,1146.4 284,1157.6" fill="black" transform="rotate(0,288,1152)"/>
                <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,1408 12,1402.4 12,1413.6" fill="black" transform="rotate(180,16,1408)"/>
                <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="16" y="1092">...</text>
                  <text x="128" y="1092">...</text>
                  <text x="240" y="1092">/</text>
                  <text x="268" y="1092">Time</text>
                  <text x="316" y="1092">passes</text>
                  <text x="352" y="1092">/</text>
                  <text x="480" y="1092">...</text>
                  <text x="560" y="1092">...</text>
                  <text x="312" y="1156">/</text>
                  <text x="352" y="1156">Request</text>
                  <text x="420" y="1156">intended</text>
                  <text x="36" y="1172">Src:</text>
                  <text x="112" y="1172">C_ADDR:C_PORT</text>
                  <text x="324" y="1172">only</text>
                  <text x="356" y="1172">to</text>
                  <text x="380" y="1172">S1</text>
                  <text x="408" y="1172">for</text>
                  <text x="440" y="1172">the</text>
                  <text x="36" y="1188">Dst:</text>
                  <text x="120" y="1188">D1_ADDR:D1_PORT</text>
                  <text x="324" y="1188">same</text>
                  <text x="380" y="1188">resource</text>
                  <text x="428" y="1188">/r</text>
                  <text x="448" y="1188">/</text>
                  <text x="56" y="1204">Uri-Path:</text>
                  <text x="112" y="1204">"r"</text>
                  <text x="324" y="1236">Src:</text>
                  <text x="400" y="1236">P_ADDR:P_PORT</text>
                  <text x="324" y="1252">Dst:</text>
                  <text x="408" y="1252">S1_ADDR:S1_PORT</text>
                  <text x="344" y="1268">Uri-Path:</text>
                  <text x="400" y="1268">"r"</text>
                  <text x="324" y="1348">Src:</text>
                  <text x="408" y="1348">S1_ADDR:S1_PORT</text>
                  <text x="324" y="1364">Dst:</text>
                  <text x="400" y="1364">P_ADDR:P_PORT</text>
                  <text x="140" y="1428">Src:</text>
                  <text x="224" y="1428">D1_ADDR:D1_PORT</text>
                  <text x="140" y="1444">Dst:</text>
                  <text x="216" y="1444">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 /           |          |
|                                   |                      |          |
|                                   |                      |          |

...           ...            / Time passes /              ...       ...

|                                   |                      |          |
|                                   |                      |          |
+---------------------------------->| / Request intended   |          |
| Src: C_ADDR:C_PORT                | only to 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 for only the whole group of servers, but not for each individual server Sx. Therefore, it is possible for the client C to reach the servers 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 for Only the Whole Group of Servers, but Not for Each Individual Server. This 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="1296" width="568" viewBox="0 0 568 1296" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,1040" fill="none" stroke="black"/>
                <path d="M 8,1104 L 8,1280" fill="none" stroke="black"/>
                <path d="M 264,48 L 264,976" fill="none" stroke="black"/>
                <path d="M 264,1024 L 264,1040" fill="none" stroke="black"/>
                <path d="M 264,1104 L 264,1128" fill="none" stroke="black"/>
                <path d="M 264,1144 L 264,1224" fill="none" stroke="black"/>
                <path d="M 264,1240 L 264,1280" 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,1040" fill="none" stroke="black"/>
                <path d="M 448,1104 L 448,1280" fill="none" stroke="black"/>
                <path d="M 560,48 L 560,1040" fill="none" stroke="black"/>
                <path d="M 560,1104 L 560,1280" 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,1136 L 440,1136" fill="none" stroke="black"/>
                <path d="M 16,1232 L 448,1232" 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,1136 436,1130.4 436,1141.6" fill="black" transform="rotate(0,440,1136)"/>
                <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,1232 12,1226.4 12,1237.6" fill="black" transform="rotate(180,16,1232)"/>
                <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="16" y="1076">...</text>
                  <text x="128" y="1076">...</text>
                  <text x="208" y="1076">/</text>
                  <text x="236" y="1076">Time</text>
                  <text x="284" y="1076">passes</text>
                  <text x="320" y="1076">/</text>
                  <text x="448" y="1076">...</text>
                  <text x="552" y="1076">...</text>
                  <text x="36" y="1156">Src:</text>
                  <text x="112" y="1156">C_ADDR:C_PORT</text>
                  <text x="280" y="1156">/</text>
                  <text x="320" y="1156">Request</text>
                  <text x="388" y="1156">intended</text>
                  <text x="36" y="1172">Dst:</text>
                  <text x="120" y="1172">S1.ADDR:S1_PORT</text>
                  <text x="292" y="1172">only</text>
                  <text x="324" y="1172">to</text>
                  <text x="348" y="1172">S1</text>
                  <text x="376" y="1172">for</text>
                  <text x="408" y="1172">the</text>
                  <text x="56" y="1188">Uri-Path:</text>
                  <text x="112" y="1188">"r"</text>
                  <text x="292" y="1188">same</text>
                  <text x="348" y="1188">resource</text>
                  <text x="396" y="1188">/r</text>
                  <text x="416" y="1188">/</text>
                  <text x="292" y="1252">Src:</text>
                  <text x="376" y="1252">S1.ADDR:S1_PORT</text>
                  <text x="292" y="1268">Dst:</text>
                  <text x="368" y="1268">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 /           |             |
|                               |                      |             |
|                               |                      |             |

...           ...        / Time passes /              ...          ...

|                               |                      |             |
|                               |                      |             |
+----------------------------------------------------->|             |
| Src: C_ADDR:C_PORT            | / Request intended   |             |
| Dst: S1.ADDR:S1_PORT          | only to 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-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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
OCh1yeV0eXm59v8Dkun8W2LtAQA=

-->

</rfc>
