<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 2.6.10) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

<!ENTITY SELF "[RFC-XXXX]">
]>


<rfc ipr="trust200902" docName="draft-corneo-schc-compress-payload-00" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title>SCHC Payload compression</title>

    <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="2025" month="June" day="25"/>

    <area>Applications</area>
    <workgroup>SCHC Working Group</workgroup>
    

    <abstract>


<?line 41?>

<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 title="About This Document" removeInRFC="true">
      <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 45?>

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

</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 (<spanx style="verb">bn</spanx>) <spanx style="verb">"dev1.example.com/"</spanx> sends two values periodically – one temperature value (<spanx style="verb">"temp"</spanx> with value <spanx style="verb">20</spanx>), and one humidity value (<spanx style="verb">"hum"</spanx> with value <spanx style="verb">40</spanx>). It encodes the values in one SenML Pack consisting of two SenML uncompressed Records:</t>

<figure title="SenML Pack with two SenML Records." anchor="fig-1"><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 <spanx style="verb">$n</spanx> placeholders, where <spanx style="verb">n</spanx> represents the position of the field value in the compression residue. Applying the template to the above example will then look as follows:</t>

<figure><artwork><![CDATA[
[
  {
    "bn": "dev1.example.com/",
    "n": "temp",
    "v": "$1"
  },
  {
    "n": "hum",
    "v": "$2"
  }
]
]]></artwork></figure>
<!-- {: #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>

<figure><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></figure>
<!-- {: #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 title="SenML Pack with varying number of SenML Records that use compression-decompression template." anchor="fig-4"><artwork><![CDATA[
[
  $repeat(
    {
      "n": "dev1.example.com/temp",
      "v": "$1",
      "bt": "$3"
    },
    {
      "n": "dev1.example.com/hum",
      "v": "$2"
    }
  )
]
]]></artwork></figure>

<t>The <spanx style="verb">$repeat()</spanx> command means that the two records for <spanx style="verb">"temp"</spanx> and <spanx style="verb">"hum"</spanx> 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 <spanx style="verb">$repeat()</spanx> 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 <spanx style="verb">$repeat()</spanx> 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 <spanx style="verb">"relValue"</spanx> 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 -->

