Протокол ограниченного приложения ( CoAP ) - это специализированный протокол Интернет-приложений для ограниченных устройств, как определено в RFC 7252. Он позволяет этим ограниченным устройствам, называемым «узлами», связываться с более широким Интернетом с использованием аналогичных протоколов. CoAP предназначен для использования между устройствами в одной и той же сети с ограничениями (например, маломощные сети с потерями), между устройствами и общими узлами в Интернете, а также между устройствами в разных сетях с ограничениями, которые соединены Интернетом. CoAP также используется с помощью других механизмов, таких как SMS в сетях мобильной связи.
CoAP - это протокол уровня обслуживания , который предназначен для использования в интернет-устройствах с ограниченными ресурсами, таких как узлы беспроводной сенсорной сети . CoAP разработан для легкого преобразования в HTTP для упрощенной интеграции с Интернетом, а также отвечает специальным требованиям, таким как поддержка многоадресной рассылки , очень низкие накладные расходы и простота. [1] [2] многоадресная передача, низкие накладные расходы, и простота чрезвычайно важна для Интернета вещей (IoT) и машина-машина (M2M) устройства, которые имеют тенденцию быть глубоко встроеныи имеют гораздо меньше памяти и питания, чем у традиционных интернет-устройств. Поэтому эффективность очень важна. CoAP может работать на большинстве устройств, поддерживающих UDP или аналог UDP.
Рабочая группа по ограниченным средам RESTful ( CoRE ) Целевой группы инженеров Интернета ( IETF ) провела основную работу по стандартизации этого протокола. Чтобы сделать протокол пригодным для приложений IoT и M2M, были добавлены различные новые функции.
Технические характеристики
Ядро протокола определено в RFC 7252. Были предложены различные расширения, в частности:
- RFC 7641 (2015) Наблюдение за ресурсами в протоколе ограниченного приложения
- RFC 7959 (2016) Блочная передача в протоколе ограниченного приложения (CoAP)
- RFC 8323 (2018) CoAP (протокол ограниченного приложения) через TCP, TLS и WebSockets
- RFC 8974 (2021) Расширенные токены и клиенты без сохранения состояния в протоколе ограниченного приложения (CoAP)
Форматы сообщений
Наименьшее сообщение CoAP имеет длину 4 байта, если не учитывать токен, параметры и полезную нагрузку. CoAP использует два типа сообщений: запросы и ответы, используя простой двоичный формат базового заголовка. За базовым заголовком могут следовать параметры в оптимизированном формате «тип-длина-значение». CoAP по умолчанию привязан к UDP и, необязательно, к DTLS , обеспечивая высокий уровень безопасности связи.
Любые байты после заголовков в пакете считаются телом сообщения. Длина тела сообщения определяется длиной дейтаграммы. При привязке к UDP все сообщение ДОЛЖНО помещаться в одну дейтаграмму. При использовании с 6LoWPAN, как определено в RFC 4944, сообщения ДОЛЖНЫ помещаться в один кадр IEEE 802.15.4, чтобы минимизировать фрагментацию.
Смещения | Октет | 0 | 1 | 2 | 3 | ||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Октет | Немного | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 год | 22 | 23 | 24 | 25 | 26 год | 27 | 28 год | 29 | 30 | 31 год |
4 | 32 | VER | Тип | Длина токена | Код запроса / ответа | ID сообщения | |||||||||||||||||||||||||||
8 | 64 | Токен (0-8 байт) | |||||||||||||||||||||||||||||||
12 | 96 | ||||||||||||||||||||||||||||||||
16 | 128 | Опции (при наличии) | |||||||||||||||||||||||||||||||
20 | 160 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | Полезная нагрузка (при наличии) |
Фиксированный заголовок CoAP: версия, тип, длина токена, код запроса / ответа и идентификатор сообщения.
Первые 4 байта являются обязательными во всех дейтаграммах CoAP.
Эти поля могут быть легко извлечены из этих 4 байтов в C с помощью этих макросов:
#define COAP_HEADER_VERSION (data) ((0xC0 & data [0]) >> 6) #define COAP_HEADER_TYPE (data) ((0x30 & data [0]) >> 4) #define COAP_HEADER_TKL (data) ((0x0F & data [ 0]) >> 0) #define COAP_HEADER_CLASS (data) (((data [1] >> 5) & 0x07)) #define COAP_HEADER_CODE (data) (((data [1] >> 0) & 0x1F)) #define COAP_HEADER_MID (данные) ((данные [2] << 8) | (данные [3]))
Версия (VER) (2 бита)
- Указывает номер версии CoAP.
Тип (2 бита)
- Это описывает тип сообщения дейтаграммы для контекста двух типов сообщений - запроса и ответа.
- Запрос
- 0: Подтверждаемый: это сообщение ожидает соответствующего сообщения подтверждения.
- 1: Не подтверждается: это сообщение не ожидает сообщения подтверждения.
- Ответ
- 2: Подтверждение: это сообщение является ответом, подтверждающим получение сообщения.
- 3: Сброс: это сообщение означает, что сообщение было получено, но не удалось его обработать.
- Запрос
Длина токена (4 бита)
- Указывает длину поля Token переменной длины, которая может составлять 0-8 байтов.
Код запроса / ответа (8 бит)
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
Класс | Код |
Три наиболее значимых бита образуют число, известное как «класс», которое аналогично классу кодов состояния HTTP . Пять наименее значимых битов образуют код, который сообщает дополнительную информацию о запросе или ответе. Весь код обычно передается в форме class.code
.
Вы можете найти последние коды запросов / ответов CoAP по адресу [1] , хотя в приведенном ниже списке приведены некоторые примеры:
|
|
|
Идентификатор сообщения (16 бит)
- Используется для обнаружения дублирования сообщений и сопоставления сообщений типа Acknowledgment / Reset с сообщениями типа Confirmable / Non-confirmable.: Ответные сообщения будут иметь тот же идентификатор сообщения, что и запрос.
Токен
Необязательное поле, размер которого указан в поле «Длина токена», значения которого генерируются клиентом. Сервер должен отображать каждое значение токена без каких-либо изменений обратно клиенту. Он предназначен для использования в качестве локального идентификатора клиента для предоставления дополнительного контекста для определенных параллельных транзакций.
Вариант
Битовые позиции | |||||||
---|---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
Вариант Дельта | Длина варианта | ||||||
Опция Delta Extended (Нет, 8 бит, 16 бит) | |||||||
Расширенная длина опции (нет, 8 бит, 16 бит) | |||||||
Значение параметра |
Вариант Дельта:
- От 0 до 12: для дельты от 0 до 12: представляет точное значение дельты между последним идентификатором опции и желаемым идентификатором опции, без значения Option Delta Extended.
- 13: Для дельты от 13 до 268: Option Delta Extended - это 8-битное значение, которое представляет значение Option Delta минус 13.
- 14: Для дельты от 269 до 65 804: Option Delta Extended - это 16-битное значение, которое представляет значение Option Delta минус 269.
- 15: Зарезервировано для маркера полезной нагрузки, где дельта опций и длина опций установлены вместе как 0xFF.
Длина варианта:
- От 0 до 12: для Option Length от 0 до 12: представляет точное значение длины, без значения Option Length Extended.
- 13: Для Option Length от 13 до 268: Option Length Extended - это 8-битное значение, которое представляет значение Option Length минус 13.
- 14: Для длины опции от 269 до 65 804: расширенная длина опции - это 16-битное значение, которое представляет значение длины опции минус 269.
- 15: Зарезервировано для использования в будущем. Это ошибка, если в поле Option Length установлено значение 0xFF.
Значение опции:
- Размер поля «Значение параметра» определяется значением «Длина параметра» в байтах.
- Семантика и формат этого поля зависит от соответствующей опции.
Реализации
Имя | Язык программирования | Реализованная версия CoAP | Клиент / Сервер | Реализованные функции CoAP | Лицензия | Ссылка на сайт |
---|---|---|---|---|---|---|
воздушное мыло | Python 3 | RFC 7252 | Клиент + Сервер | Блочные переводы, наблюдение (частичное) | Массачусетский технологический институт | https://pypi.python.org/pypi/aiocoap |
Калифорний | Ява | RFC 7252, RFC 7641, RFC 7959 | Клиент + Сервер | Наблюдение, блочные передачи, многоадресная передача (начиная с 2.x), DTLS (+ DTLS 1.2 Connection ID) | EPL + EDL | https://www.eclipse.org/californium https://github.com/eclipse/californium |
банщик | C ++ / C | RFC 7252 | Клиент + Сервер | BSD | https://github.com/staropram/cantcoap | |
Канопус | Идти | RFC 7252 | Клиент + Сервер | Основной | Лицензия Apache 2.0 | https://github.com/zubairhamed/canopus |
Go-CoAP | Идти | RFC 7252, RFC 8232, RFC 7641, RFC 7959 | Клиент + Сервер | Ядро, наблюдение, поблочное, многоадресное, TCP / TLS | Лицензия Apache 2.0 | https://github.com/go-ocf/go-coap |
Реализация CoAP для Go | Идти | RFC 7252 | Клиент + Сервер | Core + Draft Подписаться | Массачусетский технологический институт | https://github.com/dustin/go-coap |
CoAP.NET | C # | RFC 7252, coap-13, coap-08, coap-03 | Клиент + Сервер | Ядро, наблюдение, поблочные переводы | 3-пункт BSD | https://github.com/smeshlink/CoAP.NET |
CoAPSharp | C #, .NET | RFC 7252 | Клиент + Сервер | Ядро, Наблюдать, Блок, RD | LGPL | http://www.coapsharp.com |
CoAPthon | Python | RFC 7252 | Клиент + Сервер + Прямой прокси + Обратный прокси | Наблюдение, Обнаружение многоадресного сервера, Разбор формата ссылки CoRE, По блокам | Массачусетский технологический институт | https://github.com/Tanganelli/CoAPthon |
CoAP Shell | Ява | RFC 7252 | Клиент | Наблюдать, блочные переводы, DTLS | Лицензия Apache 2.0 | https://github.com/tzolov/coap-shell |
Медь | JavaScript (плагин для браузера) | RFC 7252 | Клиент | Наблюдать, блочные переводы | 3-пункт BSD | https://github.com/mkovatsc/Copper https://addons.mozilla.org/firefox/addon/copper-270430/ [ постоянная мертвая ссылка ] |
eCoAP | C | RFC 7252 | Клиент + Сервер | Основной | Массачусетский технологический институт | https://gitlab.com/jobol/ecoap |
Эрбий для Contiki | C | RFC 7252 | Клиент + Сервер | Наблюдать, блочные переводы | 3-пункт BSD | http://www.contiki-os.org/ (er-rest-example) |
FreeCoAP | C | RFC 7252 | Клиент + сервер + HTTP / CoAP прокси | Core, DTLS, блочные переводы | BSD | https://github.com/keith-cullen/FreeCoAP |
iCoAP | Цель-C | RFC 7252 | Клиент | Ядро, наблюдение, поблочные переводы | Массачусетский технологический институт | https://github.com/stuffrabbit/iCoAP |
java-coap | Ява | RFC 7252, RFC 7641, RFC 7959, RFC 8323 | Клиент + Сервер | Лицензия Apache 2.0 | https://github.com/PelionIoT/java-coap | |
jCoAP | Ява | RFC 7252 | Клиент + Сервер | Наблюдать, блочные переводы | Лицензия Apache 2.0 | https://code.google.com/p/jcoap/ |
libcoap | C | RFC 7252 | Клиент + Сервер | Наблюдать, блочные переводы, DTLS | BSD / GPL | https://github.com/obgm/libcoap |
LibNyoci | C | RFC 7252 | Клиент + Сервер | Ядро, Наблюдать, Блокировать, DTLS | Массачусетский технологический институт | https://github.com/darconeous/libnyoci |
лобаро | C | RFC 7252 | Клиент + Сервер | Наблюдать, блочные переводы | Массачусетский технологический институт | http://www.lobaro.com/lobaro-coap |
микрокоп | C | RFC 7252 | Клиент + Сервер | Массачусетский технологический институт | https://github.com/1248/microcoap | |
microCoAPy | MicroPython | RFC 7252 | Клиент + Сервер | Основной | Лицензия Apache 2.0 | https://github.com/insighio/microCoAPy |
наномыло | C | RFC 7252 | Клиент + Сервер | Основные, блочные переводы | LGPL | https://api.riot-os.org/group__net__nanocoap.html |
nCoap | Ява | RFC 7252 | Клиент + Сервер | Наблюдение, поблочные передачи, формат ссылки CoRE, черновик идентификатора конечной точки | BSD | https://github.com/okleine/nCoAP |
узелок | Javascript | RFC 7252 | Клиент + Сервер | Ядро, Наблюдать, Блокировать | Массачусетский технологический институт | https://github.com/mcollina/node-coap |
Рубиновый колпак | Рубин | RFC 7252 | Клиент + Сервер (Дэвид) | Ядро, Наблюдать, Блок, RD | Массачусетский технологический институт, GPL | https://github.com/nning/coap https://github.com/nning/david |
Библиотека устройств Sensinode C | C | RFC 7252 | Клиент + Сервер | Ядро, Наблюдать, Блок, RD | Коммерческий | https://silver.arm.com/browse/SEN00 |
Библиотека устройств Java Sensinode | Java SE | RFC 7252 | Клиент + Сервер | Ядро, Наблюдать, Блок, RD | Коммерческий | https://silver.arm.com/browse/SEN00 |
Платформа Sensinode NanoService | Java SE | RFC 7252 | Облачный сервер | Ядро, Наблюдать, Блок, RD | Коммерческий | https://silver.arm.com/browse/SEN00 |
SwiftCoAP | Быстрый | RFC 7252 | Клиент + Сервер | Ядро, наблюдение, поблочные переводы | Массачусетский технологический институт | https://github.com/stuffrabbit/SwiftCoAP |
TinyOS CoapBlip | nesC / C | coap-13 | Клиент + Сервер | Наблюдать, блочные переводы | BSD | https://web.archive.org/web/20130312140509/http://docs.tinyos.net/tinywiki/index.php/CoAP |
txThings | Python (витой) | RFC 7252 | Клиент + Сервер | Блочные переводы, наблюдение (частичное) | Массачусетский технологический институт | https://github.com/mwasilak/txThings/ |
Coap-RS | Ржавчина | RFC 7252 | Клиент + Сервер | Ядро, многоадресная рассылка, параметр наблюдения, код ответа на слишком много запросов | Массачусетский технологический институт | https://github.com/Covertness/coap-rs https://docs.rs/coap/ |
YaCoAP | C | Массачусетский технологический институт | https://github.com/RIOT-Makers/YaCoAP |
Реализации прокси
- Squid 3.1.9 с прозрачным модулем отображения HTTP-CoAP
- jcoap прокси
- Калифорний cf-proxy2
- CoAPthon
- FreeCoAP
Групповое общение CoAP
Во многих доменах приложений CoAP важно иметь возможность обращаться к нескольким ресурсам CoAP как к группе вместо того, чтобы обращаться к каждому ресурсу индивидуально (например, чтобы включить все источники света с поддержкой CoAP в комнате с помощью одного запроса CoAP, инициируемого переключением выключатель). Чтобы удовлетворить эту потребность, IETF разработала дополнительное расширение для CoAP в форме экспериментального RFC: Group Communication for CoAP - RFC 7390 [3] Это расширение полагается на многоадресную IP-рассылку для доставки запроса CoAP всем членам группы. Использование многоадресной рассылки имеет определенные преимущества, такие как уменьшение количества пакетов, необходимых для доставки запроса участникам. Однако многоадресная рассылка также имеет свои ограничения, такие как низкая надежность и недружественность к кешированию. Альтернативный метод групповой связи CoAP, использующий одноадресные вместо многоадресных рассылок, основан на наличии посредника, на котором создаются группы. Клиенты отправляют свои групповые запросы посреднику, который, в свою очередь, отправляет индивидуальные одноадресные запросы членам группы, собирает от них ответы и отправляет обратно агрегированный ответ клиенту. [4]
Безопасность
CoAP определяет четыре режима безопасности [5]
- NoSec, где DTLS отключен
- PreSharedKey, где DTLS включен, есть список предварительно общих ключей, и каждый ключ включает список узлов, с которыми он может использоваться для связи. Устройства должны поддерживать набор шифров AES.
- RawPublicKey, где DTLS включен и устройство использует асимметричную пару ключей без сертификата, который проверяется вне диапазона. Устройства должны поддерживать набор шифров AES и алгоритмы Elliptic Curve для обмена ключами.
- Сертификат, где DTLS включен и устройство использует сертификаты X.509 для проверки.
Были проведены исследования по оптимизации DTLS путем реализации партнеров по безопасности в качестве ресурсов CoAP, а не использования DTLS в качестве оболочки безопасности для трафика CoAP. Это исследование показало, что улучшения в 6,5 раз не оптимизировали реализации. [6]
В дополнение к DTLS, RFC8613 [7] определяет протокол безопасности объектов для ограниченных сред RESTful ( OSCORE ), который обеспечивает безопасность для CoAP на уровне приложений.
Проблемы с безопасностью
Хотя стандарт протокола включает положения по снижению угрозы атак DDoS- усиления [8], эти положения не реализуются на практике [9], что приводит к наличию более 580 000 целей, расположенных в основном в Китае, и атакам со скоростью до 320 Гбит / с. [10]
Смотрите также
- Интернет вещей
- OMA Легкий M2M
- Сеть вещей
- Сжатие заголовка статического контекста (SCHC)
Рекомендации
- ^ RFC 7252, протокол ограниченного приложения (CoAP)
- ^ " Интеграция беспроводных сенсорных сетей в Интернет ", Уолтер, Колитти, 2011 г.
- ^ RFC 7390, Групповая связь для CoAP
- ^ « Гибкая групповая связь на основе одноадресной передачи для устройств с поддержкой CoAP », Ishaq, I .; Hoebeke, J .; Van den Abeele, F .; Rossey, J .; Moerman, I .; Демейстер, П. Сенсоры 2014
- ^ RFC 7252, протокол ограниченного приложения (CoAP)
- ^ Капосселе, Анджело; Черво, Валерио; Де Чикко, Джанлука; Петриоли, Кьяра (июнь 2015 г.). «Безопасность как ресурс CoAP: оптимизированная реализация DTLS для IoT». IEEE : 529–554. DOI : 10.1109 / ICC.2015.7248379 .
- ^ Паломбини, Франческа; Зейтц, Людвиг; Селандер, Горан; Матссон, Джон. «Безопасность объектов для сред RESTful с ограничениями (OSCORE)» . tools.ietf.org . Проверено 7 мая 2021 .
- ^ «TLS 1.3 спасет всех нас и другие причины, по которым IoT по-прежнему небезопасен», Дэни Грант, 2017-12-24
- ^ «Когда машины не могут разговаривать: вопросы безопасности и конфиденциальности протоколов межмашинных данных», Федерико Магги и Райнер Восселер, 2018-12-06
- ^ «Протокол CoAP - следующая большая вещь для DDoS-атак», Каталин Чимпану, 2018-12-05
Внешние ссылки
- RFC 7252 «Протокол ограниченного приложения (CoAP)»
- coap.me - тестовый сервер CoAP, управляемый Бременским университетом