Протокол ограниченного приложения - Constrained Application Protocol

Протокол ограниченного приложения (CoAP) - это специализированный протокол Интернет-приложений для ограниченных устройств, как определено в RFC 7252. Он позволяет этим ограниченным устройствам, называемым «узлами», связываться с более широким Интернетом с использованием аналогичных протоколов. CoAP предназначен для использования между устройствами в одной и той же сети с ограничениями (например, маломощные сети с потерями), между устройствами и общими узлами в Интернете, а также между устройствами в разных сетях с ограничениями, которые соединены Интернетом. CoAP также используется с помощью других механизмов, таких как SMS в сетях мобильной связи.

CoAP - это уровень обслуживания протокол, который предназначен для использования в интернет-устройствах с ограниченными ресурсами, таких как беспроводная сенсорная сеть узлы. CoAP разработан так, чтобы легко переводить на HTTP для упрощенной интеграции с Интернетом, а также отвечает специальным требованиям, таким как многоадресная передача поддержка, очень низкие накладные расходы и простота.[1][2] Многоадресная рассылка, низкие накладные расходы и простота чрезвычайно важны для Интернет вещей (IoT) и От машины к машине (M2M) устройства, которые имеют тенденцию встроенный и у них намного меньше памяти и источника питания, чем у традиционных интернет-устройств. Поэтому эффективность очень важна. CoAP может работать на большинстве устройств, поддерживающих UDP или аналог UDP.

Инженерная группа Интернета (IETF ) С ограничениями RESTful Рабочая группа по окружающей среде (CoRE ) выполнил основную работу по стандартизации этого протокола. Чтобы сделать протокол пригодным для приложений IoT и M2M, были добавлены различные новые функции. Ядро протокола указано в RFC 7252; важные расширения находятся на разных этапах процесса стандартизации.

особенности

Форматы сообщений

Наименьшее сообщение CoAP имеет длину 4 байта, если не учитывать токен, параметры и полезную нагрузку. CoAP использует два типа сообщений, запросы и ответы, используя простой двоичный формат базового заголовка. За базовым заголовком могут следовать параметры в оптимизированном формате «тип-длина-значение». CoAP по умолчанию привязан к UDP и необязательно DTLS, обеспечивающий высокий уровень безопасности связи.

Любые байты после заголовков в пакете считаются телом сообщения. Длина тела сообщения определяется длиной дейтаграммы. При привязке к UDP все сообщение ДОЛЖНО помещаться в одну дейтаграмму. При использовании с 6LoWPAN как определено в RFC 4944 сообщения ДОЛЖНЫ помещаться в один IEEE 802.15.4 рамка для минимизации фрагментации.

Заголовок CoAP
СмещенияОктет0123
ОктетНемного012345678910111213141516171819202122232425262728293031
432VERТипДлина токенаКод запроса / ответаID сообщения
864Токен (0-8 байт)
1296
16128Опции (при наличии)
2016011111111Полезная нагрузка (при наличии)

Фиксированный заголовок CoAP: версия, тип, длина токена, код запроса / ответа и идентификатор сообщения.

Первые 4 байта являются обязательными во всех дейтаграммах CoAP.

Эти поля можно легко извлечь из этих 4 байтов в C с помощью этих макросов:

#define COAP_HEADER_VERSION (данные) ((0xC0 & data [0]) >> 6)#define COAP_HEADER_TYPE (данные) ((0x30 & data [0]) >> 4)#define COAP_HEADER_TKL (данные) ((0x0F & data [0]) >> 0)#define COAP_HEADER_CLASS (данные) (((данные [1] >> 5) & 0x07))#define COAP_HEADER_CODE (данные) (((данные [1] >> 0) & 0x1F))#define COAP_HEADER_MID (данные) ((данные [2] << 8) | (данные [3]))

Версия (VER) (2 бита)

Указывает номер версии CoAP.

Тип (2 бита)

Это описывает тип сообщения дейтаграммы для контекста двух типов сообщений - запроса и ответа.
  • Запрос
    • 0: Подтверждаемый: это сообщение ожидает соответствующего сообщения подтверждения.
    • 1: Не подтверждается: это сообщение не ожидает сообщения подтверждения.
  • отклик
    • 2: Подтверждение: это сообщение является ответом, подтверждающим подтверждаемое сообщение.
    • 3: Сброс: это сообщение означает, что он получил сообщение, но не смог его обработать.

Длина токена (4 бита)

Указывает длину поля токена переменной длины, которая может составлять 0-8 байтов.

Код запроса / ответа (8 бит)

01234567
КлассКод

Три наиболее значимых бита образуют число, известное как «класс», которое аналогично класс кодов состояния HTTP. Пять наименее значимых битов образуют код, который сообщает дополнительную информацию о запросе или ответе. Весь код обычно передается в форме class.code .

Вы можете найти последние коды запросов / ответов CoAP по адресу [1], хотя в списке ниже приведены некоторые примеры:

    1. Метод: 0.XX
      1. ПУСТО
      2. ПОЛУЧИТЬ
      3. СООБЩЕНИЕ
      4. ПОЛОЖИЛ
      5. УДАЛИТЬ
      6. ПОЛУЧИТЬ
      7. ПАТЧ
      8. iPATCH
    2. Успех: 2.XX
      1. Создано
      2. Удалено
      3. Действительный
      4. Изменено
      5. Содержание
      6. Продолжать
    1. Ошибка клиента: 4.XX
      1. Плохой запрос
      2. Неавторизованный
      3. Плохой вариант
      4. Запрещено
      5. не обнаружена
      6. метод не разрешен
      7. Неприемлимо
      8. Запрос Entity Incomplete
      9. Конфликт
      10. Предварительное условие не выполнено
      11. Слишком большой объект запроса
      12. Неподдерживаемый формат содержимого
    1. Ошибка сервера: 5.XX
      1. Внутренняя ошибка сервера
      2. Не реализована
      3. Плохой шлюз
      4. Сервис недоступен
      5. Тайм-аут шлюза
      6. Проксирование не поддерживается
    2. Коды сигнализации: 7.XX
      1. Не назначен
      2. CSM
      3. пинг
      4. Понг
      5. Выпуск
      6. Прервать

Идентификатор сообщения (16 бит)

Используется для обнаружения дублирования сообщений и сопоставления сообщений типа Acknowledgment / Reset с сообщениями типа Confirmable / Non-confirmable.: Ответные сообщения будут иметь тот же идентификатор сообщения, что и запрос.

Токен

Необязательное поле, размер которого указан в поле «Длина токена», значения которого генерируются клиентом. Сервер должен отображать каждое значение токена без каких-либо изменений обратно клиенту. Он предназначен для использования в качестве локального идентификатора клиента, чтобы предоставить дополнительный контекст для определенных параллельных транзакций.

Вариант

Формат варианта
Битовые позиции
01234567
Вариант ДельтаДлина варианта
Опция 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: для параметра 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 3RFC 7252Клиент + СерверБлочные переводы, наблюдение (частичное)Массачусетский технологический институтhttps://pypi.python.org/pypi/aiocoap
КалифорнийЯваRFC 7252Клиент + СерверНаблюдать, Блочные переводы, DTLSEPL + EDLhttps://www.eclipse.org/californium
банщикC ++ / CRFC 7252Клиент + СерверBSDhttps://github.com/staropram/cantcoap
КанопусИдтиRFC 7252Клиент + СерверЯдроЛицензия Apache 2.0https://github.com/zubairhamed/canopus
Go-CoAPИдтиRFC 7252, RFC 8232, RFC 7641, RFC 7959Клиент + СерверЯдро, наблюдение, поблочно, многоадресная передача, TCP / TLSЛицензия Apache 2.0https://github.com/go-ocf/go-coap
Реализация CoAP для GoИдтиRFC 7252Клиент + СерверCore + Draft ПодписатьсяМассачусетский технологический институтhttps://github.com/dustin/go-coap
CoAP.NETC #RFC 7252, coap-13, coap-08, coap-03Клиент + СерверЯдро, наблюдение, поблочные переводы3-пункт BSDhttps://github.com/smeshlink/CoAP.NET
CoAPSharpC #, .NETRFC 7252Клиент + СерверЯдро, Наблюдать, Блок, RDLGPLhttp://www.coapsharp.com
CoAPthonPythonRFC 7252Клиент + Сервер + Прямой прокси + Обратный проксиНаблюдение, обнаружение многоадресного сервера, синтаксический анализ формата ссылки CoRE, поблочноМассачусетский технологический институтhttps://github.com/Tanganelli/CoAPthon
CoAP ShellЯваRFC 7252КлиентНаблюдать, Блочные переводы, DTLSЛицензия Apache 2.0https://github.com/tzolov/coap-shell
МедьJavaScript (плагин для браузера)RFC 7252КлиентНаблюдать, блочные переводы3-пункт BSDhttps://github.com/mkovatsc/Copper https://addons.mozilla.org/firefox/addon/copper-270430/[постоянная мертвая ссылка ]
eCoAPCRFC 7252Клиент + СерверЯдроМассачусетский технологический институтhttps://gitlab.com/jobol/ecoap
Эрбий для ContikiCRFC 7252Клиент + СерверНаблюдать, блочные переводы3-пункт BSDhttp://www.contiki-os.org/ (э-отдых-пример)
iCoAPЦель-CRFC 7252КлиентЯдро, наблюдение, поблочные переводыМассачусетский технологический институтhttps://github.com/stuffrabbit/iCoAP
java-coapЯваRFC 7252, RFC 7641, RFC 7959, RFC 8323Клиент + СерверЛицензия Apache 2.0https://github.com/PelionIoT/java-coap
jCoAPЯваRFC 7252Клиент + СерверНаблюдать, блочные переводыЛицензия Apache 2.0https://code.google.com/p/jcoap/
libcoapCRFC 7252Клиент + СерверНаблюдать, Блочные переводы, DTLSBSD / GPLhttps://github.com/obgm/libcoap
LibNyociCRFC 7252Клиент + СерверЯдро, Наблюдать, Блокировать, DTLSМассачусетский технологический институтhttps://github.com/darconeous/libnyoci
лобароCRFC 7252Клиент + СерверНаблюдать, блочные переводыМассачусетский технологический институтhttp://www.lobaro.com/lobaro-coap
микрокопCRFC 7252Клиент + СерверМассачусетский технологический институтhttps://github.com/1248/microcoap
microCoAPyMicroPythonRFC 7252Клиент + СерверЯдроЛицензия Apache 2.0https://github.com/insighio/microCoAPy
наномылоCRFC 7252Клиент + СерверОсновные, блочные переводыLGPLhttps://api.riot-os.org/group__net__nanocoap.html
nCoapЯваRFC 7252Клиент + СерверНаблюдать, поблочные передачи, формат ссылки CoRE, Конечная точка-ID-ЧерновикBSDhttps://github.com/okleine/nCoAP
узелокJavascriptRFC 7252Клиент + СерверЯдро, Наблюдать, БлокироватьМассачусетский технологический институтhttps://github.com/mcollina/node-coap
Рубиновый колпакРубинRFC 7252Клиент + Сервер (Дэвид)Ядро, Наблюдать, Блок, RDMIT, GPLhttps://github.com/nning/coap
https://github.com/nning/david
Библиотека устройств Sensinode CCRFC 7252Клиент + СерверЯдро, Наблюдать, Блок, RDКоммерческийhttps://silver.arm.com/browse/SEN00
Библиотека устройств Java SensinodeJava SERFC 7252Клиент + СерверЯдро, Наблюдать, Блок, RDКоммерческийhttps://silver.arm.com/browse/SEN00
Платформа Sensinode NanoServiceJava SERFC 7252Облачный серверЯдро, Наблюдать, Блок, RDКоммерческийhttps://silver.arm.com/browse/SEN00
SwiftCoAPSwiftRFC 7252Клиент + СерверЯдро, наблюдение, поблочные переводыМассачусетский технологический институтhttps://github.com/stuffrabbit/SwiftCoAP
TinyOS CoapBlipnesC / Ccoap-13Клиент + СерверНаблюдать, блочные переводыBSDhttps://web.archive.org/web/20130312140509/http://docs.tinyos.net/tinywiki/index.php/CoAP
txThingsPython (витой)RFC 7252Клиент + СерверБлочные переводы, наблюдение (частичное)Массачусетский технологический институтhttps://github.com/mwasilak/txThings/
FreeCoAPCRFC 7252Клиент + сервер + HTTP / CoAP проксиCore, DTLS, блочные переводыBSDhttps://github.com/keith-cullen/FreeCoAP
Coap-RSРжавчинаRFC 7252Клиент + СерверЯдро, DTLS, многоадресная передача, опция наблюдения, Слишком много запросов Код ответаМассачусетский технологический институтhttps://github.com/Covertness/coap-rs

