Constrained Application Protocol (Coap) : Politecnico Di Milano
Constrained Application Protocol (Coap) : Politecnico Di Milano
1
Background
o GOAL:
to
enable
web-‐based
services
in
constrained
wireless
networks
n 8
bit
micro-‐controllers
n limited
memory
n low-‐power
networks
o Problem:
WEB
solu@on
are
hardly
applicable
o Solu@on:
re-‐design
web-‐based
services
for
constrained
networks
-‐>
COAP
2
How
Does
the
Web
Work?
o Resources
in
the
Web
are:
n managed
by
servers
n iden@fied
by
URIs
n accessed
synchronously
by
clients
through
request/
response
paradigms
o In
a
word,
Representa@onal
State
Transfer
(REST)
3
URL Resolution
4
Request/Response
Transaction
5
The CoAP Architecture
6
CoAP Design Requirements
See draft-shelby-core-coap-req
7
CoAP At a Glance
o Embedded web transfer protocol (coap://)
o Asynchronous transaction model
o UDP binding with reliability and multicast support
o GET, POST, PUT, DELETE methods
o URI support
o 4 byte header
o Subset of MIME types and HTTP response codes
o Built-in discovery
o Optional observation and block transfer
8
COAP
Messaging
Basics
o Transport:
n (mainly) UDP binding
o Message Exchange between Endpoints
n Messages with 4 bytes header (shared by request and
responses) containing a message ID (16 bits)
n Reliable exchange through Confirmable Messages which
must be acknowledged (through ACK or Reset Messages).
Simple Stop-and-Wait retransmission with exponential back-
off.
n Unreliable exchange through Non-Confirmable Message
n Duplicate detection for both confirmable and non-confirmable
messages (through message ID)
9
COAP
Messaging
Message ID
10
COAP Message Semantics
o REST Request/Response piggybacked
on CoAP Messages
o Method, Response Code and Options
(URI, content-type etc.)
11
COAP
Request/Response
Examples
Message ID
Token
12
COAP:
Separate
Response
13
COAP:
Non-‐confirmable
Request
14
Message Header (4 bytes)
!
!
! 0 1 2 3!
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1!
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+!
|Ver| T | TKL | Code | Message ID |!
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+!
| Token (if any, TKL bytes) ...!
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+!
| Options (if any) ...!
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+!
|1 1 1 1 1 1 1 1| Payload (if any) ...!
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+!
!
!
!
!
Ver - Version (1)!
!
T – Message Type (Confirmable, Non-Confirmable, Acknowledgement, Reset)!
!
TKL- Token Length, if any, the number of Token bytes after this header!
!
Code - Request Method (1-10) or Response Code (40-255)!
!
Message ID – 16-bit identifier for matching responses!
!
Token – Optional response matching token
15
Option Format
!
!
!
0 1 2 3 4 5 6 7!
+---------------+---------------+!
| | |!
| Option Delta | Option Length | 1 byte!
| | |!
+---------------+---------------+!
\ \!
/ Option Delta / 0-2 bytes!
\ (extended) \!
+-------------------------------+!
\ \!
/ Option Length / 0-2 bytes!
\ (extended) \!
+-------------------------------+!
\ \!
/ /!
\ \!
/ Option Value / 0 or more bytes!
\ \!
/ /!
\ \!
+-------------------------------+!
!
!
!
Option Delta - Difference between this option type and the previous!
!
Length - Length of the option value!
!
Value - The value of Length bytes immediately follows Length
16
Base Specification Options
!
!
+-----+---+---+---+---+----------------+--------+--------+----------+!
| No. | C | U | N | R | Name | Format | Length | Default |!
+-----+---+---+---+---+----------------+--------+--------+----------+!
| 1 | x | | | x | If-Match | opaque | 0-8 | (none) |!
| 3 | x | x | - | | Uri-Host | string | 1-255 | (see |!
| | | | | | | | | below) |!
| 4 | | | | x | ETag | opaque | 1-8 | (none) |!
| 5 | x | | | | If-None-Match | empty | 0 | (none) |!
| 7 | x | x | - | | Uri-Port | uint | 0-2 | (see |!
| | | | | | | | | below) |!
| 8 | | | | x | Location-Path | string | 0-255 | (none) |!
| 11 | x | x | - | x | Uri-Path | string | 0-255 | (none) |!
| 12 | | | | | Content-Format | uint | 0-2 | (none) |!
| 14 | | x | - | | Max-Age | uint | 0-4 | 60 |!
| 15 | x | x | - | x | Uri-Query | string | 0-255 | (none) |!
| 16 | | | | | Accept | uint | 0-2 | (none) |!
| 20 | | | | x | Location-Query | string | 0-255 | (none) |!
| 35 | x | x | - | | Proxy-Uri | string | 1-1034 | (none) |!
| 39 | x | x | - | | Proxy-Scheme | string | 1-255 | (none) |!
+-----+---+---+---+---+----------------+--------+--------+----------+!
!
C=Critical, U=Unsafe, N=NoCacheKey, R=Repeatable!
17
Dealing with Packet Loss
19
Proxying and caching
20
COAP
ObservaKon
o PROBLEM:
n REST
paradigm
is
oSen
“PULL”
type,
that
is,
data
is
obtained
by
issuing
an
explicit
request
n Informa@on/data
in
WSN
is
oSen
periodic/
triggered
(e.g.,
get
me
a
temperature
sample
every
2
seconds
or
get
me
a
warning
if
temperature
goes
below
5°C)
o SOLUTION:
use
Observa@on
on
COAP
resources
21
Observation
See draft-ietf-core-observe
22
COAP
Block
Transfer
o PROBLEM:
avoid
segmenta@on
in
the
lower
layers
(IPv6)
o SOLUTION:
COAP
Block
Transfer
Mode
n brings
up
fragmenta@on
at
the
applica@on
layer
23
Block transfer
25
CoRE Resource Discovery
!
!
!
!
!
!
!
</dev/bat>;obs;if="";rt="ipso:dev-bat";ct="0",!
</dev/mdl>;if="";rt="ipso:dev-mdl";ct="0",!
</dev/mfg>;if="";rt="ipso:dev-mfg";ct="0 ,!
</pwr/0/rel>;obs;if="";rt="ipso:pwr-rel";ct="0",!
</pwr/0/w>;obs;if="";rt="ipso:pwr-w";ct="0",!
</sen/temp>;obs;if="";rt="ucum:Cel";ct="0"!
26
Getting Started with CoAP
o Open source implementations:
n Java CoAP Library Californium
n C CoAP Library Erbium
n libCoAP C Library
n jCoAP Java Library
n OpenCoAP C Library
n TinyOS and Contiki include CoAP support
o Firefox has a CoAP plugin called Copper
o Wireshark has CoAP plugin
27