<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 3.2.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-corneo-schc-compress-payload-01" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title>SCHC Payload compression</title>
    <seriesInfo name="Internet-Draft" value="draft-corneo-schc-compress-payload-01"/>
    <author initials="L." surname="Corneo" fullname="Lorenzo Corneo">
      <organization>Ericsson</organization>
      <address>
        <email>lorenzo.corneo@ericsson.com</email>
      </address>
    </author>
    <author initials="E." surname="Ramos" fullname="Edgar Ramos">
      <organization>Ericsson</organization>
      <address>
        <email>edgar.ramos@ericsson.com</email>
      </address>
    </author>
    <author initials="J." surname="Jimenez" fullname="Jaime Jimenez">
      <organization>Ericsson</organization>
      <address>
        <email>jaime.jimenez@ericsson.com</email>
      </address>
    </author>
    <date year="2026" month="January" day="22"/>
    <area>Applications</area>
    <workgroup>SCHC Working Group</workgroup>
    <abstract>
      <?line 40?>

<t>This document describes several techniques to enable utilization of the same engine to compress and decompress headers from the existing SCHC framework <xref target="RFC8724"/>, but used to compress payload of specific protocols. The first approach is to introduce new type of static rules that enable encoding application data. This extensions provides compact and generic variation on how data is organized. The second approach provides dynamic compression and decompression. Here, the system identifies parts of the payload that can be compressed, and enables a SCHC decompressor to restore the original packet.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-corneo-schc-compress-payload/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        schc Working Group mailing list (<eref target="mailto:schc@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/schc/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/schc/"/>.
      </t>
    </note>
  </front>
  <middle>
    <?line 44?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The main purpose of this document is to describe methods that enable the reduction of the size of the payloads by utilizing the same compression and decompression machinery provided by the SCHC framework <xref target="RFC8724"/>. Utilizing additional steps or introducing new rules, the available SCHC machinery can be reused in IoT devices to also provide compression of the payload.</t>
      <t>For the static approach, the introduction of new type of rules that are suitable for the protocols that utilize certain type of time series serialization where certain values can be compressed based on the names, metadata related to each record, value type and base values. By utilizing the compression residue, the variable parts of the fields can be managed.</t>
      <t>The dynamic approach is to produce a context that is customized with rules for the type of values that are expected to be delivered by the devices that utilize key-value based data, e.g., JSON <xref target="RFC8259"/>, to generate a dictionary that can be later used to encode the data. This is done by inspecting the values that the devices produces by a fix amount of time, and then mapping some of the values to much smaller values that represent the data sent by the device. This reduce the transmission time and hence also the energy required for the transmission.</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 <xref target="BCP14"/> (<xref target="RFC2119"/>) (<xref target="RFC8174"/>) when, and only when, they
appear in all capitals, as shown here.</t>
        <?line -18?>

<t>This specification requires readers to be familiar with the terms and concepts that are discussed in <xref target="RFC7252"/>.</t>
        <t>Template-based compression: Payload compresion utilizing a pre-shared model that only requires the values that are changing in the payload.</t>
        <t>Common indicator: The common idicators provide a way to compress values that are not necessary to be exact or the value can be dtermined by the decompressor.</t>
      </section>
    </section>
    <section anchor="template-based-payload-compression-utilizing-a-static-context">
      <name>Template-based payload compression utilizing a static context</name>
      <t>This section introduces a templated method for enhancing the compression of time series sensor data, such as SenML <xref target="RFC8428"/>, by utilizing a template-based approach within the context rules. By employing a template-based strategy, it becomes possible to reconstruct the data structure (e.g., SenML or JSON payload) without the necessity of transmitting the structure with each payload. The examples use JSON representation, but CBOR <xref target="RFC8949"/> representation can be used in practice to achieve smaller template (and hence rule) size.</t>
      <section anchor="case-fixed-records">
        <name>Fixed number of records</name>
        <t>When a system is transmitting in the payload the same number of records, the following optimizations can be utilized. As shown on <xref target="fig-1"/> entity with SenML base name (<tt>bn</tt>) <tt>"dev1.example.com/"</tt> sends two values periodically – one temperature value (<tt>"temp"</tt> with value <tt>20</tt>), and one humidity value (<tt>"hum"</tt> with value <tt>40</tt>). It encodes the values in one SenML Pack consisting of two SenML uncompressed Records:</t>
        <figure anchor="fig-1">
          <name>SenML Pack with two SenML Records.</name>
          <artwork><![CDATA[
[
  {
    "bn": "dev1.example.com/",
    "n": "temp",
    "v": 20
  },
  {
    "n": "hum",
    "v": 40
  }
]
]]></artwork>
        </figure>
        <t>A template with compression/decompression rules can be used to reduce the size of the above payload. For instance, variable values are replaced with <tt>$n</tt> placeholders, where <tt>n</tt> represents the position of the field value in the compression residue. Applying the template to the above example will then look as follows:</t>
        <artwork><![CDATA[
[
  {
    "bn": "dev1.example.com/",
    "n": "temp",
    "v": "$1"
  },
  {
    "n": "hum",
    "v": "$2"
  }
]
]]></artwork>
        <!-- {: #fig-2 title="SenML Pack with two SenML Records that use a compression/decompression template."} -->

<t>In this case, upon applying the rule, the compression residue includes exactly two values. The result of the decompression is exactly one SenML Pack with two SenML records.</t>
      </section>
      <section anchor="case-varying-records">
        <name>Varying number of compression residue values</name>
        <t>In some cases, the payload may include values referring to different resource paths, and the number of such measurements may not be known in advance. Furthermore, the measurements may be performed at different times, but sent together in one payload. For instance, the example below shows a payload with multiple temperature and humidity measurements.</t>
        <artwork><![CDATA[
[
  {
    "n": "dev1.example.com/temp",
    "v": 20,
    "bt": 1696231409
  },
  {
    "n": "dev1.example.com/hum",
    "v": 40
  },
  {
    "n": "dev1.example.com/temp",
    "v": 22,
    "bt": 1696231410
  },
  {
    "n": "dev1.example.com/hum",
    "v": 44
  }
]
]]></artwork>
        <!-- {: #fig-3 title="SenML Record with varying number of SenML Packs."} -->

<t>The template for the compression-decompression rule would look as follows:</t>
        <figure anchor="fig-4">
          <name>SenML Pack with varying number of SenML Records that use compression-decompression template.</name>
          <artwork><![CDATA[
[
  $repeat(
    {
      "n": "dev1.example.com/temp",
      "v": "$1",
      "bt": "$3"
    },
    {
      "n": "dev1.example.com/hum",
      "v": "$2"
    }
  )
]
]]></artwork>
        </figure>
        <t>The <tt>$repeat()</tt> command means that the two records for <tt>"temp"</tt> and <tt>"hum"</tt> readings are repeated and the first record contains a time value that applies to both records. The compression residue would contain a list of triplets with the measurement values for both, followed by the time stamp. The two records are repeated in the decompressed version as many times as there are triplets in the compression residue, i.e., if compression residue contains three values, the decompressed format will include one SenML Pack with two SenML Records. If the compression residue contains six values, the decompressed format will include one SenML Pack with four SenML Records, and so on.</t>
        <t>The decompressor is aware of the <tt>$repeat()</tt> syntax, thus can generate valid JSON by, for example, adding commas between records or valid CBOR/EXI with proper record delimiters, instead of simply repeating the template string given as the parameter. Note that the template mechanism from <xref target="case-fixed-records"/> can be used in the case of <xref target="case-varying-records"/> on <xref target="fig-4"/> as well, but with the <tt>$repeat()</tt> command, the size of the rule becomes smaller and allows for multiple residue values to be sent, which is especially useful if the number of measurements can vary or is not a priori.</t>
      </section>
      <section anchor="additional-operations-for-improved-compression">
        <name>Additional operations for improved compression</name>
        <t>To achieve further compression, the use of absolute timestamps (since epoch) or absolute measurement value may be undesirable and relative timestamps / values might be preferable. To achieve this, the epoch (or base) value needs to be established. The following sections provide different mechanisms through which the epoch / base values can be defined in the template.</t>
        <section anchor="base-value-defined-in-the-template">
          <name>Base value defined in the template</name>
          <t>In this case, the base value is defined in the template with a <tt>"relValue"</tt> keyword in the placeholder. Using the example from <xref target="fig-4"/>, the template can be updated to the following:</t>
          <!-- LC: This is not JSON compliant -->
<!-- JJ: Is this meant to be JSON? You cannot add embedded function calls in JSON-->
<!-- DISCUSS -->

<artwork><![CDATA[
[
  $repeat(
    {
      "n": "dev1.example.com/temp",
      "v": $1(relValue:20),
      "bt": $3(relValue:1696231409)
    },
    {
      "n": "dev1.example.com/hum",
      "v": $2(relValue:40)
    }
  )
]
]]></artwork>
          <!-- {: #fig-5 title="Figure 5. SenML Pack with two SenML Records using compression-decompression template with relValue keyword."} -->

<t>Based on the above template, the compression residue values would be relative to the values specified in the template.</t>
          <!-- JJ: I think this next subsection should be removed.-->
<!-- ### Look up from external resource -->

<!-- In {{case-fixed-records}}, the relative values are static. If the relative values change, the rule would need to be updated. This may be undesirable if the relative value changes often (“often” is subjective – it could be every hour, every day, every month). In such cases, it may be desirable to look up the relative value from an external resource periodically. -->

<!-- A “relValueExternal” keyword is defined which includes a URL to the external resource along with a periodicity of how often to lookup and update the value. -->

<!-- As an example: `relValueExternal:[https://externalUrl.com/relValue, 60s]`. -->
<!-- In the above example, the compressor looks up the external resource every time the 60 second timer expires. The time field can be expressed in seconds, minutes, hours, days and years. -->
<!-- The URL can also point to a resource on the device itself to avoid external lookups. A protocol outside of the SCHC framework would be then used to update the resource -->

</section>
        <section anchor="case-base-indicators">
          <name>Base value based on common indicators</name>
          <ul spacing="normal">
            <li>
              <t>Timestamps</t>
            </li>
            <li>
              <t>Environmental knowledge</t>
            </li>
          </ul>
          <t>In some cases, a shared context can be established without specifying exact relative values. In the 
case of timestamps, a <tt>relTime:x</tt> attribute is proposed, where <tt>x</tt> can be "m" (minute), "h" (hour), "d" (day), "M" (month) and "Y" (year). Hence, without specifying an absolute value, the compressor can send the time relative to the "top of" the minute, hour, day, month, or year. In this way, the neither the rules need to be updated nor a lookup needs to be performed.</t>
          <t>In other cases, the shared context can be established through environment conditions. For example, in the case of temperature and humidity, it can be defined that the base value in summer for temperature is 20 and humidity is 60 and in winter the base value is 0 and humidity 10. Such context is established outside the SCHC template but can be expressed in the template using the notation <tt>relContext:x</tt> where <tt>x</tt> can mean anything. For instance, <tt>x</tt> could be "season" using the example above and, when the switch between summer and winter occurs, it is treated as context specific and not expressed in the template.</t>
        </section>
        <section anchor="case-variable-length">
          <name>Variable-length and fixed-length residue values.</name>
          <t>SCHC <xref target="RFC8724"/> describes mechanisms for handling both fixed and variable length residue fields. Fixed length fields are specified in the <tt>FL</tt> field of the rule, whereas the varying length-fields are specified such that the compression residue includes the field length and the value.</t>
          <t>The use of varying length fields for the values and the field length needs to be usually included within the residue. However, it may be undesirable to include the field length for static cases. Hence, a <tt>fl:x</tt> template convention is proposed, e.g., <tt>$1(fl:16)</tt> which indicates that the length of the <tt>$1</tt> is always 16 bits. Hence the draft supports compression even in the case of fixed length field. The special case of all fields using the same length can be handled by indicating that length in the <tt>FL</tt> field.</t>
        </section>
        <section anchor="mapping-the-template-approach-to-the-schc-cd-context">
          <name>Mapping the template-approach to the SCHC C/D Context</name>
          <t>Rules in SCHC are described using the Compression/Decompression Context using the format (and terminology) based on the diagram in Figure 6 of <xref section="7.1" sectionFormat="of" target="RFC8724"/>).</t>
          <t>This section describes the values for the C/D context when using the template-based approach.</t>
          <dl newline="true">
            <dt>FID:</dt>
            <dd>
              <t>A new Field ID called "StructuredAppData" is introduced to indicate that the compression/decompression is being performed on the data / payload.</t>
            </dd>
            <dt>FL:</dt>
            <dd>
              <t>If all compression residue values are of same length (e.g., 4 bits), this field contains the bit length. Otherwise, this field contains value 0 indicating that variable-length values are used in the compression residue.</t>
            </dd>
            <dt>FP:</dt>
            <dd>
              <t>set to 1 (default)</t>
            </dd>
            <dt>DI:</dt>
            <dd>
              <t>As per the current spec (i.e., it can be Up, Dw, or Bi).</t>
            </dd>
            <dt>Target Value (TV):</dt>
            <dd>
              <t>The Target Value is where the template itself is defined.</t>
            </dd>
            <dt>Matching Operator (MO):</dt>
            <dd>
              <t>A new MO called "template" is introduced to indicate that the compressor/decompressor should follow template based matching operations.</t>
            </dd>
            <dt>Compression/Decompression Action (CDA):</dt>
            <dd>
              <t>A new action called "template" is introduced. The compressor sends all the values (as described in examples above) and the decompressor reconstructs the original payload but replacing the <tt>$x</tt> placeholders (and expanding the other operations such as <tt>$repeat</tt>, etc.).</t>
            </dd>
          </dl>
        </section>
      </section>
    </section>
    <section anchor="dynamic-payload">
      <name>Dynamic compression of Payload</name>
      <t>The dynamic payload compression requires a new SCHC context that is updated to the compressor after inspecting packets' payloads. This can be done in three phases where the first phase collects statistics about the payload, the second phase identifies the payload fields that may be compressed, and the third phase generates a new SCHC context with rules targeting such fields. This dynamic compression is intended to work with key-value based payload (e.g., JSON).</t>
      <t>The SenML Record below is the reference payload for the whole section.</t>
      <figure anchor="fig-9">
        <name>Reference example of IoT payload in SenML format.</name>
        <artwork><![CDATA[
[
  {
    "bn": "2001:db8:1234:5678::1/",
    "n": "temperature",
    "u": "Cel",
    "v": 25.2
  },
  {
    "n": "humidity",
    "u": "%RH",
    "v": 30
  }
]
]]></artwork>
      </figure>
      <section anchor="payload-analysis">
        <name>Payload analysis</name>
        <t>In the first phase, the decompressor inspects the payload carried through the SCHC packet. All the keys and values of the key-value pairs are stored in a map-like, or list-like, data structure. For example, if the payload contains the key-value pair <tt>{"n": "temperature"}</tt> the associated data structure may be a 'map' or a 'list'.</t>
        <dl newline="true">
          <dt>map:</dt>
          <dd>
            <t>Below is an example of a map-like data structure that records each key-value pair from the payload along with the count of how many times each key or value appears, e.g., <tt>{"n": 1, "temperature": 1}</tt>.</t>
          </dd>
          <dt>list:</dt>
          <dd>
            <t>Alternatively, a list-like data structure can be used to store only the keys and values from the payload's key-value pairs, such as <tt>["n", "temperature"]</tt>.</t>
          </dd>
        </dl>
        <t>Additional methods for storing payload information may be used, e.g., a timestamp of the received payload. The information recorder in this phase mainly depends on the selection of the fields that are going to be compressed.</t>
      </section>
      <section anchor="field-selection">
        <name>Fields selection</name>
        <t>After payload analysis on <xref target="payload-analysis"/>, the decompressor entity manipulates the data structure to create an unique key for each value.</t>
        <t>The key creation mechanism involves encoding different pieces of information in a structured format. This is achieved by separating components with a special character, such as a dot. For instance, consider the format <tt>info1.info2</tt>.</t>
        <t>The segment before the dot represents a standard content type, such as <tt>application/json+senml</tt>. The segment after the dot includes the name of the payload field, which is the key in a key-value pair, followed by a unique identifier number, like <tt>n1</tt>, to ensure uniqueness. Consequently, a key might be formatted as <tt>application/senml+json.n1</tt>.</t>
        <t>This structured key informs the decompressor entity that: (i) the payload is compressed using JSON-encoded SenML, (ii) each field should be decompressed into a "key": "value" format, (iii) fields sharing the same numeric identifier, such as <tt>n1</tt>, should be enclosed within curly brackets, and (iv) the entire structure should be wrapped in square brackets (as per <xref target="RFC8428"/>).</t>
        <section anchor="compression-triggers">
          <name>Compression triggers</name>
          <t>The criteria for compressing key-value pairs can differ based on specific use cases. This section outlines some triggers that determine whether a key-value pair should be compressed, such as:</t>
          <dl newline="true">
            <dt>Number of occurrences:</dt>
            <dd>
              <t>A counter keeps track of how many instances of a specific key-value pair have been received in adjacent messages. The payload compression may be configured to trigger compression for all the key-value pairs that have been sent at least 5 times in adjacent messages.</t>
            </dd>
            <dt>Key length:</dt>
            <dd>
              <t>The internal state of the decompressor entity keeps track of the length of the key-value pairs and, based on a predefined threshold, e.g., 100 bytes, decides on whether the pair is to be compressed or not.</t>
            </dd>
            <dt>Complex triggers:</dt>
            <dd>
              <t>A condition accounting for multiple variables can be defined; for example, a timer after which all the key-value pairs have appeared in the payload more than 5 times are to be selected for compression.</t>
            </dd>
          </dl>
        </section>
      </section>
      <section anchor="context-generation">
        <name>SCHC context generation</name>
        <t>Following the field selection process in <xref target="field-selection"/>, the decompressor <bcp14>SHALL</bcp14> generate a SCHC context with rules targeting the selected key-value pairs. For each pair, the decompressor <bcp14>SHALL</bcp14> select SCHC rule fields that align with its policies, such as minimizing payload length and using the CDA "elide" where applicable.</t>
        <t>While payload size reduction is a common goal, other objectives, such as incorporating redundancy to reduce transmission errors, <bcp14>MAY</bcp14> also be considered.</t>
        <!-- {{dynamic-example}} shows a verbose payload being reduced from 118 bytes to 21 bytes using CBOR encoding and a dictionary-based compression method. -->

</section>
      <section anchor="generate-schc-payload-compression-rules">
        <name>Generate SCHC payload compression rules</name>
        <t>The server produces SCHC payload compression rules like the ones showed in <xref target="fig-5"/>. In SenML, JSON, and key-value data structures at large, only two fields can be directly mapped to a SCHC rule, namely, FID (the key) and TV (the target value). However, a SCHC rule is composed by 7 to 9 fields. Such fields are populated according to specific needs of the client. As an example, the configuration may be set to operate in a way to minimize the transmitted payload, rather than minimize the overhead of storing the SCHC context for each client. Next, it is explained an example of how the SCHC payload rules generation could be implemented. Rules can be mapped as following:</t>
        <dl newline="true">
          <dt>FID (Field Identifier):</dt>
          <dd>
            <t>The Field Identifier (FID) can be directly derived from the keys shown in <xref target="fig-5"/>, such as <tt>application/json+senml.v.1</tt>. In this example, the key's structure carries semantics. The segment before the delimiter character specifies the payload's content type, guiding the decompressor on how to handle the compressed key-value pair. The segment after the delimiter includes the key's name in the key-value pair, followed by a number that groups related fields. For instance, FIDs with the number 1, like <tt>n.1</tt>, <tt>u.1</tt>, and <tt>v.1</tt>, are part of the same SenML record and will be enclosed in curly brackets.</t>
          </dd>
          <dt>FL (Field Length):</dt>
          <dd>
            <t>The FL is computed by the system evaluating the size of the value to compress.</t>
          </dd>
          <dt>FP (Field Position):</dt>
          <dd>
            <t>In the case of SenML, the FP is not useful, meaning that the placement of the field would mostly follow the same pattern. However, if for any specific reason the position of the field is of relevance, this field can be used.</t>
          </dd>
          <dt>DI (Direction):</dt>
          <dd>
            <t>The DI expresses whether the field for compression/decompression appears at upstream or downstream. In the case of IoT scenarios, the direction is almost always upstream since it is critical to reduce transmission time to extend as much as possible devices' battery life.</t>
          </dd>
          <dt>TV (Target Value):</dt>
          <dd>
            <t>The TV is the value on which to perform the Matching Operation (MO). Essentially, it is the value, or part of the value, to be compressed.</t>
          </dd>
          <dt>MO (Matching Operator):</dt>
          <dd>
            <t>The MO is the operation that is applied to every payload value and, when there is a match between such value and the TV, a de/compression action (CDA) will be applied. In a nutshell, if there is a match, the payload value will be de/compressed.</t>
          </dd>
          <dt>CDA (Compression/Decompression Action):</dt>
          <dd>
            <t>This is the action to be taken to the payload value in case of matching with the TV. Common actions are not-sent (the value will be omitted in the sent payload), value-sent (the value will be sent), L(ess)S(significant)B(it) (only the least significant part of the payload value will be sent).</t>
          </dd>
        </dl>
        <t>Example:</t>
        <figure anchor="fig-5">
          <name>Example of SCHC rule generated in the dynamic payload compression approach.</name>
          <artwork><![CDATA[
{
  "ruleID": 12,
  "ruleLength": 4,
  "compression": [
    {
      "FID": "application/senml+json.bn.1",
      "FL": 22,
      "FP": 1,
      "DI": "Up",
      "TV": "2001:db8:1234:5678::1/",
      "MO": "equal",
      "CDA": "not-sent"
    },
    {
      "FID": "application/senml+json.n.1",
      "FL": 11,
      "FP": 2,
      "DI": "Up",
      "TV": "temperature",
      "MO": "MSB",
      "MOa": "10",
      "CDA": "LSB"
    },
    {
      "FID": "application/senml+json.n.2",
      "FL": 8,
      "FP": 3,
      "DI": "Up",
      "TV": "humidity",
      "MO": "MSB",
      "MOa": "7",
      "CDA": "LSB"
    },
    {
      "FID": "application/senml+json.u.1",
      "FL": 3,
      "FP": 4,
      "DI": "Up",
      "TV": "Cel",
      "MO": "equal",
      "CDA": "not-sent"
    },
    {
      "FID": "application/senml+json.u.2",
      "FL": 33,
      "FP": 5,
      "DI": "Up",
      "TV": "%RA",
      "MO": "equal",
      "CDA": "not-sent"
    },
    {
      "FID": "application/senml+json.v.1",
      "FL": 4,
      "FP": 6,
      "DI": "Up",
      "TV": "",
      "MO": "ignore",
      "CDA": "value-sent"
    },
    {
      "FID": "application/senml+json.v.2",
      "FL": 4,
      "FP": 7,
      "DI": "Up",
      "TV": "",
      "MO": "ignore",
      "CDA": "value-sent"
    }
  ]
}
]]></artwork>
        </figure>
        <t>In the above rule, the fields <tt>application/senml+json.u.1/2</tt> are never sent because are known a-priori and will probably never change (a temperature sensor will always return Celsius or Fahrenheit). Fields <tt>application/senml+json.n.1/2</tt> are shortened only to their last character due to MSB and LSB, e.g., <tt>e</tt> and <tt>y</tt>. Finally, <tt>application/senml+json.v.1/2</tt>, are ignored by the compressor and will be sent without compression, given that they may change. After the dynamic payload compression, the transmitted payload may look as follows:</t>
        <artwork><![CDATA[
0x0C657941C9999A0000001E
]]></artwork>
        <t>In the above example, <tt>0C</tt> is the hexadecimal representation of 12, which indicates that whatever follows is compressed according to rule 12. That is, the SenML base name, <tt>2001:db8:1234:5678::1/</tt>, is omitted. Then, the last letter of the names is compressed, namely, <tt>65</tt> and <tt>79</tt>, representing ASCII for <tt>e</tt> (from temperatur<tt>e</tt>) and <tt>y</tt> (from humidit<tt>y</tt>). Moreover, the measurement units <tt>Cel</tt> and <tt>%RH</tt> are omitted (not-sent CDA applies). Finally, the remaining values are encoded as 4 bytes.</t>
        <section anchor="encoding-decompression-hints-in-fid">
          <name>Encoding decompression hints in FID</name>
          <t>This section describes how to manipulate the FID field so to provide hints to the decompressor on how to reconstruct the original payload.</t>
          <t>As an example, the content-type of the payload, the name of the field associated with the value, and a group identifier may be encoded in the FID. It is possible to separate these pieces of information using a delimiter, e.g., a single character such as a dot. For example, the left part of the first dot is a standard content type, e.g., <tt>application/json+senml</tt>, while the right part of the first dot, the name of the payload field followed by a number used to group fields together, e.g., <tt>n.1</tt>. As a result, the name of such a key would be <tt>application/senml+json.n.1</tt>.</t>
          <t>This way, the decompressor knows that the compressed payload is of SenML type encoded in JSON, thus knows that every field must be decompressed as "key": "value", every field with the same numeric identifier, e.g., <tt>n.1</tt>, <tt>u.1</tt> and <tt>v.1</tt>, enclosed by curly brackets, and finally everything enclosed into square brackets, as per SenML encoding. More generally, the hints for the decompressor are encoded as: <tt>&lt;content-type&gt;.&lt;key&gt;.&lt;group-number&gt;</tt></t>
        </section>
        <section anchor="decompression-of-schc-compressed-payload">
          <name>Decompression of SCHC compressed payload</name>
          <t>The SCHC decompressor starts by reading the first byte, <tt>0C</tt>, which indicates the SCHC RuleID, 12. It retrieves and applies the rules sequentially. The first rule, <tt>application/senml+json.bn.1</tt>, has a CDA of not-sent, meaning the bn value was omitted during compression and must be added back. The decompressor reconstructs this as <tt>"bn": "2001:db8:1234:5678::1/"</tt>.</t>
          <t>Next, for the rule <tt>application/senml+json.n.1</tt>, the decompressor identifies an MSB CDA, indicating a 1-byte value was added during compression. It retrieves <tt>0x65</tt> (representing "E") and appends it to the target value, forming the JSON pair: <tt>"n": "temperature"</tt>. This process is repeated for the remaining existing rules.</t>
          <t>The decompressor must know the payload's content-type to accurately reconstruct the packet. While this example uses SenML JSON, other formats like YAML or XML can also be supported for greater flexibility.</t>
        </section>
      </section>
      <section anchor="analysis-of-payload-data-and-selection-of-values-to-compress">
        <name>Analysis of payload data and selection of values to compress</name>
        <t>There may be several ways to build the compression map exchanged between the server and the client. This section provides one such instance based on a threshold. That is, when a value is repeated more than a predefined number of times (3 in this particular example), it is considered redundant and will be compressed. More elaborated techniques may be used, e.g., size of a value.</t>
        <t>The server inspects the payload sent from the devices. For every message, in key-value formats, e.g., JSON, the server counts the occurrences of each value. Considering the payload from the example above, after receiving the payload for the first time, the server produces such map:</t>
        <artwork><![CDATA[
{
  "2001:db8:1234:5678::1/temperature": 1,
  "2001:db8:1234:5678::1/humidity": 1,
  "Cel": 1,
  25.2: 1,
  "%RH": 1,
  30: 1
}
]]></artwork>
        <t>The above map counts how many times a particular value has been sent as payload. For example, after 3 iterations the map may look as follows:</t>
        <artwork><![CDATA[
{
  "2001:db8:1234:5678::1/temperature": 3,
  "2001:db8:1234:5678::1/humidity": 3,
  "Cel": 3,
  25.2: 1,
  25.1: 1,
  24.8: 1,
  "%RH": 3,
  30: 1,
  31: 1,
  35: 1
}
]]></artwork>
        <t>In the above map, the values of the temperature (25.2, 25.1, 24.8) and humidity (30, 31, 35) have changed over time, and their counter is set to 1. However, the sensor names and measurement units have not changed and their counter value increased to 3. At this point, the server detects that some values in the payload are redundant (sent more than 3 times) and could be compressed by assigning to them a single-digit character. As a result, the server builds and share with the client the following compression map:</t>
        <artwork><![CDATA[
{
  0: "2001:db8:1234:5678::1/temperature",
  1: "2001:db8:1234:5678::1/humidity",
  2: "Cel",
  3: "%RH",
}
]]></artwork>
      </section>
      <section anchor="updating-the-compression-map">
        <name>Updating the compression map</name>
        <t>When the server identifies another value to be redundant, the sender will send another compression map including only the new element (associated to a new unique number). Assuming that the temperature has been constant (25 Celsius) for the last three updates, the new map will look as follows:</t>
        <artwork><![CDATA[
{
  4: 25
}
]]></artwork>
        <t>If an element is no longer used, it can be removed from the compression map. For instance, if a sensor's name changes, the old name can be invalidated, allowing the client to free memory by deleting it. To remove the value <tt>2001:db8:1234:5678::1/temperature</tt> with ID 0, assign a negative value to the ID:</t>
        <artwork><![CDATA[
{
    0: -1
}
]]></artwork>
      </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>
  </middle>
  <back>
    <references anchor="sec-normative-references">
      <name>Normative References</name>
      <reference anchor="RFC8724">
        <front>
          <title>SCHC: Generic Framework for Static Context Header Compression and Fragmentation</title>
          <author fullname="A. Minaburo" initials="A." surname="Minaburo"/>
          <author fullname="L. Toutain" initials="L." surname="Toutain"/>
          <author fullname="C. Gomez" initials="C." surname="Gomez"/>
          <author fullname="D. Barthel" initials="D." surname="Barthel"/>
          <author fullname="JC. Zuniga" initials="JC." surname="Zuniga"/>
          <date month="April" year="2020"/>
          <abstract>
            <t>This document defines the Static Context Header Compression and fragmentation (SCHC) framework, which provides both a header compression mechanism and an optional fragmentation mechanism. SCHC has been designed with Low-Power Wide Area Networks (LPWANs) in mind.</t>
            <t>SCHC compression is based on a common static context stored both in the LPWAN device and in the network infrastructure side. This document defines a generic header compression mechanism and its application to compress IPv6/UDP headers.</t>
            <t>This document also specifies an optional fragmentation and reassembly mechanism. It can be used to support the IPv6 MTU requirement over the LPWAN technologies. Fragmentation is needed for IPv6 datagrams that, after SCHC compression or when such compression was not possible, still exceed the Layer 2 maximum payload size.</t>
            <t>The SCHC header compression and fragmentation mechanisms are independent of the specific LPWAN technology over which they are used. This document defines generic functionalities and offers flexibility with regard to parameter settings and mechanism choices. This document standardizes the exchange over the LPWAN between two SCHC entities. Settings and choices specific to a technology or a product are expected to be grouped into profiles, which are specified in other documents. Data models for the context and profiles are out of scope.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="8724"/>
        <seriesInfo name="DOI" value="10.17487/RFC8724"/>
      </reference>
      <reference anchor="RFC8428">
        <front>
          <title>Sensor Measurement Lists (SenML)</title>
          <author fullname="C. Jennings" initials="C." surname="Jennings"/>
          <author fullname="Z. Shelby" initials="Z." surname="Shelby"/>
          <author fullname="J. Arkko" initials="J." surname="Arkko"/>
          <author fullname="A. Keranen" initials="A." surname="Keranen"/>
          <author fullname="C. Bormann" initials="C." surname="Bormann"/>
          <date month="August" year="2018"/>
          <abstract>
            <t>This specification defines a format for representing simple sensor measurements and device parameters in Sensor Measurement Lists (SenML). Representations are defined in JavaScript Object Notation (JSON), Concise Binary Object Representation (CBOR), Extensible Markup Language (XML), and Efficient XML Interchange (EXI), which share the common SenML data model. A simple sensor, such as a temperature sensor, could use one of these media types in protocols such as HTTP or the Constrained Application Protocol (CoAP) to transport the measurements of the sensor or to be configured.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="8428"/>
        <seriesInfo name="DOI" value="10.17487/RFC8428"/>
      </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="RFC8259">
        <front>
          <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
          <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
          <date month="December" year="2017"/>
          <abstract>
            <t>JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format. It was derived from the ECMAScript Programming Language Standard. JSON defines a small set of formatting rules for the portable representation of structured data.</t>
            <t>This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t>
          </abstract>
        </front>
        <seriesInfo name="STD" value="90"/>
        <seriesInfo name="RFC" value="8259"/>
        <seriesInfo name="DOI" value="10.17487/RFC8259"/>
      </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>
      <referencegroup anchor="BCP14" target="https://www.rfc-editor.org/info/bcp14">
        <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/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>
      </referencegroup>
    </references>
    <?line 530?>

<section anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>A great token of appreciation to Rajat Kandoi and Ari Keränen for their support in the inception and review of this draft. Their ideas and thinking are also reflected in the text of the draft.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
XtqZNJS6ozO++BOuaZTW/wMADWgwC3AAAA==

-->

</rfc>
