<?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.1.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-core-groupcomm-proxy-01" category="std" consensus="true" submissionType="IETF" updates="7252" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.19.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-01"/>
    <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="March" day="04"/>
    <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 considers 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>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-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>OSCORE <xref target="RFC8613"/> and Group OSCORE <xref target="I-D.ietf-core-oscore-groupcomm"/>.</t>
          </li>
          <li>
            <t>CDDL <xref target="RFC8610"/>, 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="fig-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>
      <figure anchor="fig-multicast-timeout-option">
        <name>The Multicast-Timeout Option.</name>
        <artwork align="center"><![CDATA[
+------+---+---+---+---+------------+--------+--------+---------+
| No.  | C | U | N | R | Name       | Format | Length | Default |
+------+---+---+---+---+------------+--------+--------+---------+
|      |   |   |   |   |            |        |        |         |
| TBD1 |   | x | - |   | Multicast- |  uint  |  0-4   | (none)  |
|      |   |   |   |   | Timeout    |        |        |         |
|      |   |   |   |   |            |        |        |         |
+------+---+---+---+---+------------+--------+--------+---------+
           C=Critical, U=Unsafe, N=NoCacheKey, R=Repeatable
]]></artwork>
      </figure>
      <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 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-to-option">
      <name>The Reply-To Option</name>
      <t>The Reply-To Option defined in this section has the properties summarized in <xref target="fig-reply-to-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>
      <figure anchor="fig-reply-to-option">
        <name>The Reply-To Option.</name>
        <artwork align="center"><![CDATA[
+------+---+---+---+---+----------+--------+--------+---------+
| No.  | C | U | N | R | Name     | Format | Length | Default |
+------+---+---+---+---+----------+--------+--------+---------+
|      |   |   |   |   |          |        |        |         |
| TBD2 |   |   | - |   | Reply-To |  (*)   | 5-1034 | (none)  |
|      |   |   |   |   |          |        |        |         |
+------+---+---+---+---+----------+--------+--------+---------+
           C=Critical, U=Unsafe, N=NoCacheKey, R=Repeatable

(*) See below.
]]></artwork>
      </figure>
      <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-To 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 requests later on, either directly, or indirectly via the proxy, as unicast requests.</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-client-side"/> and <xref target="sec-reverse-proxies-proxy-side"/> when the proxy is a reverse-proxy.</t>
      <t>The Reply-To 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 (allow-list) to perform proxied group requests on behalf of specific allowed client(s).</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 secure, end-to-end 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 and capable to handle multiple responses to a proxied group request. 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. The request specifies the group URI where the request has to be forwarded to, as a string in the Proxi-URI option or by using the Proxy-Scheme option with the group URI composed from the URI-* options (see <xref section="3.5.1" sectionFormat="of" target="I-D.ietf-core-groupcomm-bis"/>).</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 one 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 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 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>
            </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 response <bcp14>MUST</bcp14> include a Multicast-Timeout Option with an empty (zero-length) value, indicating 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, the proxy proceeds according to the following steps.</t>
          <ol spacing="normal" type="1"><li>
              <t>The proxy <bcp14>MUST</bcp14> include the Reply-To Option defined in <xref target="sec-reply-to-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-To Option into the response before caching it. 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 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-To 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. 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, 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 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-To Option, and identifies the origin server whose addressing information is specified by the CRI.  </t>
              <t>
In particular, the client is able to distinguish different responses as originated by different servers. 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).  </t>
              <t>
In order to individually reach the origin server again through the proxy, the client is not required to understand or 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: -1).  </t>
              <t>
That is, by using the information specified in the retrieved CRI, the client composes the correct URI for the individual request, and specifies it by means of the Proxy-Uri Option or Proxy-Scheme Option in the unicast request to the proxy. Alternatively, the client can rely on the analogous Proxy-Cri or Proxy-Scheme-Number Option defined in <xref target="I-D.ietf-core-href"/>. In either case, the client uses the transport protocol that it knows, and has used before, to send the 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 client normally processes at the CoAP layer each of those responses from the same origin server, and decides at the application layer how to exactly handle them depending on its available context information (see <xref section="3.1.6" sectionFormat="of" target="I-D.ietf-core-groupcomm-bis"/>).</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 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">
                <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 16,64 L 256,64" fill="none" stroke="black"/>
                <path d="M 272,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 440,400" fill="none" stroke="black"/>
                <path d="M 16,480 L 256,480" fill="none" stroke="black"/>
                <path d="M 272,592 L 552,592" fill="none" stroke="black"/>
                <path d="M 16,672 L 256,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="56" y="532">Reply-To:</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="56" y="724">Reply-To:</text>
                  <text x="144" y="740">cri'coap://S2_ADDR:S2_PORT'</text>
                  <text x="128" y="788">/</text>
                  <text x="148" y="788">At</text>
                  <text x="168" y="788">t</text>
                  <text x="184" y="788">=</text>
                  <text x="208" y="788">60,</text>
                  <text x="232" y="788">P</text>
                  <text x="264" y="788">stops</text>
                  <text x="328" y="788">accepting</text>
                  <text x="160" y="804">responses</text>
                  <text x="216" y="804">for</text>
                  <text x="252" y="804">this</text>
                  <text x="304" y="804">request</text>
                  <text x="344" 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-To:                     |                      |             |
