Protokół aplikacji z ograniczeniami — Constrained Application Protocol

Protokół aplikacji z ograniczeniami ( CoAP ) to wyspecjalizowany protokół aplikacji internetowych dla urządzeń z ograniczeniami, zgodnie z definicją w RFC 7252 . Umożliwia tym ograniczonym urządzeniom zwanym „węzłami” komunikowanie się z szerszym Internetem przy użyciu podobnych protokołów. CoAP jest przeznaczony do użytku między urządzeniami w tej samej sieci z ograniczeniami (np. sieci o niskim poborze mocy, sieci ze stratami), między urządzeniami i ogólnymi węzłami w Internecie oraz między urządzeniami w różnych sieciach z ograniczeniami, które są połączone przez Internet. CoAP jest również wykorzystywany za pośrednictwem innych mechanizmów, takich jak SMS w sieciach telefonii komórkowej.

CoAP to protokół warstwy usług , który jest przeznaczony do użytku w urządzeniach internetowych o ograniczonych zasobach, takich jak węzły sieci czujników bezprzewodowych . CoAP został zaprojektowany z myślą o łatwym tłumaczeniu na HTTP w celu uproszczenia integracji z Internetem, przy jednoczesnym spełnieniu specjalistycznych wymagań, takich jak obsługa multiemisji , bardzo niskie koszty ogólne i prostota. Multiemisja, niskie koszty ogólne i prostota są ważne dla Internetu rzeczy (IoT) i komunikacji maszyna-maszyna (M2M), które są zwykle głęboko osadzone i mają znacznie mniej pamięci i zasilania niż tradycyjne urządzenia internetowe. Dlatego bardzo ważna jest wydajność. CoAP może działać na większości urządzeń obsługujących UDP lub analog UDP.

Internet Engineering Task Force ( IETF ) Ograniczone relaksującego Środowiska Working Group ( rdzeń ) uczynił główną prac normalizacyjnych do niniejszego protokołu. Aby protokół był odpowiedni dla aplikacji IoT i M2M, dodano różne nowe funkcje.

Specyfikacja

Rdzeń protokołu jest określony w RFC 7252. Zaproponowano różne rozszerzenia, w szczególności:

  • RFC  7641 (2015) Obserwacja zasobów w protokole ograniczonej aplikacji
  • RFC  7959 (2016) Transfery blokowe w protokole ograniczonej aplikacji (CoAP)
  • RFC  8323 (2018) CoAP (Constrained Application Protocol) przez TCP, TLS i WebSockets
  • RFC  8974 (2021) Rozszerzone tokeny i klienci bezstanowe w ograniczonym protokole aplikacji (CoAP)

Formaty wiadomości

Najmniejsza wiadomość CoAP ma długość 4 bajtów, jeśli pominie się Token, Opcje i Ładunek. CoAP wykorzystuje dwa typy wiadomości, żądania i odpowiedzi, używając prostego, binarnego, podstawowego formatu nagłówka. Po nagłówku podstawowym mogą następować opcje w zoptymalizowanym formacie Type-Length-Value. CoAP jest domyślnie powiązany z UDP i opcjonalnie z DTLS , zapewniając wysoki poziom bezpieczeństwa komunikacji.

Wszelkie bajty po nagłówkach w pakiecie są uważane za treść wiadomości. Długość treści wiadomości wynika z długości datagramu. Po połączeniu z UDP, cała wiadomość MUSI zmieścić się w jednym datagramie. W przypadku użycia z 6LoWPAN, jak zdefiniowano w RFC 4944, komunikaty POWINNY pasować do pojedynczej ramki IEEE 802.15.4, aby zminimalizować fragmentację.

Nagłówek CoAP
Przesunięcia Oktet 0 1 2 3
Oktet Fragment 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 Rodzaj Długość tokena Kod żądania/odpowiedzi ID wiadomości
8 64 Token (0 - 8 bajtów)
12 96
16 128 Opcje (jeśli są dostępne)
20 160 1 1 1 1 1 1 1 1 Ładunek (jeśli jest dostępny)

Stały nagłówek CoAP: wersja, typ, długość tokena, kod żądania/odpowiedzi i identyfikator wiadomości.

Pierwsze 4 bajty są obowiązkowe we wszystkich datagramach CoAP.

Te pola można łatwo wyodrębnić z tych 4 bajtów w C za pomocą tych makr:

#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(data)      ( (data[2]<<8)|(data[3]) )

Wersja (VER) (2 bity)

Wskazuje numer wersji CoAP.

Typ (2 bity)

Opisuje typ komunikatu datagramu dla kontekstu dwóch typów komunikatów: żądania i odpowiedzi.
  • Wniosek
    • 0 : Potwierdzone : Ten komunikat oczekuje odpowiedniego komunikatu potwierdzenia.
    • 1 : Brak potwierdzenia : Ta wiadomość nie oczekuje komunikatu potwierdzającego.
  • Odpowiedź
    • 2: Potwierdzenie: Ta wiadomość jest odpowiedzią potwierdzającą wiadomość, którą można potwierdzić
    • 3 : Reset : Ta wiadomość wskazuje, że otrzymała wiadomość, ale nie może jej przetworzyć.

Długość tokena (4 bity)

Wskazuje długość pola Token o zmiennej długości, która może mieć długość od 0 do 8 bajtów.

Kod żądania/odpowiedzi (8 bitów)

0 1 2 3 4 5 6 7
Klasa Kod

Trzy najbardziej znaczące bity tworzą liczbę znaną jako „klasa”, która jest analogiczna do klasy kodów stanu HTTP . Pięć najmniej znaczących bitów tworzy kod, który przekazuje dalsze szczegóły dotyczące żądania lub odpowiedzi. Cały kod jest zazwyczaj przekazywany w formie class.code.

Najnowsze kody żądań/odpowiedzi CoAP można znaleźć pod adresem [1] , chociaż poniższa lista zawiera kilka przykładów:

  • Metoda: 0.XX
    1. PUSTY
    2. DOSTWAĆ
    3. POCZTA
    4. POŁOŻYĆ
    5. KASOWAĆ
    6. APORTOWAĆ
    7. ŁATA
    8. iPATCH
  • Sukces: 2.XX
    1. Utworzony
    2. Usunięto
    3. Ważny
    4. Zmieniono
    5. Zadowolony
    6. Kontyntynuj
  • Błąd klienta: 4.XX
    1. Zła prośba
    2. Nieautoryzowany
    3. Zła opcja
    4. Zabroniony
    5. Nie znaleziono
    6. Niedozwolona metoda
    7. Niedopuszczalne
    8. Żądanie niekompletne
    9. Konflikt
    10. Warunek wstępny nie powiódł się
    11. Wymagana jednostka jest za duża
    12. Nieobsługiwany format treści
  • Błąd serwera: 5.XX
    1. Wewnętrzny błąd serwera
    2. Nie zaimplementowano
    3. zła Brama
    4. serwis niedostępny
    5. Limit czasu bramy
    6. Nieobsługiwane proxy
  • Kody sygnalizacyjne: 7.XX
    1. Nieprzypisany
    2. CSM
    3. Świst
    4. Pong
    5. Uwolnienie
    6. Anulować

Identyfikator wiadomości (16 bitów)

Służy do wykrywania duplikacji wiadomości i dopasowywania wiadomości typu Acknowledgement/Reset do wiadomości typu Confirmable/Non-confirmable.:Wiadomości odpowiedzi będą miały ten sam identyfikator wiadomości, co żądanie.

Znak

Pole opcjonalne, którego rozmiar jest wskazany przez pole Długość tokenu, którego wartości są generowane przez klienta. Serwer musi przesłać echo każdej wartości tokena bez żadnych modyfikacji z powrotem do klienta. Jest przeznaczony do użycia jako identyfikator lokalny klienta, aby zapewnić dodatkowy kontekst dla niektórych jednoczesnych transakcji.

Opcja

Format opcji
Pozycje bitów
0 1 2 3 4 5 6 7
Różnica opcji Opcja Długość
Opcja Delta Extended (Brak, 8 bitów, 16 bitów)
Rozszerzona długość opcji (brak, 8 bitów, 16 bitów)
Wartość opcji

Różnica opcji:

  • 0 do 12: Dla delta od 0 do 12: Reprezentuje dokładną wartość delty między ostatnim identyfikatorem opcji a żądanym identyfikatorem opcji, bez wartości Option Delta Extended
  • 13: Dla delta od 13 do 268: Option Delta Extended to 8-bitowa wartość, która reprezentuje wartość Option Delta minus 13
  • 14: Dla delta od 269 do 65 804: Option Delta Extended to 16-bitowa wartość, która reprezentuje wartość Option Delta minus 269
  • 15: Zarezerwowane dla znacznika ładunku, gdzie Delta opcji i Długość opcji są ustawione razem jako 0xFF.

Długość opcji:

  • 0 do 12: Dla opcji Długość od 0 do 12: Reprezentuje dokładną wartość długości, bez wartości Rozszerzona długość opcji
  • 13: Dla długości opcji od 13 do 268: Rozszerzona długość opcji to wartość 8-bitowa, która reprezentuje wartość długości opcji minus 13
  • 14: Dla długości opcji od 269 do 65 804: Rozszerzona długość opcji to 16-bitowa wartość, która reprezentuje wartość długości opcji minus 269
  • 15: Zarezerwowane do wykorzystania w przyszłości. Jest to błąd, jeśli pole Długość opcji jest ustawione na 0xFF.

Wartość opcji:

  • Rozmiar pola Wartość opcji określa wartość Długość opcji w bajtach.
  • Semantyka i format tego pola zależy od odpowiedniej opcji.

Realizacje

Nazwa Język programowania Wdrożona wersja CoAP Klient/serwer Wdrożone funkcje CoAP Licencja Połączyć
aiocoap Pyton 3 RFC 7252 Klient + Serwer Transfery blokowe, obserwacja (częściowe) MIT https://pypi.python.org/pypi/aiocoap
Kaliforn Jawa RFC 7252, RFC 7641, RFC 7959 Klient + Serwer Obserwuj, blokowe transfery, multicast (od wersji 2.x), DTLS (+ DTLS 1.2 Connection ID) EPL+EDL https://www.eclipse.org/californium https://github.com/eclipse/californium
cantcoap C++/C RFC 7252 Klient + Serwer BSD https://github.com/staropram/cantcoap
Canopus Udać się RFC 7252 Klient + Serwer Rdzeń Licencja Apache 2.0 https://github.com/zubairhamed/canopus
Go-CoAP Udać się RFC 7252, RFC 8232, RFC 7641, RFC 7959 Klient + Serwer Rdzeń, obserwacja, blokowanie, multiemisja, TCP/TLS Licencja Apache 2.0 https://github.com/go-ocf/go-coap
Wdrożenie CoAP dla Go Udać się RFC 7252 Klient + Serwer Subskrypcja rdzenia + wersja robocza MIT https://github.com/dustin/go-coap
CoAP.NET C# RFC 7252, coap-13, coap-08, coap-03 Klient + Serwer Transfery podstawowe, obserwacyjne, blokowe 3-klauzulowy BSD https://github.com/smeshlink/CoAP.NET
CoAPSharp C#, .NET RFC 7252 Klient + Serwer Rdzeń, obserwacja, blok, RD LGPL http://www.coapsharp.com
CoAPthon Pyton RFC 7252 Klient + Serwer + Proxy Przesyłające + Odwrotne Proxy Obserwacja, wykrywanie serwerów multicast, parsowanie formatu CoRE Link, blokowanie MIT https://github.com/Tanganelli/CoAPthon
Powłoka CoAP Jawa RFC 7252 Klient Obserwuj, blokowe transfery, DTLS Licencja Apache 2.0 https://github.com/tzolov/coap-shell
Miedź JavaScript (wtyczka przeglądarki) RFC 7252 Klient Obserwuj, blokowe transfery 3-klauzulowy BSD https://github.com/mkovatsc/Miedź https://addons.mozilla.org/firefox/addon/copper-270430/
eCoAP C RFC 7252 Klient + Serwer Rdzeń MIT https://gitlab.com/jobol/ecoap
Erb dla Contiki C RFC 7252 Klient + Serwer Obserwuj, blokowe transfery 3-klauzulowy BSD http://www.contiki-os.org/ (przykład-odpoczynku)
FreeCoAP C RFC 7252 Klient + serwer + proxy HTTP/CoAP Transfery rdzeniowe, DTLS, blokowe BSD https://github.com/keith-cullen/FreeCoAP
iCoAP Cel C RFC 7252 Klient Transfery podstawowe, obserwacyjne, blokowe MIT https://github.com/stuffrabbit/iCoAP
java-coap Jawa RFC 7252, RFC 7641, RFC 7959, RFC 8323 Klient + Serwer Licencja Apache 2.0 https://github.com/PelionIoT/java-coap
jCoAP Jawa RFC 7252 Klient + Serwer Obserwuj, blokowe transfery Licencja Apache 2.0 https://code.google.com/p/jcoap/
libcoap C RFC 7252 Klient + Serwer Obserwuj, blokowe transfery, DTLS BSD/GPL https://github.com/obgm/libcoap
LibNyoci C RFC 7252 Klient + Serwer Rdzeń, obserwacja, blokowanie, DTLS MIT https://github.com/darconeous/libnyoci
lobaro-coap C RFC 7252 Klient + Serwer Obserwuj, blokowe transfery MIT http://www.lobaro.com/lobaro-coap
mikropęcherzyk C RFC 7252 Klient + Serwer MIT https://github.com/1248/microcoap
mikroCoAPy MicroPython RFC 7252 Klient + Serwer Rdzeń Licencja Apache 2.0 https://github.com/insighio/microCoAPy
nanokoapa C RFC 7252 Klient + Serwer Transfery rdzeniowe, blokowe LGPL https://api.riot-os.org/group__net__nanocoap.html
nCoap Jawa RFC 7252 Klient + Serwer Obserwacja, transfery blokowe, format łącza CoRE, szkic identyfikatora punktu końcowego BSD https://github.com/okleine/nCoAP
węzeł-coap JavaScript RFC 7252,

RFC 7641, RFC 7959

Klient + Serwer Rdzeń, obserwuj, blok MIT https://github.com/mcollina/node-coap
Rubinowa czapka Rubin RFC 7252 Klient + Serwer (david) Rdzeń, obserwacja, blok, RD MIT, GPL https://github.com/nning/coap
https://github.com/nning/david
Biblioteka urządzeń Sensinode C C RFC 7252 Klient + Serwer Rdzeń, obserwacja, blok, RD Handlowy https://silver.arm.com/browse/SEN00
Biblioteka urządzeń Sensinode Java Java SE RFC 7252 Klient + Serwer Rdzeń, obserwacja, blok, RD Handlowy https://silver.arm.com/browse/SEN00
Platforma Sensinode NanoService Java SE RFC 7252 Serwer w chmurze Rdzeń, obserwacja, blok, RD Handlowy https://silver.arm.com/browse/SEN00
SwiftCoAP Szybki RFC 7252 Klient + Serwer Transfery podstawowe, obserwacyjne, blokowe MIT https://github.com/stuffrabbit/SwiftCoAP
TinyOS CoapBlip neC/C coap-13 Klient + Serwer Obserwuj, blokowe transfery BSD https://web.archive.org/web/20130312140509/http://docs.tinyos.net/tinywiki/index.php/CoAP
txThings Python (zakręcony) RFC 7252 Klient + Serwer Transfery blokowe, obserwacja (częściowe) MIT https://github.com/mwasilak/txThings/
coap-rs Rdza RFC 7252 Klient + Serwer Rdzeń, multiemisja, opcja obserwacji, kod odpowiedzi na zbyt wiele żądań MIT https://github.com/Coverness/coap-rs

