Content deleted Content added
→Message formats: Clarify message ID usage for acknowledgement/reset matching and token usage for request-response-matching |
ce |
||
(33 intermediate revisions by 22 users not shown) | |||
Line 1:
{{Short description|Specialized Internet application protocol}}
{{IP stack}}
'''Constrained Application Protocol''' ('''CoAP''') is a specialized [[User Datagram Protocol|UDP-based]] Internet application protocol for constrained devices, as defined in [https://datatracker.ietf.org/doc/html/rfc7252 RFC 7252] (published in 2014). It enables those constrained devices called "nodes" to communicate with the wider Internet using similar protocols.
CoAP is designed for use between devices on the same constrained network (e.g., low-power, lossy networks), between devices and general nodes on the Internet, and between devices on different constrained networks both joined by an internet. CoAP is also being used via other mechanisms, such as SMS on mobile communication networks.
CoAP is
The Internet Engineering Task Force ([[IETF]]) Constrained [[RESTful]] Environments Working Group ([https://datatracker.ietf.org/doc/charter-ietf-core/ CoRE]) has done the major standardization work for this protocol. In order to make the protocol suitable to IoT and M2M applications, various new functions have been added.
Line 40 ⟶ 41:
|}
=== CoAP
The first 4 bytes are mandatory in all CoAP datagrams, they constitute the fixed-size header.
These fields can be extracted from these 4 bytes in C via these macros:
<syntaxhighlight lang="c"> #define COAP_HEADER_VERSION(data) ( (0xC0 & (data)[0]) >> 6 )
#define COAP_HEADER_TYPE(data) ( (0x30 & (data)[0]) >> 4 )
Line 150 ⟶ 152:
Every request carries a token (but it may be zero length) whose value was generated by the client. The server must echo every token value without any modification back to the client in the corresponding response. It is intended for use as a client-local identifier to match requests and responses, especially for concurrent requests.
Matching requests and responses is not done with the message ID because a response may be sent in a different message than the acknowledgement (which uses the message ID for matching). For example, this could be done to prevent retransmissions if obtaining the result takes some time. Such a detached response is called "separate response". In contrast, transmitting the response directly in the acknowledgement is called "piggybacked response" which is expected to be preferred for efficiency reasons.
=== Option ===
Line 177 ⟶ 179:
Option delta:
* 0 to 12: For delta between 0
* 13: For delta from 13 to 268: Option delta extended is an 8-bit value that represents the option delta value minus 13
* 14: For delta from 269 to 65,804: Option delta extended is a 16-bit value that represents the option delta value minus 269
Line 184 ⟶ 186:
Option length:
* 0 to 12: For option length between 0
* 13: For option length from 13 to 268: Option length extended is an 8-bit value that represents the option length value minus 13
* 14: For option length from 269 to 65,804: Option length extended is a 16-bit value that represents the option length value minus 269
* 15: Reserved for future use. It is an error for the option length field to be set to 0xFF.
Option value:
Line 194 ⟶ 196:
* Semantic and format this field depends on the respective option.
{| class="wikitable sortable"
|-
! Name !! Programming Language !! Implemented CoAP version !! Client/Server !! Implemented CoAP features !! License !! Link
|-
| coap || Dart || RFC 7252
|-
| aiocoap || Python 3 || RFC 7252, RFC 7641, RFC 7959, RFC 8323, RFC 7967, RFC 8132, RFC 9176, RFC 8613, RFC 9528|| Client + Server || Blockwise Transfers, Observe (partial) || MIT || {{URL|https://pypi.python.org/pypi/aiocoap}}
|-
| Californium || Java || RFC 7252, RFC 7641, RFC 7959
|-
|
|-
|
|-
| Go-CoAP || [[Go (programming language)|Go]] || RFC 7252, RFC 8232, RFC 7641, RFC 7959
|-
|
|-
|
|-
|libcoapy
| CoAPSharp || C#, .NET || RFC 7252 || Client + Server || Core, Observe, Block, RD || LGPL || http://www.coapsharp.com▼
|Python
| colspan="3" |same support as libcoap
|MIT
|{{URL|https://github.com/anyc/libcoapy}}
|-
|
|-
|
|-
|
|-
| eCoAP || C || RFC 7252 || Client + Server || Core || MIT || https://gitlab.com/jobol/ecoap▼
RFC 7641, RFC 7959▼
| Client + Server || Core, Observe, Block || MIT || {{URL|https://github.com/mcollina/node-coap}}▼
|-
|
|-
|
{{URL|https://docs.rs/coap/}}▼
|-
|}
| iCoAP || Objective-C || RFC 7252 || Client || Core, Observe, Blockwise Transfers || MIT || https://github.com/stuffrabbit/iCoAP▼
==Proxy implementations==
There exist [[Proxy server|proxy]] implementations which provide [[Forward proxy|forward]] or [[Reverse proxy|reverse]] proxy functionality for the CoAP protocol and also implementations which translate between protocols like HTTP and CoAP.
The following projects provide proxy functionality:
* [http://telecom.dei.unipd.it/pages/read/90/ Squid 3.1.9 with transparent HTTP-CoAP mapping module]▼
* [https://code.google.com/p/jcoap/ jcoap Proxy]▼
* [https://github.com/eclipse/californium/tree/master/californium-proxy2 Californium cf-proxy2]▼
* [https://github.com/Tanganelli/CoAPthon CoAPthon]▼
* [https://github.com/keith-cullen/FreeCoAP FreeCoAP]▼
* [https://github.com/obgm/libcoap libcoap]
==Projects using CoAP==
{| class="wikitable sortable"
|-
! Name !! Programming Language !! Implemented CoAP version !! Client/Server !! Implemented CoAP features !! License !! Link
|-
|
|-
|
|-
|}
| LibNyoci || C || RFC 7252 || Client + Server || Core, Observe, Block, DTLS || MIT || https://github.com/darconeous/libnyoci▼
==Inactive protocol implementations==
{| class="wikitable sortable"
|-
! Name !! Programming Language !! Implemented CoAP version !! Client/Server !! Implemented CoAP features !! License !! Link
| lobaro-coap || C || RFC 7252 || Client + Server ||Observe, Blockwise Transfers || MIT || http://www.lobaro.com/lobaro-coap▼
|-
|
|-
|
|-
|
|-
|
|-
| CoAPthon || Python || RFC 7252|| Client + Server + Forward Proxy + Reverse Proxy || Observe, Multicast server discovery, CoRE Link Format parsing, Block-wise || MIT || https://github.com/Tanganelli/CoAPthon
▲| node-coap || Javascript || RFC 7252,
▲RFC 7641, RFC 7959
▲| Client + Server || Core, Observe, Block || MIT || https://github.com/mcollina/node-coap
|-
|
|-
|
|-
|
|-
|
|-
|
|-
|
|-
|
|-
|
|-
▲https://docs.rs/coap/
▲|
|-
▲|
|-
| Sensinode Java Device Library || Java SE || RFC 7252|| Client + Server || Core, Observe, Block, RD || Commercial || https://silver.arm.com/browse/SEN00
|-
| Sensinode NanoService Platform || Java SE || RFC 7252|| Cloud Server || Core, Observe, Block, RD || Commercial || https://silver.arm.com/browse/SEN00
|-
▲|
|-
▲|
|-
▲|
|-
| YaCoAP || C || || || || MIT || https://github.com/RIOT-Makers/YaCoAP
|-
|}
▲==Proxy implementations==
▲* [http://telecom.dei.unipd.it/pages/read/90/ Squid 3.1.9 with transparent HTTP-CoAP mapping module]
▲* [https://code.google.com/p/jcoap/ jcoap Proxy]
▲* [https://github.com/eclipse/californium/tree/master/californium-proxy2 Californium cf-proxy2]
▲* [https://github.com/Tanganelli/CoAPthon CoAPthon]
▲* [https://github.com/keith-cullen/FreeCoAP FreeCoAP]
==CoAP group communication==
Line 292 ⟶ 322:
== Security ==
CoAP defines four security modes:<ref>
* NoSec, where [[DTLS]] is disabled
* PreSharedKey, where DTLS is enabled, there is a list of pre-shared keys, and each key includes a list of which nodes it can be used to communicate with. Devices must support the AES cipher suite.
Line 298 ⟶ 328:
* Certificate, where DTLS is enabled and the device uses [[X.509]] certificates for validation.
Research has been conducted on optimizing DTLS by implementing security associates as CoAP resources rather than using DTLS as a security wrapper for CoAP traffic. This research has indicated that improvements of up to 6.5 times none optimized implementations.
In addition to DTLS, RFC8613<ref>{{Cite
== Security issues ==
Although the protocol standard includes provisions for mitigating the threat of [[DDoS]] amplification attacks,<ref>[https://blog.cloudflare.com/why-iot-is-insecure/ "TLS 1.3 is going to save us all, and other reasons why IoT is still insecure", Dani Grant, 2017-12-24]</ref> these provisions are not implemented in practice,<ref>[https://i.blackhat.com/eu-18/Thu-Dec-6/eu-18-Maggi-When-Machines-Cant-Talk-wp.pdf "When Machines Can't Talk: Security and Privacy Issues of Machine-to-Machine Data Protocols", Federico Maggi and Rainer Vosseler, 2018-12-06]</ref> resulting in the presence of over 580,000 targets primarily located in China and attacks up to 320
==See also==
|