|   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-To:                     |                      |             |
|   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 explicitly 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"/>.
A reverse-proxy may also operate without support of the Multicast-Timeout Option, as defined in that section.</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 explicitly reveals itself as a reverse-proxy, by sending a 4.00 (Bad Request) response including a Multicast-Timeout Option with empty (zero-length) 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-To 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 originated 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 server that originated 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"/>. An example is 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-To Option specifies an addressing information TARGET that is directly associated with the origin server that originated 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 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>
              </li>
            </ul>
            <t>
The client will be able to use that information for sending a follow-up unicast request directly to that server, i.e., bypassing the proxy. This is further specified in <xref target="sec-reverse-proxies-client-side"/>. An example is provided in <xref target="sec-reverse-proxies-examples-ex3"/>.</t>
          </li>
        </ul>
      </section>
      <section anchor="sec-reverse-proxies-client-side">
        <name>Processing on the Client Side</name>
        <t>If a client sends a CoAP request intended to a group of servers and is aware of actually communicating with a reverse-proxy, then the client <bcp14>MUST</bcp14> perform the steps defined in <xref target="ssec-req-send-steps"/>. In particular, this results in a request sent to the proxy including a Multicast-Timeout Option.</t>
        <t>The client processes the CoAP responses forwarded back by the proxy as defined in <xref target="ssec-resp-proc-client"/>, 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 server that originated 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-To Option. Effectively, the client sends the unicast request to the proxy.  </t>
            <t>
In case the value of the Reply-To 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 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 part 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="fig-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>
        <figure anchor="fig-response-group-etag-option">
          <name>The Group-ETag Option.</name>
          <artwork align="center"><![CDATA[
+------+---+---+---+---+------------+--------+--------+---------+
| No.  | C | U | N | R | Name       | Format | Length | Default |
+------+---+---+---+---+------------+--------+--------+---------+
|      |   |   |   |   |            |        |        |         |
| TBD3 |   |   |   | x | Group-ETag | opaque |  1-8   | (none)  |
|      |   |   |   |   |            |        |        |         |
+------+---+---+---+---+------------+--------+--------+---------+
           C=Critical, U=Unsafe, N=NoCacheKey, R=Repeatable
]]></artwork>
        </figure>
        <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 server. 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 to be 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 means of including inner ETag Option(s) 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 which 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 ad 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 (allow-list) to allow 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 URIs, a proxy proceed 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 for the first proxy 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 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>
Upon receiving such an error response, any proxy in the chain <bcp14>MAY</bcp14> send an updated group request to the next hop towards the origin servers, specifying in the Multicast-Timeout Option a value T' greater than in the previous request. If this does not happen, the proxy receiving the error response <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-To 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-To Option, the origin client can retrieve addressing information that is directly associated with the origin server that originated 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-To 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 originated the response.  </t>
            <t>
