draft-ietf-lpwan-coap-static-context-hc-03.txt | draft-ietf-lpwan-coap-static-context-hc-04.txt | |||
---|---|---|---|---|
lpwan Working Group A. Minaburo | lpwan Working Group A. Minaburo | |||
Internet-Draft Acklio | Internet-Draft Acklio | |||
Intended status: Informational L. Toutain | Intended status: Informational L. Toutain | |||
Expires: September 5, 2018 Institut MINES TELECOM; IMT Atlantique | Expires: January 3, 2019 Institut MINES TELECOM; IMT Atlantique | |||
March 04, 2018 | R. Andreasen | |||
Universidad de Buenos Aires | ||||
July 02, 2018 | ||||
LPWAN Static Context Header Compression (SCHC) for CoAP | LPWAN Static Context Header Compression (SCHC) for CoAP | |||
draft-ietf-lpwan-coap-static-context-hc-03 | draft-ietf-lpwan-coap-static-context-hc-04 | |||
Abstract | Abstract | |||
This draft defines the way SCHC header compression can be applied to | This draft defines the way SCHC header compression can be applied to | |||
CoAP headers. CoAP header structure differs from IPv6 and UDP | CoAP headers. CoAP header structure differs from IPv6 and UDP | |||
protocols since the CoAP Header is flexible header with a variable | protocols since the CoAP | |||
number of options themself of a variable length. Another important | use a flexible header with a variable number of options themself of a | |||
difference is the asymmetry in the header information used for | variable length. Another important difference is the asymmetry in | |||
request and response messages. This draft takes into account the | the header format used in request and response messages. Most of the | |||
fact that a thing can play the role of a CoAP client, a CoAP client | compression mechanisms have been introduced in | |||
or both roles. | [I-D.ietf-lpwan-ipv6-static-context-hc], this document explains how | |||
to use the SCHC compression for CoAP. | ||||
Status of This Memo | Status of This Memo | |||
This Internet-Draft is submitted in full conformance with the | This Internet-Draft is submitted in full conformance with the | |||
provisions of BCP 78 and BCP 79. | provisions of BCP 78 and BCP 79. | |||
Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
Task Force (IETF). Note that other groups may also distribute | Task Force (IETF). Note that other groups may also distribute | |||
working documents as Internet-Drafts. The list of current Internet- | working documents as Internet-Drafts. The list of current Internet- | |||
Drafts is at https://datatracker.ietf.org/drafts/current/. | Drafts is at https://datatracker.ietf.org/drafts/current/. | |||
Internet-Drafts are draft documents valid for a maximum of six months | Internet-Drafts are draft documents valid for a maximum of six months | |||
and may be updated, replaced, or obsoleted by other documents at any | and may be updated, replaced, or obsoleted by other documents at any | |||
time. It is inappropriate to use Internet-Drafts as reference | time. It is inappropriate to use Internet-Drafts as reference | |||
material or to cite them other than as "work in progress." | material or to cite them other than as "work in progress." | |||
This Internet-Draft will expire on September 5, 2018. | This Internet-Draft will expire on January 3, 2019. | |||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2018 IETF Trust and the persons identified as the | Copyright (c) 2018 IETF Trust and the persons identified as the | |||
document authors. All rights reserved. | document authors. All rights reserved. | |||
This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
Provisions Relating to IETF Documents | Provisions Relating to IETF Documents | |||
(https://trustee.ietf.org/license-info) in effect on the date of | (https://trustee.ietf.org/license-info) in effect on the date of | |||
publication of this document. Please review these documents | publication of this document. Please review these documents | |||
carefully, as they describe your rights and restrictions with respect | carefully, as they describe your rights and restrictions with respect | |||
to this document. Code Components extracted from this document must | to this document. Code Components extracted from this document must | |||
include Simplified BSD License text as described in Section 4.e of | include Simplified BSD License text as described in Section 4.e of | |||
the Trust Legal Provisions and are provided without warranty as | the Trust Legal Provisions and are provided without warranty as | |||
described in the Simplified BSD License. | described in the Simplified BSD License. | |||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
2. CoAP Compressing . . . . . . . . . . . . . . . . . . . . . . 3 | 2. SCHC Compression Process . . . . . . . . . . . . . . . . . . 3 | |||
3. Compression of CoAP header fields . . . . . . . . . . . . . . 4 | 3. CoAP Compression with SCHC . . . . . . . . . . . . . . . . . 4 | |||
3.1. CoAP version field (2 bits) . . . . . . . . . . . . . . . 4 | 4. Compression of CoAP header fields . . . . . . . . . . . . . . 6 | |||
3.2. CoAP type field . . . . . . . . . . . . . . . . . . . . . 5 | 4.1. CoAP version field . . . . . . . . . . . . . . . . . . . 6 | |||
3.3. CoAP token length field . . . . . . . . . . . . . . . . . 5 | 4.2. CoAP type field . . . . . . . . . . . . . . . . . . . . . 6 | |||
3.4. CoAP code field . . . . . . . . . . . . . . . . . . . . . 6 | 4.3. CoAP code field . . . . . . . . . . . . . . . . . . . . . 6 | |||
3.5. CoAP Message ID field . . . . . . . . . . . . . . . . . . 8 | 4.4. CoAP Message ID field . . . . . . . . . . . . . . . . . . 6 | |||
3.6. CoAP Token field . . . . . . . . . . . . . . . . . . . . 9 | 4.5. CoAP Token fields . . . . . . . . . . . . . . . . . . . . 7 | |||
4. CoAP options . . . . . . . . . . . . . . . . . . . . . . . . 9 | 5. CoAP options . . . . . . . . . . . . . . . . . . . . . . . . 7 | |||
4.1. CoAP option Content-format field. . . . . . . . . . . . . 9 | 5.1. CoAP Content and Accept options. . . . . . . . . . . . . 7 | |||
4.2. CoAP option Accept field . . . . . . . . . . . . . . . . 10 | 5.2. CoAP option Max-Age field, CoAP option Uri-Host and Uri- | |||
4.3. CoAP option Max-Age field, CoAP option Uri-Host and Uri- | Port fields . . . . . . . . . . . . . . . . . . . . . . . 7 | |||
Port fields . . . . . . . . . . . . . . . . . . . . . . . 11 | 5.3. CoAP option Uri-Path and Uri-Query fields . . . . . . . . 8 | |||
5. CoAP option Uri-Path and Uri-Query fields . . . . . . . . . . 11 | 5.3.1. Variable length Uri-Path and Uri-Query . . . . . . . 8 | |||
5.1. CoAP option Proxy-URI and Proxy-Scheme fields . . . . . . 12 | 5.3.2. Variable number of path or query elements . . . . . . 9 | |||
5.2. CoAP option ETag, If-Match, If-None-Match, Location-Path | 5.4. CoAP option Size1, Size2, Proxy-URI and Proxy-Scheme | |||
and Location-Query fields . . . . . . . . . . . . . . . . 13 | fields . . . . . . . . . . . . . . . . . . . . . . . . . 9 | |||
6. Other RFCs . . . . . . . . . . . . . . . . . . . . . . . . . 13 | 5.5. CoAP option ETag, If-Match, If-None-Match, Location-Path | |||
6.1. Block . . . . . . . . . . . . . . . . . . . . . . . . . . 13 | and Location-Query fields . . . . . . . . . . . . . . . . 9 | |||
6.2. Observe . . . . . . . . . . . . . . . . . . . . . . . . . 13 | 6. Other RFCs . . . . . . . . . . . . . . . . . . . . . . . . . 9 | |||
6.3. No-Response . . . . . . . . . . . . . . . . . . . . . . . 13 | 6.1. Block . . . . . . . . . . . . . . . . . . . . . . . . . . 9 | |||
7. Protocol analysis . . . . . . . . . . . . . . . . . . . . . . 13 | 6.2. Observe . . . . . . . . . . . . . . . . . . . . . . . . . 10 | |||
8. Examples of CoAP header compression . . . . . . . . . . . . . 14 | 6.3. No-Response . . . . . . . . . . . . . . . . . . . . . . . 10 | |||
8.1. Mandatory header with CON message . . . . . . . . . . . . 14 | 6.4. Time Scale . . . . . . . . . . . . . . . . . . . . . . . 10 | |||
8.2. Complete exchange . . . . . . . . . . . . . . . . . . . . 16 | 6.5. OSCORE . . . . . . . . . . . . . . . . . . . . . . . . . 10 | |||
9. Normative References . . . . . . . . . . . . . . . . . . . . 17 | 7. Examples of CoAP header compression . . . . . . . . . . . . . 12 | |||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 18 | 7.1. Mandatory header with CON message . . . . . . . . . . . . 12 | |||
7.2. Complete exchange . . . . . . . . . . . . . . . . . . . . 13 | ||||
7.3. OSCORE Compression . . . . . . . . . . . . . . . . . . . 14 | ||||
7.4. Example OSCORE Compression . . . . . . . . . . . . . . . 17 | ||||
8. Normative References . . . . . . . . . . . . . . . . . . . . 22 | ||||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 22 | ||||
1. Introduction | 1. Introduction | |||
CoAP [rfc7252] is an implementation of the REST architecture for | CoAP [rfc7252] is an implementation of the REST architecture for | |||
constrained devices. A Gateway between CoAP and HTTP can be easily | constrained devices. Nevertheless, if limited, the size of a CoAP | |||
built since both protocols uses the same address space (URL), caching | header may be too large for LPWAN constraints and some compression | |||
mechanisms and methods. | may be needed to reduce the header size. | |||
Nevertheless, if limited, the size of a CoAP header may be too large | ||||
for LPWAN constraints and some compression may be needed to reduce | ||||
the header size. | ||||
[I-D.toutain-lpwan-ipv6-static-context-hc] defines a header | [I-D.ietf-lpwan-ipv6-static-context-hc] defines a header compression | |||
compression mechanism for LPWAN network based on a static context. | mechanism for LPWAN network based on a static context. The context | |||
The context is said static since the field description composing the | is said static since the field description composing the Rules and | |||
Rules and the context are not learned during the packet exchanges but | the context are not learned during the packet exchanges but are | |||
are previously defined. The context(s) is(are) known by both ends | previously defined. The context(s) is(are) known by both ends before | |||
before transmission. | transmission. | |||
A context is composed of a set of rules that are referenced by Rule | A context is composed of a set of rules that are referenced by Rule | |||
IDs (identifiers). A rule contains an ordered list of the fields | IDs (identifiers). A rule contains an ordered list of the fields | |||
descriptions containing a field ID (FID) and its position when | descriptions containing a field ID (FID), its length (FL) and its | |||
repeated, a direction indicator (DI) (upstream, downstream and | position (FP), a direction indicator (DI) (upstream, downstream and | |||
bidirectional) and some associated Target Values (TV) which are | bidirectional) and some associated Target Values (TV). Target Value | |||
expected in the message header. A Matching Operator (MO) is | indicates the value that can be expected. TV can also be a list of | |||
associated to each header field description. The rule is selected if | values. A Matching Operator (MO) is associated to each header field | |||
all the MOs fit the TVs. In that case, a Compression/Decompression | description. The rule is selected if all the MOs fit the TVs for all | |||
Action (CDA) associated to each field defines the link between the | fields. In that case, a Compression/Decompression Action (CDA) | |||
compressed and decompressed value for each of the header fields. | associated to each field defines the link between the compressed and | |||
decompressed value for each of the header fields. Compression | ||||
results mainly in 4 actions: send the field value, send nothing, send | ||||
less significant bits of a field, send an index. Values sent are | ||||
called Compression Residues and follows the rule ID. | ||||
This document describes how the rules can be applied to CoAP flows. | 2. SCHC Compression Process | |||
The SCHC Compression rules can be applied to CoAP flows. SCHC | ||||
Compression of the CoAP header may be done in conjunction with the | Compression of the CoAP header may be done in conjunction with the | |||
above layers or independantly. | above layers (IPv6/UDP) or independently. The SCHC adaptation layers | |||
as described in [I-D.ietf-lpwan-ipv6-static-context-hc] may be used | ||||
as as shown in the Figure 1. | ||||
2. CoAP Compressing | ^ +------------+ ^ +------------+ ^ +------------+ | |||
| | CoAP | | | CoAP | inner | | CoAP | | ||||
| +------------+ v +------------+ x | OSCORE | | ||||
| | UDP | | DTLS | outer | +------------+ | ||||
| +------------+ +------------+ | | UDP | | ||||
| | IPv6 | | UDP | | +------------+ | ||||
v +------------+ +------------+ | | IPv6 | | ||||
| IPv6 | v +------------+ | ||||
+------------+ | ||||
Figure 1: rule scope for CoAP | ||||
Figure 1 shows some examples for CoAP architecture and the SCHC | ||||
rule's scope. A rule can covers all headers from IPv6 to CoAP, SCHC | ||||
C/D is done in the device and at the LPWAN boundary. If an end-to- | ||||
end encryption mechanisms is used between the device and the | ||||
application. CoAP must be compressed independently of the other | ||||
layers. The rule ID and the compression residue are encrypted using | ||||
a mechanism such as DTLS. Only the other end can decipher the | ||||
information. | ||||
Layers below may also be compressed using other SCHC rules (this is | ||||
out of the scope of this document). OSCORE | ||||
[I-D.ietf-core-object-security] can also define 2 rules to compress | ||||
the CoAP message. A first rule focuses on the inner header and is | ||||
end to end, a second rule may compress the outer header and the layer | ||||
above. SCHC C/D for inner header is done by both ends, SCHC C/D for | ||||
outer header and other headers is done between the device and the | ||||
LPWAN boundary. | ||||
3. CoAP Compression with SCHC | ||||
CoAP differs from IPv6 and UDP protocols on the following aspects: | CoAP differs from IPv6 and UDP protocols on the following aspects: | |||
o IPv6 and UDP are symmetrical protocols. The same fields are found | o IPv6 and UDP are symmetrical protocols. The same fields are found | |||
in the request and in the response, only the location in the | in the request and in the response, only the location in the | |||
header may vary (e.g. source and destination fields). A CoAP | header may vary (e.g. source and destination fields). A CoAP | |||
request is different from a response. For example, the URI-path | request is different from a response. For example, the URI-path | |||
option is mandatory in the request and is not found in the | option is mandatory in the request and is not found in the | |||
response, a request may contain an Accept option and the response | response, a request may contain an Accept option and the response | |||
a Content-format option. | a Content option. | |||
Even when a field is "symmetric" (i.e. found in both directions) | [I-D.ietf-lpwan-ipv6-static-context-hc] defines the use of a | |||
the values carried are different. For instance the Type field | message direction (DI) when processing the rule which allows the | |||
will contain a CON value in the request and a ACK or RST value in | description of message header format in both directions. | |||
the response. Exploiting the asymmetry in compression will allow | ||||
to send no bit in the compressed request and a single bit in the | o Even when a field is "symmetric" (i.e. found in both directions) | |||
answer. Same behavior can be applied to the CoAP Code field (O.OX | the values carried in each direction are different. Combined with | |||
code are present in the request and Y.ZZ in the answer). | a matching list in the TV, this will allow to reduce the range of | |||
expected values in a particular direction and therefore reduce the | ||||
size of a compression residue. For instance, if a client sends | ||||
only CON request, the type can be elided by compression and the | ||||
answer may use one bit to carry either the ACK or RST type. Same | ||||
behavior can be applied to the CoAP Code field (0.0X code are | ||||
present in the request and Y.ZZ in the answer). The direction | ||||
allows to split in two parts the possible values for each | ||||
direction. | ||||
o In IPv6 and UDP header fields have a fixed size. In CoAP, Token | ||||
size may vary from 0 to 8 bytes, length is given by a field in the | ||||
header. More systematically, the CoAP options are described using | ||||
the Type-Length-Value. | ||||
[I-D.ietf-lpwan-ipv6-static-context-hc] offers the possibility to | ||||
define a function for the Field Length in the Field Description. | ||||
o In CoAP headers, a field can be duplicated several times, for | ||||
instances, elements of an URI (path or queries). The position | ||||
defined in a rule, associated to a Field ID, can be used to | ||||
identify the proper element. | ||||
[I-D.ietf-lpwan-ipv6-static-context-hc] allows a Field id to | ||||
appears several times in the rule, the Field Position (FP) removes | ||||
ambiguities for the matching operation. | ||||
o Field size defined in the CoAP protocol can be to large regarding | ||||
LPWAN traffic constraints. This is particularly true for the | ||||
message ID field or Token field. The use of MSB MO can be used to | ||||
reduce the information carried on LPWANs. | ||||
o CoAP also obeys to the client/server paradigm and the compression | o CoAP also obeys to the client/server paradigm and the compression | |||
rate can be different if the request is issued from an LPWAN node | rate can be different if the request is issued from an LPWAN node | |||
or from an non LPWAN device. For instance a Thing (ES) aware of | or from an non LPWAN device. For instance a Device (Dev) aware of | |||
LPWAN constraints can generate a 1 byte token, but a regular CoAP | LPWAN constraints can generate a 1 byte token, but a regular CoAP | |||
client will certainly send a larger token to the Thing. SCHC | client will certainly send a larger token to the Thing. SCHC | |||
compression will not modify the values to offer a better | compression will not modify the values to offer a better | |||
compression rate. Nevertheless a proxy placed before the | compression rate. Nevertheless a proxy placed before the | |||
compressor may change some field values to offer a better | compressor may change some field values to offer a better | |||
compression rate and maintain the necessary context for | compression rate and maintain the necessary context for | |||
interoperability with existing CoAP implementations. | interoperability with existing CoAP implementations. | |||
o In IPv6 and UDP header fields have a fixed size. In CoAP, Token | 4. Compression of CoAP header fields | |||
size may vary from 0 to 8 bytes, length is given by a field in the | ||||
header. More systematically, the CoAP options are described using | ||||
the Type-Length-Value. When applying SCHC header compression. | ||||
By sending compressed field information following the rule order, | ||||
SCHC offers a serialization/deserialization mechanism. Since a | ||||
field exists to indicate the token length there is no ambiguity. | ||||
For options, the rule indicates also the expected options found | ||||
the int CoAP header. Therefore only the length is needed to | ||||
recognize an option. The length will be sent using the same CoAP | ||||
encoding (size less than 12 are directly sent, higher values use | ||||
the escape mechanisms defined by [rfc7252]). Delta Type is | ||||
omitted, the value will be recovered by the decompressor. This | ||||
reduces the option length of 4, 12 or 20 bits regarding the | ||||
original size of the delta type encoding in the option. | ||||
o In CoAP headers a field can be duplicated several times, for | ||||
instances, elements of an URI (path or queries) or accepted | ||||
formats. The position defined in a rule, associated to a Field | ||||
ID, can be used to identify the proper element. | ||||
3. Compression of CoAP header fields | ||||
This section discusses of the compression of the different CoAP | This section discusses of the compression of the different CoAP | |||
header fields. These are just examples. The compression should take | header fields. | |||
into account the nature of the traffic and not only the field values. | ||||
Next chapter will define some compression rules for some common | ||||
exchanges. | ||||
3.1. CoAP version field (2 bits) | ||||
This field is bidirectional and can be elided during the SCHC | ||||
compression, since it always contains the same value. It appears | ||||
only in first position. | ||||
FID FL FP DI Value MO CDA Sent | ||||
ver 2 1 bi 1 equal not-sent | ||||
3.2. CoAP type field | ||||
This field can be managed bidirectionally or unidirectionally.Several | ||||
strategies can be applied to this field regarding the values used: | ||||
o If the ES is a client or a Server and non confirmable message are | ||||
used, the transmission of the Type field can be avoided: | ||||
* Pos is always 1, | ||||
* DI can either be "uplink" if the ES is a CoAP client or | ||||
"downlink" if the ES is a CoAP server, or "bidirectional" | ||||
* TV is set to the value, | ||||
* MO is set to "equal" | ||||
* CDA is set to "not-sent". | ||||
FID FL FP DI Target Value MO CDA Sent | ||||
type 2 1 bi NON equal not-sent | ||||
o If the ES is either a client or a Server and confirmable message | ||||
are used, the DI can be used to elide the type on the request and | ||||
compress it to 1 bit on the response. The example above shows the | ||||
rule for a ES acting as a client, directions need to be reversed | ||||
for a ES acting as a server. | ||||
FID FL FP DI TV MO CDA Sent | ||||
type 2 1 up CON equal not-sent | ||||
type 2 1 dw [ACK,RST] match-mapping mapping-sent [1] | ||||
o Otherwise if the ES is acting simultaneously as a client and a | ||||
server and the rule handle these two traffics, Type field must be | ||||
sent uncompressed. | ||||
FID FL FP DI TV MO CDA Sent | ||||
type 2 1 bi ignore send-value [2] | ||||
3.3. CoAP token length field | ||||
This field is bi-directional. | ||||
Several strategies can be applied to this field regarding the values: | ||||
o no token or a wellknown length, the transmission can be avoided. | ||||
A special care must be taken, if CON messages are acknowledged | ||||
with an empty ACK message. In that case the token is not always | ||||
present. | ||||
FID FL FP DI TV MO CDA Sent | ||||
TKL 4 1 bi value ignore send-value [4] | ||||
o If the length is changing from one message to an other, the Token | ||||
Length field must be sent. If the Token length can be limited, | ||||
then only the least significant bits have to be sent. The example | ||||
below allows values between 0 and 3. | ||||
FID FL FP DI TV MO CDA Sent | ||||
TKL 4 1 bi 0x0 MSB(2) LSB(2) [2] | ||||
o otherwise the field value has to be sent. | ||||
FID FL FP DI TV MO CDA Sent | ||||
TKL 4 1 bi ignore value-sent [4] | ||||
3.4. CoAP code field | ||||
This field is bidirectional, but compression can be enhanced using | ||||
DI. | ||||
The CoAP Code field defines a tricky way to ensure compatibility with | ||||
HTTP values. Nevertheless only 21 values are defined by [rfc7252] | ||||
compared to the 255 possible values. | ||||
+------+------------------------------+-----------+ | ||||
| Code | Description | Mapping | | ||||
+------+------------------------------+-----------+ | ||||
| 0.00 | | 0x00 | | ||||
| 0.01 | GET | 0x01 | | ||||
| 0.02 | POST | 0x02 | | ||||
| 0.03 | PUT | 0x03 | | ||||
| 0.04 | DELETE | 0x04 | | ||||
| 0.05 | FETCH | 0x05 | | ||||
| 0.06 | PATCH | 0x06 | | ||||
| 0.07 | iPATCH | 0x07 | | ||||
| 2.01 | Created | 0x08 | | ||||
| 2.02 | Deleted | 0x09 | | ||||
| 2.03 | Valid | 0x0A | | ||||
| 2.04 | Changed | 0x0B | | ||||
| 2.05 | Content | 0x0C | | ||||
| 4.00 | Bad Request | 0x0D | | ||||
| 4.01 | Unauthorized | 0x0E | | ||||
| 4.02 | Bad Option | 0x0F | | ||||
| 4.03 | Forbidden | 0x10 | | ||||
| 4.04 | Not Found | 0x11 | | ||||
| 4.05 | Method Not Allowed | 0x12 | | ||||
| 4.06 | Not Acceptable | 0x13 | | ||||
| 4.12 | Precondition Failed | 0x14 | | ||||
| 4.13 | Request Entity Too Large | 0x15 | | ||||
| 4.15 | Unsupported Content-Format | 0x16 | | ||||
| 5.00 | Internal Server Error | 0x17 | | ||||
| 5.01 | Not Implemented | 0x18 | | ||||
| 5.02 | Bad Gateway | 0x19 | | ||||
| 5.03 | Service Unavailable | 0x1A | | ||||
| 5.04 | Gateway Timeout | 0x1B | | ||||
| 5.05 | Proxying Not Supported | 0x1C | | ||||
+------+------------------------------+-----------+ | ||||
Figure 1: Example of CoAP code mapping | ||||
Figure 1 gives a possible mapping, it can be changed to add new codes | ||||
or reduced if some values are never used by both ends. It could | ||||
efficiently be coded on 5 bits. | ||||
Even if the number of code can be increase with other RFC, | ||||
implementations may use a limited number of values, which can help to | ||||
reduce the number of bits sent on the LPWAN. | ||||
The number of code may vary over time, some new codes may be | ||||
introduced or some applications use a limited number of values. | ||||
The client and the server do not use the same values. This asymmetry | ||||
can be exploited to reduce the size sent on the LPWAN. | ||||
The field can be treated differently in upstream than in downstream. | ||||
If the Thing is a client an entry can be set on the uplink message | ||||
with a code matching for 0.0X values and another for downlink values | ||||
for Y.ZZ codes. It is the opposite if the thing is a server. | ||||
If the ES always sends or receives requests with the same method, the | ||||
Code field can be elided. The entry below shows a rule for a client | ||||
sending only GET request. | ||||
FID FL FP DI TV MO CDA Sent | ||||
code 8 1 up GET equal not-sent | ||||
If the client may send different methods, a matching-list can be | ||||
applied. For table Figure 1, 3 bits are necessary, but it could be | ||||
less if fewer methods are used. Example below gives an example where | ||||
the ES is a server and receives only GET and POST requests. | ||||
FID FL FP DI Target Value MO CDA Sent | ||||
code 8 1 dw [0.01, 0.02] match-mapping mapping-sent [1] | ||||
The same approach can be applied to responses. | ||||
3.5. CoAP Message ID field | ||||
This field is bidirectional. | ||||
Message ID is used for two purposes: | ||||
o To acknowledge a CON message with an ACK. | ||||
o To avoid duplicate messages. | ||||
In LPWAN, since a message can be received by several radio gateway, | ||||
some LPWAN technologies include a sequence number in L2 to avoid | ||||
duplicate frames. Therefore if the message does not need to be | ||||
acknowledged (NON or RST message), the Message ID field can be | ||||
avoided. | ||||
FID FL FP DI TV MO CDA Sent | ||||
Mid 8 1 bi ignore not-sent | ||||
The decompressor must generate a value. | ||||
[[Note; check id this field is not used by OSCOAP .]] | ||||
To optimize information sent on the LPWAN, shorter values may be used | ||||
during the exchange, but Message ID values generated a common CoAP | ||||
implementation will not take into account this limitation. Before | ||||
the compression, a proxy may be needed to reduce the size. | ||||
FID FL FP DI TV MO CDA Sent | ||||
Mid 8 1 bi 0x0000 MSB(12) LSB(4) [4] | ||||
Otherwise if no compression is possible, the field has to be sent | ||||
FID FL FP DI TV MO CDA Sent | ||||
Mid 8 1 bi ignore value-sent [8] | ||||
3.6. CoAP Token field | ||||
This field is bi-directional. | ||||
Token is used to identify transactions and varies from one | ||||
transaction to another. Therefore, it is usually necessary to send | ||||
the value of the token field on the LPWAN network. The optimization | ||||
will occur by using small values. | ||||
Common CoAP implementations may generate large tokens, even if | ||||
shorter tokens could be used regarding the LPWAN characteristics. A | ||||
proxy may be needed to reduce the size of the token before | ||||
compression. | ||||
The size of the compress token sent is known by a combination of the | ||||
Token Length field and the rule entry. For instance, with the entry | ||||
below: | ||||
FID FL FP DI TV MO CDA Sent | ||||
tkl 4 1 bi 2 equal not-sent | ||||
token 8 1 bi 0x00 MSB(12) LSB(4) [4] | ||||
The uncompressed token is 2 bytes long, but the compressed size will | 4.1. CoAP version field | |||
be 4 bits. | ||||
4. CoAP options | This field is bidirectional and must be elided during the SCHC | |||
compression, since it always contains the same value. In the future, | ||||
if new version of CoAP are defined, new rules ID will be defined | ||||
avoiding ambiguities between versions. | ||||
4.1. CoAP option Content-format field. | 4.2. CoAP type field | |||
This field is unidirectional and must not be set to bidirectional in | [rfc7252] defines 4 types of messages: CON, NON, ACK and RST. The | |||
a rule entry. It is used only by the server to inform the client | latter two ones are a response of the two first ones. If the device | |||
about of the payload type and is never found in client requests. | plays a specific role, a rule can exploit these property with the | |||
mapping list: [CON, NON] for one direction and [ACK, RST] for the | ||||
other direction. Compression residue is reduced to 1 bit. | ||||
If single value is expected by the client, the TV contains that value | The field must be elided if for instance a client is sending only NON | |||
and MO is set to "equal" and the CDF is set to "not-sent". The | or CON messages. | |||
examples below describe the rules for an ES acting as a server. | ||||
FID FL FP DI TV MO CDA Sent | In any case, a rule must be defined to carry RST to a client. | |||
content 16 1 up value equal not-sent | ||||
If several possible value are expected by the client, a matching-list | 4.3. CoAP code field | |||
can be used. | ||||
FID FL FP DI TV MO CDA Sent | The compression of the CoAP code field follows the same principle as | |||
content 16 1 up [50, 41] match-mapping mapping-sent [1] | for the CoAP type field. If the device plays a specific role, the | |||
set of code values can be split in two parts, the request codes with | ||||
the 0 class and the response values. | ||||
Otherwise the value can be sent.The value-sent CDF in the compressor | If the device implement only a CoAP client, the request code can be | |||
do not send the option type and the decompressor reconstruct it | reduced to the set of request the client is able to process. | |||
regarding the position in the rule. | ||||
FID FL FP DI TV MO CDA Sent | All the response codes should be compressed with a SCHC rule. | |||
content 16 1 up ignore value-sent [0-16] | ||||
4.2. CoAP option Accept field | 4.4. CoAP Message ID field | |||
This field is unidirectional and must not be set to bidirectional in | This field is bidirectional and is used to manage acknowledgments. | |||
a rule entry. It is used only by the client to inform of the | Server memorizes the value for a EXCHANGE_LIFETIME period (by default | |||
possible payload type and is never found in server response. | 247 seconds) for CON messages and a NON_LIFETIME period (by default | |||
145 seconds) for NON messages. During that period, a server | ||||
receiving the same Message ID value will process the message has a | ||||
retransmission. After this period, it will be processed as a new | ||||
messages. | ||||
The number of accept options is not limited and can vary regarding | In case the Device is a client, the size of the message ID field may | |||
the usage. To be selected a rule must contain the exact number about | the too large regarding the number of messages sent. Client may use | |||
accept options with their positions. Since the order in which the | only small message ID values, for instance 4 bit long. Therefore a | |||
Accept value are sent, the position order can be modified. The rule | MSB can be used to limit the size of the compression residue. | |||
below | ||||
FID FL FP DI TV MO CDA Sent | In case the Device is a server, client may be located outside of the | |||
accept 16 1 up 41 egal not-sent | LPWAN area and view the device as a regular device connected to the | |||
accept 16 2 up 50 egal not-sent | internet. The client will generate Message ID using the 16 bits | |||
space offered by this field. A CoAP proxy can be set before the SCHC | ||||
C/D to reduce the value of the Message ID, to allow its compression | ||||
with the MSB matching operator and LSB CDA. | ||||
will be selected only if two accept options are in the CoAP header if | 4.5. CoAP Token fields | |||
this order. | ||||
The rule below: | Token is defined through two CoAP fields, Token Length in the | |||
mandatory header and Token Value directly following the mandatory | ||||
CoAP header. | ||||
FID FL FP DI TV MO CDA Sent | Token Length is processed as a tradition protocol field. If the | |||
accept 16 0 up 41 egal not-sent | value remains the same during all the transaction, the size can be | |||
accept 16 0 up 50 egal not-sent | stored in the context and elided during the transmission. Otherwise | |||
it will have to the send as a compression residue. | ||||
will accept a-only CoAP messages with 2 accept options, but the order | Token Value size should not be defined directly in the rule in the | |||
will not influence the rule selection. The decompression will | Field Length (FL). Instead a specific function designed as "TKL" | |||
reconstruct the header regarding the rule order. | must be used. This function informs the SCHC C/D that the length of | |||
this field has to be read from the Token Length field. | ||||
Otherwise a matching-list can be applied to the different values, in | 5. CoAP options | |||
that case the order is important to recover the appropriate value and | ||||
the position must be clearly indicate. | ||||
FID FL FP DI TV MO CDA Sent | 5.1. CoAP Content and Accept options. | |||
accept 16 1 up [50,41] match-mapping mapping-sent [1] | ||||
accept 16 2 up [50,61] match-mapping mapping-sent [1] | ||||
accept 16 3 up [61,71] match-mapping mapping-sent [1] | ||||
Finally, the option can be explicitly sent. | These field are both unidirectional and must not be set to | |||
bidirectional in a rule entry. | ||||
FID FL FP DI TV MO CDA Sent | If single value is expected by the client, it can be stored in the TV | |||
accept 1 up ignore value-sent | and elided during the transmission. Otherwise, if several possible | |||
values are expected by the client, a matching-list should be used to | ||||
limit the size of the residue. If not the possible, the value as to | ||||
be sent as a residue (fixed or variable length). | ||||
4.3. CoAP option Max-Age field, CoAP option Uri-Host and Uri-Port | 5.2. CoAP option Max-Age field, CoAP option Uri-Host and Uri-Port | |||
fields | fields | |||
This field is unidirectional and must not be set to bidirectional in | This field is unidirectional and must not be set to bidirectional in | |||
a rule entry. It is used only by the server to inform of the caching | a rule entry. It is used only by the server to inform of the caching | |||
duration and is never found in client requests. | duration and is never found in client requests. | |||
If the duration is known by both ends, value can be elided on the | If the duration is known by both ends, value can be elided on the | |||
LPWAN. | LPWAN. | |||
A matching list can be used if some wellknown values are defined. | A matching list can be used if some well-known values are defined. | |||
Otherwise the option length and value can be sent on the LPWAN. | ||||
[[note: we can reduce (or create a new option) the unit to minute, | Otherwise these options should be sent as a residue (fixed or | |||
second is small for LPWAN ]] | variable length). | |||
5. CoAP option Uri-Path and Uri-Query fields | 5.3. CoAP option Uri-Path and Uri-Query fields | |||
This fields are unidirectional and must not be set to bidirectional | This fields are unidirectional and must not be set to bidirectional | |||
in a rule entry. They are used only by the client to access to a | in a rule entry. They are used only by the client to access to a | |||
specific resource and are never found in server response. | specific resource and are never found in server responses. | |||
The Matching Operator behavior has not changed, but the value must | Uri-Path and Uri-Query elements are a repeatable options, the Field | |||
take a position value, if the entry is repeated : | Position (FP) gives the position in the path. | |||
FID FL FP DI TV MO CDA Sent | A Mapping list can be used to reduce size of variable Paths or | |||
URI-Path 1 up foo equal not-sent | Queries. In that case, to optimize the compression, several elements | |||
URI-Path 2 up bar equal not-sent | can be regrouped into a single entry. Numbering of elements do not | |||
change, MO comparison is set with the first element of the matching. | ||||
Figure 2: Position entry. | FID FL FP DI TV MO CDA | |||
URI-Path 1 up ["/a/b", equal not-sent | ||||
"/c/d"] | ||||
URI-Path 3 up ignore value-sent | ||||
For instance, the rule Figure 2 matches with /foo/bar, but not /bar/ | Figure 2: complex path example | |||
foo. | ||||
When the length is not clearly indicated in the rule, the value | In Figure 2 a single bit residue can be used to code one of the 2 | |||
length must be sent with the field data, which means for CoAP to send | paths. If regrouping was not allowed, a 2 bits residue whould have | |||
directly the CoAP option with length and value. | been needed. | |||
5.3.1. Variable length Uri-Path and Uri-Query | ||||
When the length is known at the rule creation, the Field Length must | ||||
be set to variable, and the unit is set to bytes. | ||||
The MSB MO can be apply to a Uri-Path or Uri-Query element. Since | ||||
MSB value is given in bit, the size must always be a multiple of 8 | ||||
bits and the LSB CDA must not carry any value. | ||||
The length sent at the beginning of a variable length residue | ||||
indicates the size of the LSB in bytes. | ||||
For instance for a CoMi path /c/X6?k="eth0" the rule can be set to: | For instance for a CoMi path /c/X6?k="eth0" the rule can be set to: | |||
FID FL FP DI TV MO CDA Sent | FID FL FP DI TV MO CDA | |||
URI-Path 1 up c equal not-sent | URI-Path 1 up "c" equal not-sent | |||
URI-Path 2 up ignore value-sent | URI-Path 2 up ignore value-sent | |||
URI-Query 1 up k= MSB (16) LSB | URI-Query 1 up "k=" MSB (16) LSB | |||
Figure 3: CoMi URI compression | Figure 3: CoMi URI compression | |||
Figure 3 shows the parsing and the compression of the URI. where c is | Figure 3 shows the parsing and the compression of the URI. where c is | |||
not sent. The second element is sent with the length (i.e. 0x2 X 6) | not sent. The second element is sent with the length (i.e. 0x2 X 6) | |||
followed by the query option (i.e. 0x05 "eth0"). | followed by the query option (i.e. 0x05 "eth0"). | |||
A Mapping list can be used to reduce size of variable Paths or | 5.3.2. Variable number of path or query elements | |||
Queries. In that case, to optimize the compression, several elements | ||||
can be regrouped into a single entry. Numbering of elements do not | ||||
change, MO comparison is set with the first element of the matching. | ||||
FID FL FP DI TV MO CDA Sent | ||||
URI-Path 1 up {0:"/c/c", equal not-sent | ||||
1:"/c/d" | ||||
URI-Path 3 up ignore value-sent | ||||
URI-Query 1 up k= MSB (16) LSB | ||||
Figure 4: complex path example | ||||
For instance, the following Path /foo/bar/variable/stable can leads | The number of Uri-path or Uri-Query element in a rule is fixed at the | |||
to the rule defined Figure 4. | rule creation time. If the number varies, several rules should be | |||
created to cover all the possibilities. Another possibilities is to | ||||
define the length of Uri-Path to variable and send a compression | ||||
residue with a length of 0 to indicate that this Uri-Path is empty. | ||||
This add 4 bits to the compression residue. | ||||
5.1. CoAP option Proxy-URI and Proxy-Scheme fields | 5.4. CoAP option Size1, Size2, Proxy-URI and Proxy-Scheme fields | |||
These fields are unidirectional and must not be set to bidirectional | These fields are unidirectional and must not be set to bidirectional | |||
in a rule entry. They are used only by the client to access to a | in a rule entry. They are used only by the client to access to a | |||
specific resource and are never found in server response. | specific resource and are never found in server response. | |||
If the field value must be sent, TV is not set, MO is set to "ignore" | If the field value must be sent, TV is not set, MO is set to "ignore" | |||
and CDF is set to "value-sent. A mapping can also be used. | and CDF is set to "value-sent. A mapping can also be used. | |||
Otherwise the TV is set to the value, MO is set to "equal" and CDF is | Otherwise the TV is set to the value, MO is set to "equal" and CDF is | |||
set to "not-sent" | set to "not-sent" | |||
5.2. CoAP option ETag, If-Match, If-None-Match, Location-Path and | 5.5. CoAP option ETag, If-Match, If-None-Match, Location-Path and | |||
Location-Query fields | Location-Query fields | |||
These fields are unidirectional. | These fields are unidirectional. | |||
These fields values cannot be stored in a rule entry. They must | These fields values cannot be stored in a rule entry. They must | |||
always be sent with the request. | always be sent with the compression residues. | |||
[[Can include OSCOAP Object security in that category ]] | ||||
6. Other RFCs | 6. Other RFCs | |||
6.1. Block | 6.1. Block | |||
Block option should be avoided in LPWAN. The minimum size of 16 | Block [rfc7959] allows a fragmentation at the CoAP level. SCHC | |||
bytes can be incompatible with some LPWAN technologies. | includes also a fragmentation protocol. They are compatible. If a | |||
block option is used, its content must be sent as a compression | ||||
[[Note: do we recommand LPWAN fragmentation since the smallest value | residue. | |||
of 16 is too big?]] | ||||
6.2. Observe | 6.2. Observe | |||
[rfc7641] defines the Observe option. The TV is not set, MO is set | [rfc7641] defines the Observe option. The TV is not set, MO is set | |||
to "ignore" and the CDF is set to "value-sent". SCHC does not limit | to "ignore" and the CDF is set to "value-sent". SCHC does not limit | |||
the maximum size for this option (3 bytes). To reduce the | the maximum size for this option (3 bytes). To reduce the | |||
transmission size either the Thing implementation should limit the | transmission size either the device implementation should limit the | |||
value increase or a proxy can be used limit the increase. | value increase or a proxy can modify the incrementation. | |||
Since RST message may be sent to inform a server that the client do | Since RST message may be sent to inform a server that the client do | |||
not require Observe response, a rule must allow the transmission of | not require Observe response, a rule must allow the transmission of | |||
this message. | this message. | |||
6.3. No-Response | 6.3. No-Response | |||
[rfc7967] defines an No-Response option limiting the responses made | [rfc7967] defines an No-Response option limiting the responses made | |||
by a server to a request. If the value is not by both ends, then TV | by a server to a request. If the value is not known by both ends, | |||
is set to this value, MO is set to "equal" and CDF is set to "not- | then TV is set to this value, MO is set to "equal" and CDF is set to | |||
sent". | "not-sent". | |||
Otherwise, if the value is changing over time, TV is not set, MO is | Otherwise, if the value is changing over time, TV is not set, MO is | |||
set to "ignore" and CDF to "value-sent". A matching list can also be | set to "ignore" and CDA to "value-sent". A matching list can also be | |||
used to reduce the size. | used to reduce the size. | |||
7. Protocol analysis | 6.4. Time Scale | |||
8. Examples of CoAP header compression | ||||
8.1. Mandatory header with CON message | Time scale [I-D.toutain-core-time-scale] option allows a client to | |||
inform the server that it is in a slow network and that message ID | ||||
should be kept for a duration given by the option. | ||||
If the value is not known by both ends, then TV is set to this value, | ||||
MO is set to "equal" and CDA is set to "not-sent". | ||||
Otherwise, if the value is changing over time, TV is not set, MO is | ||||
set to "ignore" and CDA to "value-sent". A matching list can also be | ||||
used to reduce the size. | ||||
6.5. OSCORE | ||||
OSCORE [I-D.ietf-core-object-security] defines end-to-end protection | ||||
for CoAP messages. This section describes how SCHC rules can be | ||||
applied to compress OSCORE-protected messages. | ||||
0 1 2 3 4 5 6 7 <--------- n bytes -------------> | ||||
+-+-+-+-+-+-+-+-+--------------------------------- | ||||
|0 0 0|h|k| n | Partial IV (if any) ... | ||||
+-+-+-+-+-+-+-+-+--------------------------------- | ||||
| | | ||||
| <--------- CoAP OSCORE_piv ------------------> | | ||||
<- 1 byte -> <------ s bytes -----> | ||||
+------------+----------------------+-----------------------+ | ||||
| s (if any) | kid context (if any) | kid (if any) ... | | ||||
+------------+----------------------+-----------------------+ | ||||
| | | | ||||
| <------ CoAP OSCORE_kidctxt ----->|<-- CoAP OSCORE_kid -->| | ||||
Figure 4: OSCORE Option | ||||
The encoding of the OSCORE Option Value defined in Section 6.1 of | ||||
[I-D.ietf-core-object-security] is repeated in Figure 4. | ||||
The first byte is used for flags that specify the contents of the | ||||
OSCORE option. The 3 most significant bits are reserved and always | ||||
set to 0. Bit h, when set, indicates the presence of the kid context | ||||
field in the option. Bit k, when set, indicates the presence of a | ||||
kid field. The 3 least significant bits n indicate to length of the | ||||
piv field in bytes, n = 0 taken to mean that no piv is present. | ||||
After the flag byte follow the piv field, kid context field and kid | ||||
field in order and if present; the length of the kid context field is | ||||
encoded in the first byte denoting by s the length of the kid context | ||||
in bytes. | ||||
This draft recommends to implement a parser that is able to identify | ||||
the OSCORE Option and the fields it contains - this makes it possible | ||||
to do a preliminary processing of the message in preparation for | ||||
regular SCHC compression. | ||||
Conceptually, the OSCORE option can transmit up to 3 distinct pieces | ||||
of information at a time: the piv, the kid context, and the kid. | ||||
This draft proposes that the SCHC Parser split the contents of this | ||||
option into 3 SCHC fields: | ||||
o CoAP OSCORE_piv, | ||||
o CoAP OSCORE_ctxt, | ||||
o CoAP OSCORE_kid. | ||||
These fields are superposed on the OSCORE Option format in Figure 4, | ||||
and include the corresponding flag and size bits for each part of the | ||||
option. Both the flag and size bits can be omitted by use of the MSB | ||||
matching operator on each field. | ||||
7. Examples of CoAP header compression | ||||
7.1. Mandatory header with CON message | ||||
In this first scenario, the LPWAN compressor receives from outside | In this first scenario, the LPWAN compressor receives from outside | |||
client a POST message, which is immediately acknowledged by the | client a POST message, which is immediately acknowledged by the | |||
Thing. For this simple scenario, the rules are described Figure 5. | Device. For this simple scenario, the rules are described Figure 5. | |||
Rule ID 1 | Rule ID 1 | |||
+-------------+--+--+--+------+---------+-------------++------------+ | +-------------+--+--+--+------+---------+-------------++------------+ | |||
| Field |FL|FP|DI|Target| Match | CDA || Sent | | | Field |FL|FP|DI|Target| Match | CDA || Sent | | |||
| | | | |Value | Opera. | || [bits] | | | | | | |Value | Opera. | || [bits] | | |||
+-------------+--+--+--+------+---------+-------------++------------+ | +-------------+--+--+--+------+---------+-------------++------------+ | |||
|CoAP version | | |bi| 01 |equal |not-sent || | | |CoAP version | | |bi| 01 |equal |not-sent || | | |||
|CoAP version | | |bi| 01 |equal |not-sent || | | |CoAP version | | |bi| 01 |equal |not-sent || | | |||
|CoAP Type | | |bi| |ignore |value-sent ||TT | | |CoAP Type | | |dw| CON |equal |not-sent || | | |||
|CoAP Type | | |up|[ACK, | | || | | ||||
| | | | | RST] |match-map|matching-sent|| T | | ||||
|CoAP TKL | | |bi| 0 |equal |not-sent || | | |CoAP TKL | | |bi| 0 |equal |not-sent || | | |||
|CoAP Code | | |bi| ML1 |match-map|matching-sent|| CC CCC | | |CoAP Code | | |bi| ML1 |match-map|matching-sent|| CC CCC | | |||
|CoAP MID | | |bi| 0000 |MSB(7 ) |LSB(9) || M-ID| | |CoAP MID | | |bi| 0000 |MSB(7 ) |LSB(9) || M-ID| | |||
|CoAP Uri-Path| | |dw| path |equal 1 |not-sent || | | |CoAP Uri-Path| | |dw| path |equal 1 |not-sent || | | |||
+-------------+--+--+--+------+---------+-------------++------------+ | +-------------+--+--+--+------+---------+-------------++------------+ | |||
Figure 5: CoAP Context to compress header without token | Figure 5: CoAP Context to compress header without token | |||
The version and Token Length fields are elided. Code has shrunk to 5 | The version and Token Length fields are elided. Code has shrunk to 5 | |||
bits using the matching list (as the one given Figure 1: 0.01 is | bits using a matching list. Uri-Path contains a single element | |||
value 0x01 and 2.05 is value 0x0c) Message-ID has shrunk to 9 bits to | ||||
preserve alignment on byte boundary. The most significant bit must | ||||
be set to 0 through a CoAP proxy. Uri-Path contains a single element | ||||
indicated in the matching operator. | indicated in the matching operator. | |||
Figure 6 shows the time diagram of the exchange. A LPWAN Application | Figure 6 shows the time diagram of the exchange. A client in the | |||
Server sends a CON message. Compression reduces the header sending | Application Server sends a CON request. It can go through a proxy | |||
only the Type, a mapped code and the least 9 significant bits of | which reduces the message ID to a smallest value, with at least the 9 | |||
Message ID. The receiver decompresses the header. . | most significant bits equal to 0. SCHC Compression reduces the | |||
header sending only the Type, a mapped code and the least 9 | ||||
The CON message is a request, therefore the LC process to a dynamic | significant bits of Message ID. | |||
mapping. When the ES receives the ACK message, this will not | ||||
initiate locally a message ID mapping since it is a response. The LC | ||||
receives the ACK and uncompressed it to restore the original value. | ||||
Dynamic Mapping context lifetime follows the same rules as message ID | ||||
duration. | ||||
End System LPWA LC | Device LPWAN SCHC C/D | |||
| | | | | | |||
| rule id=1 |<-------------------- | | rule id=1 |<-------------------- | |||
|<-------------------| +-+-+--+----+------+ | |<-------------------| +-+-+--+----+------+ | |||
<------------------- | TTCC CCCM MMMM MMMM| |1|0| 4|0.01|0x0034| | <------------------- | CCCCCMMMMMMMMM | |1|0| 4|0.01|0x0034| | |||
+-+-+--+----+-------+ | 0000 0010 0011 0100| | 0xb4 p a t| | +-+-+--+----+-------+ | 00001000110100 | | 0xb4 p a t| | |||
|1|0| 1|0.01|0x0034 | | | | h | | |1|0| 1|0.01|0x0034 | | | | h | | |||
| 0xb4 p a t | | | +------+ | | 0xb4 p a t | | | +------+ | |||
| h | | | | | h | | | | |||
+------+ | | | +------+ | | | |||
| | | | | | |||
| | | | | | |||
---------------------->| rule id=1 | | ---------------------->| rule id=1 | | |||
+-+-+--+----+--------+ |------------------->| | +-+-+--+----+--------+ |------------------->| | |||
|1|2| 0|2.05| 0x0034 | | TTCC CCCM MMMM MMMM|---------------------> | |1|2| 0|2.05| 0x0034 | | TCCCCCMMMMMMMMM |---------------------> | |||
+-+-+--+----+--------+ | 1001 1000 0011 0100| +-+-+--+----+------+ | +-+-+--+----+--------+ | 001100000110100 | +-+-+--+----+------+ | |||
| | |1|2| 0|2.05|0x0034| | | | |1|2| 0|2.05|0x0034| | |||
v v +-+-+--+----+------+ | v v +-+-+--+----+------+ | |||
Figure 6: Compression with global addresses | Figure 6: Compression with global addresses | |||
The message can be further optimized by setting some fields | 7.2. Complete exchange | |||
unidirectional, as described in Figure 7. Note that Type is no more | ||||
sent in the compressed format, Compressed Code size in not changed in | ||||
that example (8 values are needed to code all the requests and 21 to | ||||
code all the responses in the matching list Figure 1) | ||||
Rule ID 2 | ||||
+-------------+--+--+--+------+---------+------------++------------+ | ||||
| Field |FL|FP|DI|Target| MO | CDA || Sent | | ||||
| | | | |Value | | || [bits] | | ||||
+-------------+--+--+--+------+---------+------------++------------+ | ||||
|CoAP version | | |bi|01 |equal |not-sent || | | ||||
|CoAP Type | | |dw|CON |equal |not-sent || | | ||||
|CoAP Type | | |up| ACK |equal |not-sent || | | ||||
|CoAP TKL | | |bi|0 |equal |not-sent || | | ||||
|CoAP Code | | |dw|ML2 |match-map|mapping-sent||CCCC C | | ||||
|CoAP Code | | |up|ML3 |match-map|mapping-sent||CCCC C | | ||||
|CoAP MID | | |bi|0000 |MSB(5) |LSB(11) || M-ID | | ||||
|CoAP Uri-Path| | |dw|path |equal 1 |not-sent || | | ||||
+-------------+--+--+--+------+---------+------------++------------+ | ||||
ML1 = {CON : 0, ACK:1} ML2 = {POST:0, 2.04:1, 0.00:3} | ||||
Figure 7: CoAP Context to compress header without token | ||||
8.2. Complete exchange | ||||
In that example, the Thing is using CoMi and sends queries for 2 SID. | In that example, the Thing is using CoMi and sends queries for 2 SID. | |||
CON | CON | |||
MID=0x0012 | | | MID=0x0012 | | | |||
POST | | | POST | | | |||
Accept X | | | Accept X | | | |||
/c/k=AS |------------------------>| | /c/k=AS |------------------------>| | |||
| | | | | | |||
| | | | | | |||
|<------------------------| ACK MID=0x0012 | |<------------------------| ACK MID=0x0012 | |||
| | 0.00 | | | 0.00 | |||
| | | | | | |||
| | | | | | |||
|<------------------------| CON | |<------------------------| CON | |||
| | MID=0X0034 | | | MID=0X0034 | |||
| | Content-Format X | | | Content-Format X | |||
ACK MID=0x0034 |------------------------>| | ACK MID=0x0034 |------------------------>| | |||
0.00 | 0.00 | |||
Rule ID 3 | 7.3. OSCORE Compression | |||
+--------------+--+--+--+------+--------+-----------++------------+ | ||||
| Field |FL|FP|DI|Target| MO | CDA || Sent | | ||||
| | | | |Value | | || [bits] | | ||||
+--------------+--+--+--+------+--------+-----------++------------+ | ||||
|CoAP version | | |bi| 01 |equal |not-sent || | | ||||
|CoAP Type | | |up| CON |equal |not-sent || | | ||||
|CoAP Type | | |dw| ACK |equal |not-sent || | | ||||
|CoAP TKL | | |bi| 1 |equal |not-sent || | | ||||
|CoAP Code | | |up| POST |equal |not-sent || | | ||||
|CoAP Code | | |dw| 0.00 |equal |not-sent || | | ||||
|CoAP MID | | |bi| 0000 |MSB(8) |LSB ||MMMMMMMM | | ||||
|CoAP Token | | |up| |ignore |send-value ||TTTTTTTT | | ||||
|CoAP Uri-Path | | |dw| /c |equal 1 |not-sent || | | ||||
|CoAP Uri-query| | |dw| ML4 |equal 1 |not-sent ||P | | ||||
|CoAP Content | | |up| X |equal |not-sent || | | ||||
+--------------+--+--+--+------+--------+-----------++------------+ | ||||
Rule ID 4 | OSCORE aims to solve the problem of end-to-end encryption for CoAP | |||
+--------------+--+--+--+------+--------+-----------++------------+ | messages, which are otherwise required to terminate their TLS or DTLS | |||
| Field |FL|FP|DI|Target| MO | CDA || Sent | | protection at the proxy, as discussed in Section 11.2 of [rfc7252]. | |||
| | | | |Value | | || [bits] | | CoAP proxies are men-in-the-middle, but not all of the information | |||
+--------------+--+--+--+------+--------+-----------++------------+ | they have access to is necessary for their operation. The goal, | |||
|CoAP version | | |bi| 01 |equal |not-sent || | | therefore, is to hide as much of the message as possible while still | |||
|CoAP Type | | |dw| CON |equal |not-sent || | | enabling proxy operation. | |||
|CoAP Type | | |up| ACK |equal |not-sent || | | ||||
|CoAP TKL | | |bi| 1 |equal |not-sent || | | ||||
|CoAP Code | | |dw| 2.05 |equal |not-sent || | | ||||
|CoAP Code | | |up| 0.00 |equal |not-sent || | | ||||
|CoAP MID | | |bi| 0000 |MSB(8) |LSB ||MMMMMMMM | | ||||
|CoAP Token | | |dw| |ignore |send-value||TTTTTTTT | | ||||
|COAP Accept | | |dw| X |equal |not-sent || | | ||||
+--------------+--+--+--+------+---------+----------++------------+ | ||||
alternative rule: | Conceptually this is achieved by splitting the CoAP message into an | |||
Inner Plaintext and Outer OSCORE Message. The Inner Plaintext | ||||
contains sensible information which is not necessary for proxy | ||||
operation. This, in turn, is the part of the message which can be | ||||
encrypted and need not be decrypted until it reaches its end | ||||
destination. The Outer Message acts as a shell matching the format | ||||
of a regular CoAP message, and includes all Options and information | ||||
needed for proxy operation and caching. This decomposition is | ||||
illustrated in Figure 7. | ||||
Rule ID 4 | CoAP options are sorted into one of 3 classes, each granted a | |||
+--------------+--+--+--+------+---------+-----------++------------+ | specific type of protection by the protocol: | |||
| Field |FL|FP|DI|Target| MO | CDA || Sent | | ||||
| | | | |Value | | || [bits] | | ||||
+--------------+--+--+--+------+---------+-----------++------------+ | ||||
|CoAP version | | |bi| 01 |equal |not-sent || | | ||||
|CoAP Type | | |bi| ML1 |match-map|match-sent ||t | | ||||
|CoAP TKL | | |bi| 1 |equal |not-sent || | | ||||
|CoAP Code | | |up| ML2 |match-map|match-sent || cc | | ||||
|CoAP Code | | |dw| ML3 |match-map|match-sent || cc | | ||||
|CoAP MID | | |bi| 0000 |MSB(8) |LSB ||MMMMMMMM | | ||||
|CoAP Token | | |dw| |ignore |send-value ||TTTTTTTT | | ||||
|CoAP Uri-Path | | |dw| /c |equal 1 |not-sent || | | ||||
|CoAP Uri-query| | |dw| ML4 |equal 1 |not-sent ||P | | ||||
|CoAP Content | | |up| X |equal |not-sent || | | ||||
|COAP Accept | | |dw| x |equal |not-sent || | | ||||
+--------------+--+--+--+------+---------+-----------++------------+ | ||||
ML1 {CON:0, ACK:1} ML2 {POST:0, 0.00: 1} ML3 {2.05:0, 0.00:1} | o Class E: Enrypted options moved to the Inner Plaintext, | |||
ML4 {NULL:0, k=AS:1, K=AZE:2} | ||||
9. Normative References | o Class I: Intergrity-protected options included in the AAD for the | |||
encryption of the Plaintext but otherwise left untouched in the | ||||
Outer Message, | ||||
[I-D.toutain-lpwan-ipv6-static-context-hc] | o Class U: Unprotected options left untouched in the Outer Message. | |||
Minaburo, A. and L. Toutain, "LPWAN Static Context Header | ||||
Compression (SCHC) for IPv6 and UDP", draft-toutain-lpwan- | Additionally, the OSCORE Option is added as an Outer option, | |||
ipv6-static-context-hc-00 (work in progress), September | signaling that the message is OSCORE protected. This option carries | |||
2016. | the information necessary to retrieve the Security Context with which | |||
the message was encrypted so that it may be correctly decrypted at | ||||
the other end-point. | ||||
Orignal CoAP Message | ||||
+-+-+---+-------+---------------+ | ||||
|v|t|tkl| code | Msg Id. | | ||||
+-+-+---+-------+---------------+....+ | ||||
| Token | | ||||
+-------------------------------.....+ | ||||
| Options (IEU) | | ||||
. . | ||||
. . | ||||
+------+-------------------+ | ||||
| 0xFF | | ||||
+------+------------------------+ | ||||
| | | ||||
| Payload | | ||||
| | | ||||
+-------------------------------+ | ||||
/ \ | ||||
/ \ | ||||
/ \ | ||||
/ \ | ||||
Outer Header v v Plaintext | ||||
+-+-+---+--------+---------------+ +-------+ | ||||
|v|t|tkl|new code| Msg Id. | | code | | ||||
+-+-+---+--------+---------------+....+ +-------+-----......+ | ||||
| Token | | Options (E) | | ||||
+--------------------------------.....+ +-------+------.....+ | ||||
| Options (IU) | | OxFF | | ||||
. . +-------+-----------+ | ||||
. OSCORE Option . | | | ||||
+------+-------------------+ | Payload | | ||||
| 0xFF | | | | ||||
+------+ +-------------------+ | ||||
Figure 7: OSCORE inner and outer header form a CoAP message | ||||
Figure 7 shows the message format for the OSCORE Message and | ||||
Plaintext. In the Outer Header, the original message code is hidden | ||||
and replaced by a default value (POST or FETCH) depending on whether | ||||
the original message was a Request or a Response. The original | ||||
message code is put into the first byte of the Plaintext. Following | ||||
the message code come the class E options and if present the original | ||||
message Payload preceded by its payload marker. | ||||
The Plaintext is now encrypted by an AEAD algorithm which integrity | ||||
protects Security Context parameters and eventually any class I | ||||
options from the Outer Header. Currently no CoAP options are marked | ||||
class I. The resulting Ciphertext becomes the new Payload of the | ||||
OSCORE message, as illustrated in Figure 8. | ||||
Outer Header | ||||
+-+-+---+--------+---------------+ | ||||
|v|t|tkl|new code| Msg Id. | | ||||
+-+-+---+--------+---------------+....+ | ||||
| Token | | ||||
+--------------------------------.....+ | ||||
| Options (IU) | | ||||
. . | ||||
. OSCORE Option . | ||||
+------+-------------------+ | ||||
| 0xFF | | ||||
+------+-------------------------+ | ||||
| | | ||||
| Encrypted Inner Header and | | ||||
| Payload | | ||||
| | | ||||
+--------------------------------+ | ||||
Figure 8: OSCORE message | ||||
The SCHC Compression scheme consists of compressing both the | ||||
Plaintext before encryption and the resulting OSCORE message after | ||||
encryption, see Figure 9. This way compression reaches all fields of | ||||
the original CoAP message. | ||||
Outer Message OSCORE Plaintext | ||||
+-+-+---+--------+---------------+ +-------+ | ||||
|v|t|tkl|new code| Msg Id. | | code | | ||||
+-+-+---+--------+---------------+....+ +-------+-----......+ | ||||
| Token | | Options (E) | | ||||
+--------------------------------.....+ +-------+------.....+ | ||||
| Options (IU) | | OxFF | | ||||
. . +-------+-----------+ | ||||
. OSCORE Option . | | | ||||
+------+-------------------+ | Payload | | ||||
| 0xFF | | | | ||||
+------+------------+ +-------------------+ | ||||
| Ciphertext |<---------\ | | ||||
| | | v | ||||
+-------------------+ | +-----------------+ | ||||
| | | Inner SCHC | | ||||
v | | Compression | | ||||
+-----------------+ | +-----------------+ | ||||
| Outer SCHC | | | | ||||
| Compression | | v | ||||
+-----------------+ | +-------+ | ||||
| | |Rule ID| | ||||
v | +-------+--+ | ||||
+--------+ +------------+ | Residue | | ||||
|Rule ID'| | Encryption | <--- +----------+--------+ | ||||
+--------+--+ +------------+ | | | ||||
| Residue' | | Payload | | ||||
+-----------+-------+ | | | ||||
| Ciphertext | +-------------------+ | ||||
| | | ||||
+-------------------+ | ||||
Figure 9: OSCORE Compression Diagram | ||||
7.4. Example OSCORE Compression | ||||
In what follows we present an example GET Request and consequent | ||||
CONTENT Response and show a possible set of rules for the Inner and | ||||
Outer SCHC Compression. We then show a dump of the results and | ||||
contrast SCHC + OSCORE performance with SCHC + COAP performance. | ||||
This gives an approximation to the cost of security with SCHC-OSCORE. | ||||
Our first example CoAP message is the GET Request in Figure 10 | ||||
Original message: | ||||
================= | ||||
0x4101000182bb74656d7065726174757265 | ||||
Header: | ||||
0x4101 | ||||
01 Ver | ||||
00 CON | ||||
0001 tkl | ||||
00000001 Request Code 1 "GET" | ||||
0x0001 = mid | ||||
0x82 = token | ||||
Options: | ||||
0xbb74656d7065726174757265 | ||||
Option 11: URI_PATH | ||||
Value = temperature | ||||
Original msg length: 17 bytes. | ||||
Figure 10: CoAP GET Request | ||||
Its corresponding response is the CONTENT Response in Figure 11. | ||||
Original message: | ||||
================= | ||||
0x6145000182ff32332043 | ||||
Header: | ||||
0x6145 | ||||
01 Ver | ||||
10 ACK | ||||
0001 tkl | ||||
01000101 Successful Response Code 69 "2.05 Content" | ||||
0x0001 = mid | ||||
0x82 = token | ||||
0xFF Payload marker | ||||
Payload: | ||||
0x32332043 | ||||
Original msg length: 10 | ||||
Figure 11: CoAP CONTENT Response | ||||
The SCHC Rules for the Inner Compression include all fields that are | ||||
already present in a regular CoAP message, what matters is the order | ||||
of appearance and inclusion of only those CoAP fields that go into | ||||
the Plaintext, Figure 12. | ||||
Rule ID 0 | ||||
+----------------+--+--+-----------+-----------+-----------++--------+ | ||||
| Field |FP|DI| Target | MO | CDA || Sent | | ||||
| | | | Value | | || [bits] | | ||||
+----------------+--+--+-----------+-----------+-----------++--------+ | ||||
|CoAP Code | |up| 1 | equal |not-sent || | | ||||
|CoAP Code | |dw|[69,132] | match-map |match-sent || c | | ||||
|CoAP Uri-Path | |up|temperature| equal |not-sent || | | ||||
|COAP Option-End | |dw| 0xFF | equal |not-sent || | | ||||
+----------------+--+--+-----------+-----------+-----------++--------+ | ||||
Figure 12: Inner SCHC Rules | ||||
The Outer SCHC Rules (Figure 13) must process the OSCORE Options | ||||
fields. Here we mask off the repeated bits (most importantly the | ||||
flag and size bits) with the MSB Mathing Operator. | ||||
Rule ID 0 | ||||
+---------------+--+--+--------------+---------+-----------++------------+ | ||||
| Field |FP|DI| Target | MO | CDA || Sent | | ||||
| | | | Value | | || [bits] | | ||||
+---------------+--+--+--------------+---------+-----------++------------+ | ||||
|CoAP version | |bi| 01 |equal |not-sent || | | ||||
|CoAP Type | |up| 0 |equal |not-sent || | | ||||
|CoAP Type | |dw| 2 |equal |not-sent || | | ||||
|CoAP TKL | |bi| 1 |equal |not-sent || | | ||||
|CoAP Code | |up| 2 |equal |not-sent || | | ||||
|CoAP Code | |dw| 68 |equal |not-sent || | | ||||
|CoAP MID | |bi| 0000 |MSB(12) |LSB ||MMMM | | ||||
|CoAP Token | |bi| 0x80 |MSB(5) |LSB ||TTT | | ||||
|CoAP OSCORE_piv| |up| 0x0900 |MSB(12) |LSB ||PPPP | | ||||
|COAP OSCORE_kid| |up|b'\x06client' |MSB(52) |LSB ||KKKK | | ||||
|CoAP OSCORE_piv| |dw| b'' |equal |not-sent || | | ||||
|COAP Option-End| |dw| 0xFF |equal |not-sent || | | ||||
+---------------+--+--+--------------+---------+-----------++------------+ | ||||
Figure 13: Outer SCHC Rules | ||||
Next we show a dump of the compressed message: | ||||
Compressed message: | ||||
================== | ||||
0x00291287f0a5c4833760d170 | ||||
0x00 = Rule ID | ||||
piv = 0x04 | ||||
Compression residue: | ||||
0b0001 010 0100 0100 (15 bits -> 2 bytes with padding) | ||||
mid tkn piv kid | ||||
Payload | ||||
0xa1fc297120cdd8345c | ||||
Compressed message length: 12 bytes | ||||
Figure 14: SCHC-OSCORE Compressed GET Request | ||||
Compressed message: | ||||
================== | ||||
0x0015f4de9cb814c96aed9b1d981a3a58 | ||||
0x00 = Rule ID | ||||
Compression residue: | ||||
0b0001 010 (7 bits -> 1 byte with padding) | ||||
mid tkn | ||||
Payload | ||||
0xfa6f4e5c0a64b576cd8ecc0d1d2c | ||||
Compressed msg length: 16 bytes | ||||
Figure 15: SCHC-OSCORE Compressed CONTENT Response | ||||
For contrast, we compare these results with what would be obtained by | ||||
SCHC compressing the original CoAP messages without protecting them | ||||
with OSCORE. To do this, we compress the CoAP mesages according to | ||||
the SCHC rules in Figure 16. | ||||
Rule ID 1 | ||||
+---------------+--+--+-----------+---------+-----------++------------+ | ||||
| Field |FP|DI| Target | MO | CDA || Sent | | ||||
| | | | Value | | || [bits] | | ||||
+---------------+--+--+-----------+---------+-----------++------------+ | ||||
|CoAP version | |bi| 01 |equal |not-sent || | | ||||
|CoAP Type | |up| 0 |equal |not-sent || | | ||||
|CoAP Type | |dw| 2 |equal |not-sent || | | ||||
|CoAP TKL | |bi| 1 |equal |not-sent || | | ||||
|CoAP Code | |up| 2 |equal |not-sent || | | ||||
|CoAP Code | |dw| [69,132] |equal |not-sent || | | ||||
|CoAP MID | |bi| 0000 |MSB(12) |LSB ||MMMM | | ||||
|CoAP Token | |bi| 0x80 |MSB(5) |LSB ||TTT | | ||||
|CoAP Uri-Path | |up|temperature|equal |not-sent || | | ||||
|COAP Option-End| |dw| 0xFF |equal |not-sent || | | ||||
+---------------+--+--+-----------+---------+-----------++------------+ | ||||
Figure 16: SCHC-CoAP Rules (No OSCORE) | ||||
This yields the results in Figure 17 for the Request, and Figure 18 | ||||
for the Response. | ||||
Compressed message: | ||||
================== | ||||
0x0114 | ||||
0x01 = Rule ID | ||||
Compression residue: | ||||
0b00010100 (1 byte) | ||||
Compressed msg length: 2 | ||||
Figure 17: CoAP GET Compressed without OSCORE | ||||
Compressed message: | ||||
================== | ||||
0x010a32332043 | ||||
0x01 = Rule ID | ||||
Compression residue: | ||||
0b00001010 (1 byte) | ||||
Payload | ||||
0x32332043 | ||||
Compressed msg length: 6 | ||||
Figure 18: CoAP CONTENT Compressed without OSCORE | ||||
As can be seen, the difference between applying SCHC + OSCORE as | ||||
compared to regular SCHC + COAP is about 10 bytes of cost. | ||||
8. Normative References | ||||
[I-D.ietf-core-object-security] | ||||
Selander, G., Mattsson, J., Palombini, F., and L. Seitz, | ||||
"Object Security for Constrained RESTful Environments | ||||
(OSCORE)", draft-ietf-core-object-security-13 (work in | ||||
progress), June 2018. | ||||
[I-D.ietf-lpwan-ipv6-static-context-hc] | ||||
Minaburo, A., Toutain, L., Gomez, C., and D. Barthel, | ||||
"LPWAN Static Context Header Compression (SCHC) and | ||||
fragmentation for IPv6 and UDP", draft-ietf-lpwan-ipv6- | ||||
static-context-hc-16 (work in progress), June 2018. | ||||
[I-D.toutain-core-time-scale] | ||||
Minaburo, A. and L. Toutain, "CoAP Time Scale Option", | ||||
draft-toutain-core-time-scale-00 (work in progress), | ||||
October 2017. | ||||
[rfc7252] Shelby, Z., Hartke, K., and C. Bormann, "The Constrained | [rfc7252] Shelby, Z., Hartke, K., and C. Bormann, "The Constrained | |||
Application Protocol (CoAP)", RFC 7252, | Application Protocol (CoAP)", RFC 7252, | |||
DOI 10.17487/RFC7252, June 2014, | DOI 10.17487/RFC7252, June 2014, | |||
<https://www.rfc-editor.org/info/rfc7252>. | <https://www.rfc-editor.org/info/rfc7252>. | |||
[rfc7641] Hartke, K., "Observing Resources in the Constrained | [rfc7641] Hartke, K., "Observing Resources in the Constrained | |||
Application Protocol (CoAP)", RFC 7641, | Application Protocol (CoAP)", RFC 7641, | |||
DOI 10.17487/RFC7641, September 2015, | DOI 10.17487/RFC7641, September 2015, | |||
<https://www.rfc-editor.org/info/rfc7641>. | <https://www.rfc-editor.org/info/rfc7641>. | |||
[rfc7959] Bormann, C. and Z. Shelby, Ed., "Block-Wise Transfers in | ||||
the Constrained Application Protocol (CoAP)", RFC 7959, | ||||
DOI 10.17487/RFC7959, August 2016, | ||||
<https://www.rfc-editor.org/info/rfc7959>. | ||||
[rfc7967] Bhattacharyya, A., Bandyopadhyay, S., Pal, A., and T. | [rfc7967] Bhattacharyya, A., Bandyopadhyay, S., Pal, A., and T. | |||
Bose, "Constrained Application Protocol (CoAP) Option for | Bose, "Constrained Application Protocol (CoAP) Option for | |||
No Server Response", RFC 7967, DOI 10.17487/RFC7967, | No Server Response", RFC 7967, DOI 10.17487/RFC7967, | |||
August 2016, <https://www.rfc-editor.org/info/rfc7967>. | August 2016, <https://www.rfc-editor.org/info/rfc7967>. | |||
Authors' Addresses | Authors' Addresses | |||
Ana Minaburo | Ana Minaburo | |||
Acklio | Acklio | |||
2bis rue de la Chataigneraie | 1137A avenue des Champs Blancs | |||
35510 Cesson-Sevigne Cedex | 35510 Cesson-Sevigne Cedex | |||
France | France | |||
Email: ana@ackl.io | Email: ana@ackl.io | |||
Laurent Toutain | Laurent Toutain | |||
Institut MINES TELECOM; IMT Atlantique | Institut MINES TELECOM; IMT Atlantique | |||
2 rue de la Chataigneraie | 2 rue de la Chataigneraie | |||
CS 17607 | CS 17607 | |||
35576 Cesson-Sevigne Cedex | 35576 Cesson-Sevigne Cedex | |||
France | France | |||
Email: Laurent.Toutain@imt-atlantique.fr | Email: Laurent.Toutain@imt-atlantique.fr | |||
Ricardo Andreasen | ||||
Universidad de Buenos Aires | ||||
Av. Paseo Colon 850 | ||||
C1063ACV Ciudad Autonoma de Buenos Aires | ||||
Argentina | ||||
Email: randreasen@fi.uba.ar | ||||
End of changes. 79 change blocks. | ||||
527 lines changed or deleted | 706 lines changed or added | |||
This html diff was produced by rfcdiff 1.47. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |