Протокол ограниченного приложения - 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 рамка для минимизации фрагментации.
Смещения | Октет | 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 (данные) ((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 бит)
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: для параметра 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 | Клиент + Сервер | Наблюдать, Блочные переводы, DTLS | EPL + EDL | https://www.eclipse.org/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/ (э-отдых-пример) |
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, Конечная точка-ID-Черновик | BSD | https://github.com/okleine/nCoAP |
узелок | Javascript | RFC 7252 | Клиент + Сервер | Ядро, Наблюдать, Блокировать | Массачусетский технологический институт | https://github.com/mcollina/node-coap |
Рубиновый колпак | Рубин | RFC 7252 | Клиент + Сервер (Дэвид) | Ядро, Наблюдать, Блок, RD | MIT, 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 | Swift | 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/ |
FreeCoAP | C | RFC 7252 | Клиент + сервер + HTTP / CoAP прокси | Core, DTLS, блочные переводы | BSD | https://github.com/keith-cullen/FreeCoAP |
Coap-RS | Ржавчина | RFC 7252 | Клиент + Сервер | Ядро, DTLS, многоадресная передача, опция наблюдения, Слишком много запросов Код ответа | Массачусетский технологический институт | https://github.com/Covertness/coap-rs |
YaCoAP | C | Массачусетский технологический институт | https://github.com/RIOT-Makers/YaCoAP |
Реализации прокси
- Squid 3.1.9 с прозрачным модулем отображения HTTP-CoAP
- прокси jcoap
- Калифорнийский cf-прокси
- 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]
Проблемы с безопасностью
Хотя стандарт протокола включает положения по уменьшению угрозы DDoS атаки усиления,[7] эти положения не реализуются на практике,[8] что приводит к наличию более 580 000 целей, в основном расположенных в Китае, и атакам со скоростью до 320 Гбит / с.[9]
Смотрите также
использованная литература
- ^ RFC 7252, протокол ограниченного приложения (CoAP)
- ^ "Интеграция беспроводных сенсорных сетей в Интернет ", Уолтер, Колитти 2011
- ^ RFC 7390, Групповая коммуникация для CoAP
- ^ "Гибкая групповая связь на основе одноадресной передачи для устройств с поддержкой CoAP ", Ishaq, I .; Hoebeke, J .; Van den Abeele, F .; Rossey, J.; Moerman, I .; Demeester, P. Sensors 2014
- ^ RFC 7252, протокол ограниченного приложения (CoAP)
- ^ Капосселе, Анджело; Черво, Валерио; Де Чикко, Джанлука; Петриоли, Кьяра (июнь 2015 г.). «Безопасность как ресурс CoAP: оптимизированная реализация DTLS для IoT». IEEE: 529–554. Дои:10.1109 / ICC.2015.7248379.
- ^ «TLS 1.3 спасет всех нас и другие причины, по которым IoT по-прежнему небезопасен», Дэни Грант, 2017-12-24
- ^ «Когда машины не могут разговаривать: вопросы безопасности и конфиденциальности протоколов межмашинных данных», Федерико Магги и Райнер Восселер, 2018-12-06
- ^ «Протокол CoAP - это следующая большая вещь для DDoS-атак», Каталин Чимпану, 2018-12-05
внешние ссылки
- Краткое описание функций и спецификаций, а также списки библиотек и инструментов языков программирования
- Интерактивные тесты взаимодействия веб-серверов
- RFC 7252 «Протокол ограниченного приложения (CoAP)»