This ensures that, when receiving a response to a group request and consuming the Reply-To 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 originated the response.</t>
          </li>
          <li>
            <t>At step 2, "client" refers to the origin client for the first proxy 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 to 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. 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-coap-proxies">
      <name>HTTP-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-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-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>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>The same applies in the opposite direction, when translating an HTTP message into a CoAP message.</t>
      </section>
      <section anchor="sec-reply-to-header">
        <name>The HTTP Reply-To Header Field</name>
        <t>The HTTP Reply-To header field (see <xref target="iana-message-headers"/>) is used for carrying the content otherwise specified in the CoAP Reply-To Option defined in <xref target="sec-reply-to-option"/>.</t>
        <t>Using the Augmented Backus-Naur Form (ABNF) notation of <xref target="RFC5234"/> and including the following core ABNF syntax rules defined by that specification: ALPHA (letters) and DIGIT (decimal digits), the HTTP Reply-To header field value is as follows.</t>
        <t>reply-to-char = ALPHA / DIGIT / "-" / "_"</t>
        <t>Reply-To = 2*reply-to-char</t>
        <t>When translating a CoAP message into an HTTP message, the HTTP Reply-To header field is set to the value of the CoAP Reply-To Option in base64url (see <xref section="5" sectionFormat="of" target="RFC4648"/>) encoding without padding. Implementation notes for this encoding are given in <xref section="C" sectionFormat="of" target="RFC7515"/>.</t>
        <t>When translating an HTTP message into a CoAP message, the CoAP Reply-To Option is set to the value of the HTTP Reply-To header field decoded from base64url (see <xref section="5" sectionFormat="of" target="RFC4648"/>) without padding. Implementation notes for this encoding are given in <xref section="C" sectionFormat="of" target="RFC7515"/>.</t>
      </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>Using the Augmented Backus-Naur Form (ABNF) notation of <xref target="RFC5234"/> and including the following core ABNF syntax rules defined by that specification: ALPHA (letters) and DIGIT (decimal digits), the HTTP Group-ETag header field value is as follows.</t>
        <t>group-etag-char = ALPHA / DIGIT / "-" / "_"</t>
        <t>Group-ETag = 2*group-etag-char</t>
        <t>When translating a CoAP message into an HTTP message, the HTTP Group-ETag header field is set to the value of the CoAP Group-ETag Option in base64url (see <xref section="5" sectionFormat="of" target="RFC4648"/>) encoding without padding. Implementation notes for this encoding are given in <xref section="C" sectionFormat="of" target="RFC7515"/>.</t>
        <t>When translating an HTTP message into a CoAP message, the CoAP Group-ETag Option is set to the value of the HTTP Group-ETag header field decoded from base64url (see <xref section="5" sectionFormat="of" target="RFC4648"/>) without padding. Implementation notes for this encoding are given in <xref section="C" sectionFormat="of" target="RFC7515"/>.</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 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-To 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-To Option are defined in <xref target="sec-reply-to-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 timout 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 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 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-To header field are defined in <xref target="sec-reply-to-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-To 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-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-To: 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-To: 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 have 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 originated 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 it 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>
          <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>
          <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"/><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.</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, that 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 servers using the group mode of Group OSCORE, the proxy can act as external signature checker (see <xref section="8.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 remove the option or alter its content, before the group request reaches the proxy. Removing the option would otherwise result in not forwarding the group request to the servers. Instead, altering the option content would result in the proxy accepting and forwarding back responses for an amount of time different than 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 simply 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-To Option</name>
        <t>The Reply-To 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>Since the security association between the client and the proxy provides message integrity, any further intermediaries between the two as well as any on-path active adversaries are not able to undetectably remove the Reply-To Option from a forwarded server response. This ensures that the client can correctly distinguish the different responses and identify their corresponding origin server.</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, message integrity is 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 remove the option or alter its content, before the group request reaches the proxy. Removing the option would otherwise 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 replying with 2.05 (Content) responses conveying the full resource representations from its cache entries, rather than with a single 2.03 (Valid) response. 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 simply 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-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 <xref target="RFC8613"/> Security Context 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>New CoAP Option Numbers</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-To</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 registry.</t>
        <table align="center" anchor="tab-iana-http-field-names">
          <name>New HTTP Field Names</name>
          <thead>
            <tr>
              <th align="left">Field Name</th>
              <th align="left">Status</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Multicast-Timeout</td>
              <td align="left">permanent</td>
              <td align="left">[RFC-XXXX]</td>
            </tr>
            <tr>
              <td align="left">Reply-To</td>
              <td align="left">permanent</td>
              <td align="left">[RFC-XXXX]</td>
            </tr>
            <tr>
              <td align="left">Group-ETag</td>
              <td align="left">permanent</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="23" month="October" year="2023"/>
            <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-10"/>
        </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="Jiye Park" initials="J." surname="Park">
              <organization>Universitaet Duisburg-Essen</organization>
            </author>
            <date day="2" month="September" year="2023"/>
            <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-20"/>
        </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="9" month="January" 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 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 "cref" paragraph will be removed by the RFC editor:) The
   // present revision –14 of this draft picks up comments from the
   // shepherd review and adds sections on CoAP integration and on cri
   // application-oriented literals for the Extended Diagnostic
   // Notation.  This revision still contains open issues and is
   // intended to serve as a snapshot while the processing of the
   // shepherd review is being completed.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-core-href-14"/>
        </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="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="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="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="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="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>
      </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">
              <organization>Consultant</organization>
            </author>
            <date day="8" month="September" year="2023"/>
            <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-14"/>
        </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="10" month="January" 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-08"/>
        </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="18" month="October" year="2023"/>
            <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 how to
   secure a CoAP message by applying multiple, nested OSCORE
   protections, e.g., both end-to-end between origin application
   endpoints, as well as between an application endpoint and an
   intermediary or between two intermediaries.  Thus, this document
   updates RFC 8613.  The same approach can be seamlessly used with
   Group OSCORE, for protecting CoAP messages when group communication
   with intermediaries is used.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-core-oscore-capable-proxies-00"/>
        </reference>
        <reference anchor="RFC7515">
          <front>
            <title>JSON Web Signature (JWS)</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="N. Sakimura" initials="N." surname="Sakimura"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>JSON Web Signature (JWS) represents content secured with digital signatures or Message Authentication Codes (MACs) using JSON-based data structures. Cryptographic algorithms and identifiers for use with this specification are described in the separate JSON Web Algorithms (JWA) specification and an IANA registry defined by that specification. Related encryption capabilities are described in the separate JSON Web Encryption (JWE) specification.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7515"/>
          <seriesInfo name="DOI" value="10.17487/RFC7515"/>
        </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="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). 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>The hostname 'p.example.com' resolves to the proxy's unicast IPv6 address P_ADDR.</t>
          </li>
          <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' 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 is well scalable to a large number of servers Sx. Instead, the type of reverse-proxy in the example in <xref target="sec-reverse-proxies-examples-ex2"/> requires an additional IP address for each server Sx and also for each CoAP group that it supports.</t>
        <figure anchor="workflow-example-reverse-1">
          <name>Workflow example with reverse-proxy standing in for both the whole group of servers and each individual server, and requiring only one unicast IP address.</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="1488" width="576" viewBox="0 0 576 1488" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px">
                <path d="M 8,48 L 8,1472" fill="none" stroke="black"/>
                <path d="M 304,48 L 304,1040" fill="none" stroke="black"/>
                <path d="M 304,1088 L 304,1472" fill="none" stroke="black"/>
                <path d="M 488,48 L 488,504" fill="none" stroke="black"/>
                <path d="M 488,520 L 488,840" fill="none" stroke="black"/>
                <path d="M 488,896 L 488,1472" fill="none" stroke="black"/>
                <path d="M 568,48 L 568,1472" fill="none" stroke="black"/>
                <path d="M 16,64 L 296,64" fill="none" stroke="black"/>
                <path d="M 16,160 L 296,160" fill="none" stroke="black"/>
                <path d="M 16,304 L 296,304" fill="none" stroke="black"/>
                <path d="M 312,480 L 480,480" fill="none" stroke="black"/>
                <path d="M 448,512 L 560,512" fill="none" stroke="black"/>
                <path d="M 312,640 L 480,640" fill="none" stroke="black"/>
                <path d="M 16,720 L 296,720" fill="none" stroke="black"/>
                <path d="M 312,848 L 560,848" fill="none" stroke="black"/>
                <path d="M 16,928 L 296,928" fill="none" stroke="black"/>
                <path d="M 16,1120 L 296,1120" fill="none" stroke="black"/>
                <path d="M 312,1296 L 480,1296" fill="none" stroke="black"/>
                <path d="M 312,1344 L 480,1344" fill="none" stroke="black"/>
                <path d="M 16,1424 L 296,1424" fill="none" stroke="black"/>
                <path d="M 432,480 L 448,512" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="568,512 556,506.4 556,517.6" fill="black" transform="rotate(0,560,512)"/>
                <polygon class="arrowhead" points="488,1296 476,1290.4 476,1301.6" fill="black" transform="rotate(0,480,1296)"/>
                <polygon class="arrowhead" points="488,480 476,474.4 476,485.6" fill="black" transform="rotate(0,480,480)"/>
                <polygon class="arrowhead" points="320,1344 308,1338.4 308,1349.6" fill="black" transform="rotate(180,312,1344)"/>
                <polygon class="arrowhead" points="320,848 308,842.4 308,853.6" fill="black" transform="rotate(180,312,848)"/>
                <polygon class="arrowhead" points="320,640 308,634.4 308,645.6" fill="black" transform="rotate(180,312,640)"/>
                <polygon class="arrowhead" points="304,1120 292,1114.4 292,1125.6" fill="black" transform="rotate(0,296,1120)"/>
                <polygon class="arrowhead" points="304,304 292,298.4 292,309.6" fill="black" transform="rotate(0,296,304)"/>
                <polygon class="arrowhead" points="304,64 292,58.4 292,69.6" fill="black" transform="rotate(0,296,64)"/>
                <polygon class="arrowhead" points="24,1424 12,1418.4 12,1429.6" fill="black" transform="rotate(180,16,1424)"/>
                <polygon class="arrowhead" points="24,928 12,922.4 12,933.6" fill="black" transform="rotate(180,16,928)"/>
                <polygon class="arrowhead" points="24,720 12,714.4 12,725.6" fill="black" transform="rotate(180,16,720)"/>
                <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="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="128" y="100">group1.com: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-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="200" 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="140" y="340">p.example.com:P_PORT</text>
                  <text x="56" y="356">Uri-Host:</text>
                  <text x="148" y="356">"group1.com"</text>
                  <text x="56" y="372">Uri-Path:</text>
                  <text x="112" y="372">"r"</text>
                  <text x="92" y="388">Multicast-Timeout:</text>
                  <text x="180" y="388">60</text>
                  <text x="332" y="436">Src:</text>
                  <text x="408" y="436">P_ADDR:P_PORT</text>
                  <text x="332" y="452">Dst:</text>
                  <text x="408" y="452">G_ADDR:G_PORT</text>
                  <text x="352" y="468">Uri-Path:</text>
                  <text x="408" y="468">"r"</text>
                  <text x="320" y="564">/</text>
                  <text x="336" y="564">t</text>
                  <text x="352" y="564">=</text>
                  <text x="368" y="564">0</text>
                  <text x="384" y="564">:</text>
                  <text x="400" y="564">P</text>
                  <text x="436" y="564">starts</text>
                  <text x="352" y="580">accepting</text>
                  <text x="432" y="580">responses</text>
                  <text x="328" y="596">for</text>
                  <text x="364" y="596">this</text>
                  <text x="416" y="596">request</text>
                  <text x="456" y="596">/</text>
                  <text x="332" y="660">Src:</text>
                  <text x="416" y="660">S1_ADDR:S1_PORT</text>
                  <text x="332" y="676">Dst:</text>
                  <text x="408" y="676">P_ADDR:P_PORT</text>
                  <text x="36" y="740">Src:</text>
                  <text x="112" y="740">P_ADDR:P_PORT</text>
                  <text x="36" y="756">Dst:</text>
                  <text x="112" y="756">C_ADDR:C_PORT</text>
                  <text x="56" y="772">Reply-To:</text>
                  <text x="156" y="788">cri'coap+tcp://P_ADDR:P_PORT',</text>
                  <text x="124" y="804">cri'//S1_ADDR:S1_PORT'</text>
                  <text x="412" y="868">Src:</text>
                  <text x="496" y="868">S2_ADDR:S2_PORT</text>
                  <text x="412" y="884">Dst:</text>
                  <text x="488" y="884">P_ADDR:P_PORT</text>
                  <text x="36" y="948">Src:</text>
                  <text x="112" y="948">P_ADDR:P_PORT</text>
                  <text x="36" y="964">Dst:</text>
                  <text x="112" y="964">C_ADDR:C_PORT</text>
                  <text x="56" y="980">Reply-To:</text>
                  <text x="156" y="996">cri'coap+tcp://P_ADDR:P_PORT',</text>
                  <text x="124" y="1012">cri'//S2_ADDR:S2_PORT'</text>
                  <text x="176" y="1060">/</text>
                  <text x="196" y="1060">At</text>
                  <text x="216" y="1060">t</text>
                  <text x="232" y="1060">=</text>
                  <text x="256" y="1060">60,</text>
                  <text x="280" y="1060">P</text>
                  <text x="312" y="1060">stops</text>
                  <text x="376" y="1060">accepting</text>
                  <text x="208" y="1076">responses</text>
                  <text x="264" y="1076">for</text>
                  <text x="300" y="1076">this</text>
                  <text x="352" y="1076">request</text>
                  <text x="392" y="1076">/</text>
                  <text x="320" y="1124">/</text>
                  <text x="360" y="1124">Request</text>
                  <text x="428" y="1124">intended</text>
                  <text x="36" y="1140">Src:</text>
                  <text x="112" y="1140">C_ADDR:C_PORT</text>
                  <text x="332" y="1140">only</text>
                  <text x="364" y="1140">to</text>
                  <text x="392" y="1140">S1,</text>
                  <text x="424" y="1140">via</text>
                  <text x="456" y="1140">the</text>
                  <text x="36" y="1156">Dst:</text>
                  <text x="112" y="1156">P_ADDR:P_PORT</text>
                  <text x="336" y="1156">proxy</text>
                  <text x="368" y="1156">P</text>
                  <text x="384" y="1156">/</text>
                  <text x="56" y="1172">Uri-Host:</text>
                  <text x="136" y="1172">"S1_ADDR"</text>
                  <text x="56" y="1188">Uri-Port:</text>
                  <text x="128" y="1188">S1_PORT</text>
                  <text x="56" y="1204">Uri-Path:</text>
                  <text x="116" y="1204">"r1"</text>
                  <text x="332" y="1252">Src:</text>
                  <text x="408" y="1252">P_ADDR:P_PORT</text>
                  <text x="332" y="1268">Dst:</text>
                  <text x="416" y="1268">S1_ADDR:S1_PORT</text>
                  <text x="352" y="1284">Uri-Path:</text>
                  <text x="412" y="1284">"r1"</text>
                  <text x="332" y="1364">Src:</text>
                  <text x="416" y="1364">S1_ADDR:S1_PORT</text>
                  <text x="332" y="1380">Dst:</text>
                  <text x="408" y="1380">P_ADDR:P_PORT</text>
                  <text x="164" y="1444">Src:</text>
                  <text x="240" y="1444">P_ADDR:P_PORT</text>
                  <text x="164" y="1460">Dst:</text>
                  <text x="240" y="1460">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: group1.com: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.example.com: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-To:                          |                      |         |