https://docs.rs/coap/

YaCoAP C MIT https://github.com/RIOT-Makers/YaCoAP

Implementacje proxy

Komunikacja grupowa CoAP

W wielu domenach aplikacji CoAP niezbędna jest możliwość adresowania kilku zasobów CoAP jako grupy, zamiast adresowania każdego zasobu indywidualnie (np. włączenie wszystkich świateł z włączonym CoAP w pomieszczeniu za pomocą pojedynczego żądania CoAP wywołanego przez przełączenie przełącznik światła). Aby sprostać tej potrzebie, IETF opracował opcjonalne rozszerzenie dla CoAP w formie eksperymentalnego RFC: Group Communication for CoAP - RFC 7390 Rozszerzenie to opiera się na multiemisji IP w celu dostarczenia żądania CoAP do wszystkich członków grupy. Korzystanie z multiemisji ma pewne zalety, takie jak zmniejszenie liczby pakietów potrzebnych do dostarczenia żądania do członków. Jednak multiemisja ma również swoje ograniczenia, takie jak słaba niezawodność i nieprzyjazny dla pamięci podręcznej. Alternatywna metoda komunikacji grupowej CoAP, która wykorzystuje unicasty zamiast multicastów, polega na posiadaniu pośrednika, w którym tworzone są grupy. Klienci wysyłają swoje żądania grupowe do pośrednika, który z kolei wysyła indywidualne żądania emisji pojedynczej do członków grupy, zbiera od nich odpowiedzi i odsyła zagregowaną odpowiedź do klienta.

Bezpieczeństwo

CoAP definiuje cztery tryby bezpieczeństwa

  • NoSec, gdzie DTLS jest wyłączony
  • PreSharedKey, gdy DTLS jest włączony, istnieje lista wstępnie udostępnionych kluczy, a każdy klucz zawiera listę węzłów, z którymi może się komunikować. Urządzenia muszą obsługiwać zestaw szyfrów AES.
  • RawPublicKey, gdzie włączony jest DTLS, a urządzenie używa asymetrycznej pary kluczy bez certyfikatu, która jest weryfikowana poza pasmem. Urządzenia muszą obsługiwać zestaw szyfrów AES i algorytmy krzywej eliptycznej do wymiany kluczy.
  • Certyfikat, w którym włączona jest obsługa DTLS, a urządzenie używa certyfikatów X.509 do walidacji.

Przeprowadzono badania nad optymalizacją DTLS poprzez zaimplementowanie partnerów bezpieczeństwa jako zasobów CoAP zamiast używania DTLS jako opakowania bezpieczeństwa dla ruchu CoAP. Badanie to wykazało, że ulepszenia do 6,5 razy nie zoptymalizowane wdrożeń.

Oprócz DTLS, RFC8613 definiuje protokół Object Security for Constrained RESTful Environments ( OSCORE ), który zapewnia bezpieczeństwo dla CoAP w warstwie aplikacji.

Problemy z bezpieczeństwem

Chociaż standard protokołu zawiera zapisy dotyczące łagodzenia zagrożenia atakami wzmacniającymi DDoS , postanowienia te nie są w praktyce implementowane, co skutkuje obecnością ponad 580 000 celów zlokalizowanych głównie w Chinach i atakami o przepustowości do 320 Gb/s.

Zobacz też

Bibliografia

Zewnętrzne linki