https://docs.rs/coap/

YaCoAPCМассачусетский технологический институтhttps://github.com/RIOT-Makers/YaCoAP

Реализации прокси

Групповое общение 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]

Проблемы с безопасностью

Хотя стандарт протокола включает положения по уменьшению угрозы DDoS атаки усиления,[7] эти положения не реализуются на практике,[8] что приводит к наличию более 580 000 целей, в основном расположенных в Китае, и атакам со скоростью до 320 Гбит / с.[9]

Смотрите также

использованная литература

  1. ^ RFC 7252, протокол ограниченного приложения (CoAP)
  2. ^ "Интеграция беспроводных сенсорных сетей в Интернет ", Уолтер, Колитти 2011
  3. ^ RFC 7390, Групповая коммуникация для CoAP
  4. ^ "Гибкая групповая связь на основе одноадресной передачи для устройств с поддержкой CoAP ", Ishaq, I .; Hoebeke, J .; Van den Abeele, F .; Rossey, J.; Moerman, I .; Demeester, P. Sensors 2014
  5. ^ RFC 7252, протокол ограниченного приложения (CoAP)
  6. ^ Капосселе, Анджело; Черво, Валерио; Де Чикко, Джанлука; Петриоли, Кьяра (июнь 2015 г.). «Безопасность как ресурс CoAP: оптимизированная реализация DTLS для IoT». IEEE: 529–554. Дои:10.1109 / ICC.2015.7248379.
  7. ^ «TLS 1.3 спасет всех нас и другие причины, по которым IoT по-прежнему небезопасен», Дэни Грант, 2017-12-24
  8. ^ «Когда машины не могут разговаривать: вопросы безопасности и конфиденциальности протоколов межмашинных данных», Федерико Магги и Райнер Восселер, 2018-12-06
  9. ^ «Протокол CoAP - это следующая большая вещь для DDoS-атак», Каталин Чимпану, 2018-12-05

внешние ссылки