|   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-To:                          |                      |         |
|   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). 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>The hostname 'group1.com' resolves to the unicast address P_ADDR. The proxy forwards an incoming request to that address, for any resource i.e., URI path, 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 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 reverse-proxy standing in for both the whole group of servers and each individual server, and requiring one pair (IP address, port number) for each origin server.</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="1440" width="576" viewBox="0 0 576 1440" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px">
                <path d="M 8,48 L 8,1424" 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,1088 L 296,1424" 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,1424" fill="none" stroke="black"/>
                <path d="M 568,48 L 568,1424" fill="none" stroke="black"/>
                <path d="M 16,64 L 288,64" fill="none" stroke="black"/>
                <path d="M 16,160 L 288,160" fill="none" stroke="black"/>
                <path d="M 16,304 L 288,304" fill="none" stroke="black"/>
                <path d="M 304,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 472,624" fill="none" stroke="black"/>
                <path d="M 16,704 L 288,704" fill="none" stroke="black"/>
                <path d="M 304,816 L 560,816" fill="none" stroke="black"/>
                <path d="M 16,896 L 288,896" fill="none" stroke="black"/>
                <path d="M 16,1120 L 288,1120" fill="none" stroke="black"/>
                <path d="M 304,1248 L 472,1248" fill="none" stroke="black"/>
                <path d="M 304,1296 L 472,1296" fill="none" stroke="black"/>
                <path d="M 16,1376 L 288,1376" 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,1248 468,1242.4 468,1253.6" fill="black" transform="rotate(0,472,1248)"/>
                <polygon class="arrowhead" points="480,464 468,458.4 468,469.6" fill="black" transform="rotate(0,472,464)"/>
                <polygon class="arrowhead" points="312,1296 300,1290.4 300,1301.6" fill="black" transform="rotate(180,304,1296)"/>
                <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,1120 284,1114.4 284,1125.6" fill="black" transform="rotate(0,288,1120)"/>
                <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,1376 12,1370.4 12,1381.6" fill="black" transform="rotate(180,16,1376)"/>
                <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="128" y="100">group1.com: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="200" 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="124" 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="128" y="340">group1.com:P_PORT</text>
                  <text x="92" y="356">Multicast-Timeout:</text>
                  <text x="180" y="356">60</text>
                  <text x="56" y="372">Uri-Path:</text>
                  <text x="112" y="372">"r"</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="56" y="756">Reply-To:</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="56" y="948">Reply-To:</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="20" y="1076">..</text>
                  <text x="128" y="1076">...</text>
                  <text x="240" y="1076">/</text>
                  <text x="268" y="1076">Time</text>
                  <text x="316" y="1076">passes</text>
                  <text x="352" y="1076">/</text>
                  <text x="472" y="1076">.</text>
                  <text x="488" y="1076">.</text>
                  <text x="556" y="1076">..</text>
                  <text x="312" y="1124">/</text>
                  <text x="352" y="1124">Request</text>
                  <text x="420" y="1124">intended</text>
                  <text x="36" y="1140">Src:</text>
                  <text x="112" y="1140">C_ADDR:C_PORT</text>
                  <text x="324" y="1140">only</text>
                  <text x="356" y="1140">to</text>
                  <text x="380" y="1140">S1</text>
                  <text x="408" y="1140">for</text>
                  <text x="440" y="1140">the</text>
                  <text x="36" y="1156">Dst:</text>
                  <text x="120" y="1156">D1_ADDR:D1_PORT</text>
                  <text x="324" y="1156">same</text>
                  <text x="380" y="1156">resource</text>
                  <text x="428" y="1156">/r</text>
                  <text x="448" y="1156">/</text>
                  <text x="56" y="1172">Uri-Path:</text>
                  <text x="112" y="1172">"r"</text>
                  <text x="324" y="1204">Src:</text>
                  <text x="400" y="1204">P_ADDR:P_PORT</text>
                  <text x="324" y="1220">Dst:</text>
                  <text x="408" y="1220">S1_ADDR:S1_PORT</text>
                  <text x="344" y="1236">Uri-Path:</text>
                  <text x="400" y="1236">"r"</text>
                  <text x="324" y="1316">Src:</text>
                  <text x="408" y="1316">S1_ADDR:S1_PORT</text>
                  <text x="324" y="1332">Dst:</text>
                  <text x="400" y="1332">P_ADDR:P_PORT</text>
                  <text x="140" y="1396">Src:</text>
                  <text x="224" y="1396">D1_ADDR:D1_PORT</text>
                  <text x="140" y="1412">Dst:</text>
                  <text x="216" y="1412">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: group1.com: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: group1.com:P_PORT            |                      |          |