<figure><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></figure>
<!-- {: #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>

<t><list style="symbols">
  <t>Timestamps</t>
  <t>Environmental knowledge</t>
</list></t>

<t>In some cases, a shared context can be established without specifying exact relative values. In the case of timestamps, a <spanx style="verb">relTime:x</spanx> attribute is proposed, where <spanx style="verb">x</spanx> 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 <spanx style="verb">relContext:x</spanx> where <spanx style="verb">x</spanx> can mean anything. For instance, <spanx style="verb">x</spanx> 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 <spanx style="verb">FL</spanx> 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 <spanx style="verb">fl:x</spanx> template convention is proposed, e.g., <spanx style="verb">$1(fl:16)</spanx> which indicates that the length of the <spanx style="verb">$1</spanx> is always 16 bits. Hence the invention 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 <spanx style="verb">FL</spanx> 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 <spanx style="verb">$x</spanx> placeholders (and expanding the other operations such as <spanx style="verb">$repeat</spanx>, 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 title="Reference example of IoT payload in SenML format." anchor="fig-9"><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 <spanx style="verb">{"n": "temperature"}</spanx> 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., <spanx style="verb">{"n": 1, "temperature": 1}</spanx>.</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 <spanx style="verb">["n", "temperature"]</spanx>.</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 <spanx style="verb">info1.info2</spanx>.</t>

<t>The segment before the dot represents a standard content type, such as <spanx style="verb">application/json+senml</spanx>. 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 <spanx style="verb">n1</spanx>, to ensure uniqueness. Consequently, a key might be formatted as <spanx style="verb">application/senml+json.n1</spanx>.</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 <spanx style="verb">n1</spanx>, 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 <spanx style="verb">application/json+senml.v.1</spanx>. 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 <spanx style="verb">n.1</spanx>, <spanx style="verb">u.1</spanx>, and <spanx style="verb">v.1</spanx>, 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 title="Example of SCHC rule generated in the dynamic payload compression approach." anchor="fig-5"><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 <spanx style="verb">application/senml+json.u.1/2</spanx> are never sent because are known a-priori and will probably never change (a temperature sensor will always return Celsius or Fahrenheit). Fields <spanx style="verb">application/senml+json.n.1/2</spanx> are shortened only to their last character due to MSB and LSB, e.g., <spanx style="verb">e</spanx> and <spanx style="verb">y</spanx>. Finally, <spanx style="verb">application/senml+json.v.1/2</spanx>, 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>

<figure><artwork><![CDATA[
0x0C657941C9999A0000001E
]]></artwork></figure>

<t>In the above example, <spanx style="verb">0C</spanx> is the hexadecimal representation of 12, which indicates that whatever follows is compressed according to rule 12. That is, the SenML base name, <spanx style="verb">2001:db8:1234:5678::1/</spanx>, is omitted. Then, the last letter of the names is compressed, namely, <spanx style="verb">65</spanx> and <spanx style="verb">79</spanx>, representing ASCII for <spanx style="verb">e</spanx> (from temperatur<spanx style="verb">e</spanx>) and <spanx style="verb">y</spanx> (from humidit<spanx style="verb">y</spanx>). Moreover, the measurement units <spanx style="verb">Cel</spanx> and <spanx style="verb">%RH</spanx> 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., <spanx style="verb">application/json+senml</spanx>, 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., <spanx style="verb">n.1</spanx>. As a result, the name of such a key would be <spanx style="verb">application/senml+json.n.1</spanx>.</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., <spanx style="verb">n.1</spanx>, <spanx style="verb">u.1</spanx> and <spanx style="verb">v.1</spanx>, 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: <spanx style="verb">&lt;content-type&gt;.&lt;key&gt;.&lt;group-number&gt;</spanx></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, <spanx style="verb">0C</spanx>, which indicates the SCHC RuleID, 12. It retrieves and applies the rules sequentially. The first rule, <spanx style="verb">application/senml+json.bn.1</spanx>, has a CDA of not-sent, meaning the bn value was omitted during compression and must be added back. The decompressor reconstructs this as <spanx style="verb">"bn": "2001:db8:1234:5678::1/"</spanx>.</t>

<t>Next, for the rule <spanx style="verb">application/senml+json.n.1</spanx>, the decompressor identifies an MSB CDA, indicating a 1-byte value was added during compression. It retrieves <spanx style="verb">0x65</spanx> (representing "E") and appends it to the target value, forming the JSON pair: <spanx style="verb">"n": "temperature"</spanx>. 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>

<figure><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></figure>

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

<figure><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></figure>

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

<figure><artwork><![CDATA[
{
  0: "2001:db8:1234:5678::1/temperature",
  1: "2001:db8:1234:5678::1/humidity",
  2: "Cel",
  3: "%RH",
}
]]></artwork></figure>

</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>

<figure><artwork><![CDATA[
{
  4: 25
}
]]></artwork></figure>

<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 <spanx style="verb">2001:db8:1234:5678::1/temperature</spanx> with ID 0, assign a negative value to the ID:</t>

<figure><artwork><![CDATA[
{
    0: -1
}
]]></artwork></figure>

</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 "&SELF;" with the RFC number of this specification and delete this paragraph.</t>

</section>


  </middle>

  <back>



    <references title='Normative References' anchor="sec-normative-references">



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

<section anchor="acknowledgements"><name>Acknowledgements</name>
<t>The authors would like to thank 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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
oHhpZ1JP6m7P+OzvuKZeWv8LZBrlc+RuAAA=

-->

</rfc>