| Multicast-Timeout: 60             |                      |          |
| Uri-Path: "r"                     |                      |          |
|                                   |                      |          |
|                                   |                      |          |
|                                   | 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-To:                         |                      |          |
|   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-To:                         |                      |          |
|   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.</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 reverse-proxy standing in for only the whole group of servers, but not for each individual server</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="1264" width="568" viewBox="0 0 568 1264" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px">
                <path d="M 8,48 L 8,1248" 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,1072 L 264,1096" fill="none" stroke="black"/>
                <path d="M 264,1112 L 264,1192" fill="none" stroke="black"/>
                <path d="M 264,1208 L 264,1248" 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,1248" fill="none" stroke="black"/>
                <path d="M 560,48 L 560,1248" fill="none" stroke="black"/>
                <path d="M 16,64 L 256,64" fill="none" stroke="black"/>
                <path d="M 16,144 L 256,144" fill="none" stroke="black"/>
                <path d="M 16,288 L 256,288" fill="none" stroke="black"/>
                <path d="M 272,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 440,608" fill="none" stroke="black"/>
                <path d="M 16,688 L 256,688" fill="none" stroke="black"/>
                <path d="M 272,800 L 552,800" fill="none" stroke="black"/>
                <path d="M 16,880 L 256,880" fill="none" stroke="black"/>
                <path d="M 16,1104 L 440,1104" fill="none" stroke="black"/>
                <path d="M 16,1200 L 440,1200" 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,1104 436,1098.4 436,1109.6" fill="black" transform="rotate(0,440,1104)"/>
                <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,1200 12,1194.4 12,1205.6" fill="black" transform="rotate(180,16,1200)"/>
                <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="128" y="100">group1.com: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="200" 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="124" 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="128" y="324">group1.com:P_PORT</text>
                  <text x="92" y="340">Multicast-Timeout:</text>
                  <text x="180" y="340">60</text>
                  <text x="56" y="356">Uri-Path:</text>
                  <text x="112" y="356">"r"</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="56" y="740">Reply-To:</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="56" y="932">Reply-To:</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="20" y="1060">..</text>
                  <text x="128" y="1060">...</text>
                  <text x="208" y="1060">/</text>
                  <text x="236" y="1060">Time</text>
                  <text x="284" y="1060">passes</text>
                  <text x="320" y="1060">/</text>
                  <text x="440" y="1060">.</text>
                  <text x="456" y="1060">.</text>
                  <text x="548" y="1060">..</text>
                  <text x="36" y="1124">Src:</text>
                  <text x="112" y="1124">C_ADDR:C_PORT</text>
                  <text x="280" y="1124">/</text>
                  <text x="320" y="1124">Request</text>
                  <text x="388" y="1124">intended</text>
                  <text x="36" y="1140">Dst:</text>
                  <text x="120" y="1140">S1.ADDR:S1_PORT</text>
                  <text x="292" y="1140">only</text>
                  <text x="324" y="1140">to</text>
                  <text x="348" y="1140">S1</text>
                  <text x="376" y="1140">for</text>
                  <text x="408" y="1140">the</text>
                  <text x="56" y="1156">Uri-Path:</text>
                  <text x="112" y="1156">"r"</text>
                  <text x="292" y="1156">same</text>
                  <text x="348" y="1156">resource</text>
                  <text x="396" y="1156">/r</text>
                  <text x="416" y="1156">/</text>
                  <text x="292" y="1220">Src:</text>
                  <text x="376" y="1220">S1.ADDR:S1_PORT</text>
                  <text x="292" y="1236">Dst:</text>
                  <text x="368" y="1236">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: group1.com: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: group1.com:P_PORT        |                      |             |
| Multicast-Timeout: 60         |                      |             |
| Uri-Path: "r"                 |                      |             |
|                               |                      |             |
|                               |                      |             |
|                               | 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-To:                     |                      |             |
|   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-To:                     |                      |             |
|   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-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="acknowldegment">
      <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 VINNOVA and the Celtic-Next project CRITISEC; and by the H2020 project SIFIS-Home (Grant agreement 952652).</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+2923IcR5Ig+o6vyIHMFoBUBRLgRRK61WchAJI4TZEYAOzu
sekxbaIqAWSzKrM2s4ogWuL5lvMV+7RPOz92/BYRHpGRlwIpNdUrmFECqjLj
4uHu4Xcfj8cbbw6SRxsby3w5yw6S06p8e5e8XGRVuszLok6uyio5Kg9Pk2+r
crWAX+fzVZFP6NuN9PKyyt60vBV7YVpOinQO80yr9Go5zrPl1XhSVtn4Gh+e
wLPjBY41nqXLrF5ubNxeH8AQZyfJn8vqdV5c86gbr28PkmfFMquKbDk+xrE2
YIaDpF5ON+rV5Tyva5huebeAqZ6dXHyzsVpMccSD5PP9J/sbG5NyCoMdJCuY
/4uNjXS1vCmrg42Efsby/yTJC3jj+93kIp+Vk9R+zFv4Pq0mZfhVWcGoZ8/O
T5LDr+2H9bLKMljdszq9+ltZTevrdJkWyf6+fWKSL+8Okj/m9dINBWuEWc5P
xntPHz9+mJwvy8nrm3I2Vw+simUF753fZtOssJ9n8zSfHSRzXN/uktb336t8
t87i+zvZTY7zv70OdndSvy79z2lr8POsvJjAGa9msIfJ3W4xC3bxCnY7uVk2
l3lxkyUvsuVNVs3SYlqH681gxt0pzPjf83IZzLBRlNUcUOhNhof0bHy8G0Od
y7xufl3W/lPNJ26q7Ao/PfvmaP/h46fm1729L+XXx08ffyG/Ptl/9Fh+RUwy
vz59vCe/fvHw8yfm173PzbNfPNp/ZH59uvfQ/Wo//fyxGeyLLx+bib/c24NP
N/LiKtz+JX5QFLCBdDEGdJ+YL/i8va1P4evyTQZHIM+k83qV1TU/NEknN+nl
zDztgSedZOPX2Z0CceQhPdUkXdBYSMR5VhvwPNkzMPn8y6efm30+trD+cu8x
fLqRFUvEIPjs/OT5NwfJ5n/Ad+O/wM9/bm5sjMfjJL0EWkonwBgubvI6AXay
msNbSb3IJvkVzJgAeiWlY0TwG8IumyaXd0maEHMZJbc3WZGsauQn+PwRPAnD
5gU8drhYzIRbIVsDoitnyTZywB0gl4QgkUw0U0vqSVakVV7Wu8n5anJjpsH/
TgDMsKg0wblmWVJl/xMgD+vFRdOKJrMcf8fzSWjIejlKgDwSOLVllV+ulrIp
8+qyhLd4GeUVDFTBm/UoyXavd0c8zKvj0wfPTpM50A+Nl6Q8wjS7oi3C/1P4
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
zKmu53tInhJ3mb42F2o5s7eLUnh8KQqzVbUkJfMyVpBlHDfJSYihrOT2HBfd
TMCdrwfxMgeJhWyKVakOa0vOl5YbmQuoER6iN9QsktQqD0eCqyJSsRLKEPZW
N28KlucsuvoI4WiJV3hf+dJFlQYCZkuOfMzd0bb+7hWvJWdaH6FZ8X3kTP2m
tUYEvpJfjU3CybPRbekg6UsuMnPnrjznS/317HYQn2wg2T24pcBzffV0COOR
qMdWtkhk1coKmjqmf6N+cCUz6qlK265dyxe6eUEsALUrzr+pmQR1Ltg9g180
jd4qoeqDqKkNy39HDpSJbg2ympqJBg3pUgnXLFWmtcFCZ03HkGLRsOh7cjFm
MwreNNe7H3nuu3m7ywcJGbBtbek4s16xBHF3zqldYLJaT4ccII3pbItAgNpp
6JZdZ9PM8BDcMbPmJhswK+pVZUwAfs5Jo+xhWbzJ7tauyMRDC3izqbesEfNZ
G/psp89r31SXKlYe0ToILFsM1Cy0gHjKmANII7UxarO2VKRN1jLEe5ppuio7
7u0+HSDbsbfZlS3iMyRzhsDe1B2k2dtjoOiVaFqybyQh2zJp8BQ35rIdNZiD
0LGAhymwe5lGDfxmNsBzU0iNYThsepdUaK53hEhExvXIFjd5lRhHNKd8QmLA
MX2Pdwy81OT5Shpw+oZjmItlhClHNG8FkyqDFcDTqGhgpOXMi7YwaIJuR4Zz
qkokXtys6pFi05gINOToWJu8zAi7mIIQWGinUsnWTfQfJHr4d9q9dbQUiYnN
ekzXRidzoMicyk7ym4ldzdIKXqnalRGzqHcxm3ybipjaeim4EaUx+Wo+cZzA
2xrjJI0AF0Mjv4yApejW4Q/w7NwE3n+aHC6JrJK99pwZ/8h6UgoTdHHdeeAa
yTsMxmK8v/v2bQBPLlYosVRkcTMXsCEg4fBof8YtGg9HHb1rbNZVhPyiYU7W
kUDDyiWGqcv51ajHOlSUCW1o+3w1QelvR9FmnyRnNQwHoLSwNCMCERnaKW3B
z7KnCA6/5uHLpa1v1LVontcxb7VrjkNNuXwhrTqIduENGHtEaBiRwwiukAjt
BPW6q6yTJ7V64xp4atSolmC2LHLOYrtHJFG5IBg9BYDzS9gZhBJLNDArtNDO
7kwGTcQdUS/JptcSw1FGjYgtGNnKTnTejb0LXLi/FS447NMe572crxR2y3l4
tSqG6w33eHdNPS8S7+qn5L1vwOtwVc+rsmULjwwOiB2mCXp5hg1V0BdnuzXD
jtDMViWxqSN+gMjcqDFmLYNLV6xIl7P0vaRwc3r7Komq03Sj8qv642ia0G3C
yF19Qgw4NOIZ3coDk8P8Anx+7J7vA0Ml2iKYF94U3OWS2+q7jYOaclz/Ja4D
emKNkCNM3hdY25KOEEtFSG1ksiSeuYesK+2lzR9o1MRtzSfQN5PLxKeYNNIM
bPbANtfS9USVnSAbf9tV0kNABGTqPEKuaICaER5LJzcRyKfXHLUdxPeFkMR7
zSb9wdirAqtTLimWtbKlrOgibxbrdTV7ALQuq7ywaOQKZEcjTBurpqRTjsXl
B23ZW1wn196W9iFU2jHhOaUhwUEy3tsxxiApj+5F13dWZ3DGAhjYr/XA0fbi
o5VsPPSOGomhWYxhFOTr51R7lrO9hJg41F/V1IHBvPB/JzDj410xS1iXW2X7
NQpV6Js/BVQvr8tVLZMdwQKCmccvuL9DzHwXraOJ2Cl5M42YUVvxo63YM4Dm
dQGqzshGBQjGSDFeE815E48s/NnMI0vNH0mqrj+UXWSkmjK4iBJVl9zOTD2l
kMzd1WAEIiQGdGFUtmtImC/WMYn07wH0nLohU9XWhUeW7E0KmIRFSNYkPDuH
dxeS00N3ppb0JpLWrMmtkZEy5GB2rA2mRbMSO0yPGaZVAgrT7VxE4vtYY2y+
wwhGKAunKYSrD7UQYXPZDJaLcKRS1wYnOTLzLlt2FuPbMcYgEOdy7qYAR4eM
KRDxRPijPDoElkmaWWFMri/+DbIrWf9kvEhfw9A0EpOgVIfDfbc2CkE1VvTN
lnC79SxSIlu/R8Bqm7WgwyBw8R4mgfZAi/tZB6iykSmiceVXeyHjqBU9bT0E
82pwMQKWFdSjQzmrkQn52mpat+DFSNsYaKdK6+6xILQCBeVDwhZWKk+4AIVg
AiACVvK6wlIcUprinY0Kp+fCSn2u6nNgJJssS5OhWoTFsI6E74vkmxz9cHh8
fEbnRVegdFA6+uH05dmFHYNp5TR49zT+7ql79+K2DE2N53v0wvm+LnIhouH5
WzpXM/752/gE8LnMcBHKaWyPmWPfMraveaFmtHo/MkSm+jY+07c8keou0jeb
sV/Y+0rKMJDUdZOa/TJnErx5UMlWfLXNiKZH9PIpoo/t+uJJnCpuKSi0GB/w
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
N+g662PRa4iQux9ChOy27X8w2Aw24z96HzP+B7AtkxU+OTZtDV5RQzDXVsP0
Oxhzp7D6HeyGm13lRXU1YRP+n2AuzFsZP3yIlDB+uOdM+Q8fwp/vMBPoGLs6
cCt6bHKgViKcd9Pkl2CPnrwoZ+X1HeUQvTo+feCVlV5WGXWpkh4Mpl7pEsu8
k+thIXXe6fXD2W16R5U26em2huWm3V0Idm5Q9ilwC74yxt+4zm5cS/WAKqCO
4QnM5aJlbZobfXPXfvkmx5yhrJiUpuoyLuno7FkdPlNn8xS7iHB94wxbA9lM
mTpbrhZ12zJpmMMp9XPkXmPSxk21fJTuLLSpo1la5Ve56vySuFbcmDMVgwQj
yZQbZvjNNeh7bnWRw8le5W9N58o55vdQkhN1NkwOJ6+L8hYbnXCPB0SYlD+b
ZvQZ4tqqYC9SNhW/D3ZYKasam3BNMup8gq25Xic//vjj0U2F6U9pkRzO6//6
33X9Dhu14Bdphd1fkq+xJm1RmI/P8tdwjMl3//W/rmerYmo+/td8npxPbtKU
P8HFw6ff/tf/AuxKzrMZfJBV76RFylL6cM55E5QzmWVTrFIvLhukfFsX12sf
comuG0wKhE1IxVLOffvTsxcvXv7p0JYoPsoQY8cvsJUBQPFv2EIH0Obi2fnJ
0e/oKUmY+27/4f5D+8j5s2+enY+/K+Fi2f4WFr9M0usqoyNIvnyy//TJPnZa
B46cXM1WV1cb/z861459PM8BAA==

-->

</rfc>
