Protocolo de Aplicação Restrita

O Protocolo de Aplicação Restrita (mais conhecido pela sigla CoAP, Constrained Application Protocol em inglês) é um protocolo de aplicação de internet especializado baseado em UDP para dispositivos restritos, conforme definido na RFC 7252 (publicada em 2014). Ele permite que esses dispositivos restritos, chamados de "nós", comuniquem-se com a internet em geral usando protocolos semelhantes. O CoAP foi projetado para uso entre dispositivos na mesma rede restrita (por exemplo, redes de baixa potência e com perdas), entre dispositivos e nós gerais na internet e entre dispositivos em diferentes redes restritas, ambas unidas por uma internet. O CoAP também vem sendo utilizado por meio de outros mecanismos, como SMS em redes de comunicação móvel.

O CoAP é um protocolo de camada de aplicação destinado ao uso em dispositivos de internet com recursos restritos, como nós de rede de sensores sem fio. O CoAP foi projetado para traduzir-se facilmente para HTTP para integração simplificada com a web, ao mesmo tempo em que atende a requisitos especializados, como suporte a multicast, overhead (sobrecarga) muito baixo e simplicidade. Multicast, baixo overhead e simplicidade são importantes para a Internet das Coisas (IoT) e para a comunicação máquina a máquina (M2M), que tendem a ser de sistemas embarcados e possuem muito menos memória e capacidade de alimentação do que os dispositivos tradicionais de internet. Portanto, a eficiência é de suma importância. O CoAP pode rodar na maioria dos dispositivos que suportam UDP ou um análogo ao UDP. Ele serve como base para outros serviços de internet, como o DNS sobre CoAP.

O Grupo de Trabalho de Ambientes RESTful Restritos da Internet Engineering Task Force (IETF) (CoRE) realizou o principal trabalho de padronização para este protocolo. Para tornar o protocolo adequado para aplicações de IoT e M2M, várias novas funções foram adicionadas.

Especificação

O núcleo do protocolo está especificado na RFC 7252. Várias extensões foram propostas, particularmente:

Formatos de mensagem

O CoAP utiliza dois tipos de mensagem, requisições e respostas, empregando um formato de cabeçalho binário simples. O CoAP é vinculado por padrão ao UDP e opcionalmente ao DTLS, fornecendo um alto nível de segurança de comunicação. Quando vinculado ao UDP, a mensagem inteira deve caber em um único datagrama. Quando usado com o 6LoWPAN conforme definido na RFC 4944, as mensagens devem caber em um único quadro IEEE 802.15.4 para minimizar a fragmentação.

A menor mensagem CoAP tem 4 bytes de comprimento, se os campos de token, opções e carga útil (payload) forem omitidos, ou seja, se consistir apenas no cabeçalho CoAP. O cabeçalho é seguido pelo valor do token (0 a 8 bytes), que pode ser seguido por uma lista de opções em um formato otimizado de tipo–comprimento–valor (TLV). Quaisquer bytes após o cabeçalho, token e opções (se houver) são considerados a carga útil da mensagem, que é prefixada pelo "marcador de carga útil" de um byte (0xFF). O comprimento da carga útil é implícito pelo comprimento do datagrama.

Mensagem CoAP
Deslocamento de octeto0123
Deslocamento de bit012345678910111213141516171819202122232425262728293031
432 vertipocomp. tokencódigo req./resp.ID da mensagem
864 token (0–8 bytes)
1296
16128 opções (se disponíveis)
20160 11111111carga útil (se disponível)

Cabeçalho de tamanho fixo do CoAP

Os primeiros 4 bytes são obrigatórios em todos os datagramas CoAP; eles constituem o cabeçalho de tamanho fixo.

Esses campos podem ser extraídos desses 4 bytes em C por meio destas macros:

#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] )

Versão (ver) (2 bits)

Indica o número da versão do CoAP.

Tipo (2 bits)

Descreve o tipo de mensagem do datagrama para os dois contextos de tipo de mensagem de Requisição e Resposta.
  • Requisição (Request)
    • 0 : Confirmável (Confirmable) : Esta mensagem espera uma mensagem de reconhecimento correspondente.
    • 1 : Não confirmável (Non-confirmable) : Esta mensagem não espera uma mensagem de confirmação.
  • Resposta (Response)
    • 2 : Reconhecimento (Acknowledgement) : Esta mensagem é uma resposta que reconhece uma mensagem confirmável.
    • 3 : Redefinição/Reset (Reset) : Esta mensagem indica que recebeu uma mensagem, mas não pôde processá-la.

Comprimento do token (4 bits)

Indica o comprimento do campo Token de comprimento variável, que pode ter 0–8 bytes de comprimento.

Código de requisição/resposta (8 bits)

0 1 2 3 4 5 6 7
Classe Código

Os três bits mais significativos formam um número conhecido como "classe", que é análogo à classe de códigos de status HTTP. Os cinco bits menos significativos formam um código que comunica mais detalhes sobre a requisição ou resposta. O código inteiro é tipicamente comunicado na forma classe.código.

Você pode encontrar os códigos mais recentes de requisição/resposta do CoAP em , embora a lista abaixo forneça alguns exemplos:

  • Método (Method): 0.XX
    1. VAZIO (EMPTY)
    2. GET
    3. POST
    4. PUT
    5. DELETE
    6. FETCH
    7. PATCH
    8. iPATCH
  • Sucesso (Success): 2.XX
    1. Criado (Created)
    2. Excluído (Deleted)
    3. Válido (Valid)
    4. Alterado (Changed)
    5. Conteúdo (Content)
    6. Continuar (Continue)
  • Erro do Cliente (Client Error): 4.XX
    1. Requisição Inválida (Bad Request)
    2. Não Autorizado (Unauthorized)
    3. Opção Inválida (Bad Option)
    4. Proibido (Forbidden)
    5. Não Encontrado (Not Found)
    6. Método Não Permitido (Method Not Allowed)
    7. Não Aceitável (Not Acceptable)
    8. Entidade da Requisição Incompleta (Request Entity Incomplete)
    9. Conflito (Conflict)
    10. Falha de Pré-condição (Precondition Failed)
    11. Entidade da Requisição Muito Grande (Request Entity Too Large)
    12. Formato de Conteúdo Não Suportado (Unsupported Content-Format)
  • Erro do Servidor (Server error): 5.XX
    1. Erro interno do servidor (Internal server error)
    2. Não implementado (Not implemented)
    3. Gateway inválido (Bad gateway)
    4. Serviço indisponível (Service unavailable)
    5. Tempo limite do gateway (Gateway timeout)
    6. Proxy não suportado (Proxying not supported)
  • Códigos de Sinalização (Signaling Codes): 7.XX
    1. Não atribuído (Unassigned)
    2. CSM
    3. Ping
    4. Pong
    5. Liberação (Release)
    6. Interrupção (Abort)

ID da mensagem (16 bits)

Usado para detectar duplicação de mensagens e para associar mensagens do tipo reconhecimento/redefinição (acknowledgement/reset) a mensagens do tipo confirmável/não confirmável (confirmable/non-confirmable).

Token

Cada requisição carrega um token (mas pode ter comprimento zero) cujo valor foi gerado pelo cliente. O servidor deve ecoar cada valor de token sem qualquer modificação de volta para o cliente na resposta correspondente. Ele destina-se ao uso como um identificador local do cliente para associar requisições e respostas, especialmente para requisições concorrentes.

A associação de requisições e respostas não é feita com o ID da mensagem porque uma resposta pode ser enviada em uma mensagem diferente do reconhecimento (que usa o ID da mensagem para associação). Por exemplo, isso pode ser feito para evitar retransmissões se a obtenção do resultado levar algum tempo. Essa resposta separada é chamada de "resposta separada" (separate response). Em contrapartida, transmitir a resposta diretamente no reconhecimento é chamado de "resposta acoplada" ou "resposta embutida/piggybacked" (piggybacked response), que deve ser preferida por motivos de eficiência.

Opção

Formato da Opção
Posição do bit
0 1 2 3 4 5 6 7
Delta da opção Comprimento da opção
Delta da opção estendido (nenhum, 8 bits, 16 bits)
Comprimento da opção estendido (nenhum, 8 bits, 16 bits)
Valor da opção

Delta da opção:

  • 0 a 12: Para delta entre 0 e 12: Representa o valor de delta exato entre o ID da última opção e o ID da opção desejada, sem valor de delta da opção estendido.
  • 13: Para delta de 13 a 268: O delta da opção estendido é um valor de 8 bits que representa o valor do delta da opção menos 13.
  • 14: Para delta de 269 a 65.804: O delta da opção estendido é um valor de 16 bits que representa o valor do delta da opção menos 269.
  • 15: Reservado para o marcador de carga útil (payload marker), onde o delta da opção e o comprimento da opção são definidos juntos como 0xFF.

Comprimento da opção:

  • 0 a 12: Para comprimento de opção entre 0 e 12: Representa o valor de comprimento exato, sem valor de comprimento de opção estendido.
  • 13: Para comprimento de opção de 13 a 268: O comprimento da opção estendido é um valor de 8 bits que representa o valor do comprimento da opção menos 13.
  • 14: Para comprimento de opção de 269 a 65.804: O comprimento da opção estendido é um valor de 16 bits que representa o valor do comprimento da opção menos 269.
  • 15: Reservado para uso futuro. É um erro para o campo de comprimento da opção ser definido como 0xFF.

Valor da opção:

  • O tamanho do campo de valor da opção é definido pelo valor do comprimento da opção em bytes.
  • A semântica e o formato deste campo dependem da respectiva opção.

Implementações ativas do protocolo

NomeLinguagem de ProgramaçãoVersão do CoAP ImplementadaCliente/ServidorRecursos do CoAP ImplementadosLicençaLink
coapDartRFC 7252ClienteTransferências em blocos (Blockwise), Observe, Multicast, Proxy (parcial)MIThttps://github.com/shamblett/coap
aiocoapPython 3RFC 7252, RFC 7641, RFC 7959, RFC 8323, RFC 7967, RFC 8132, RFC 9176, RFC 8613, RFC 9528Cliente + ServidorTransferências em blocos, Observe (parcial)MITpypi.python.org/pypi/aiocoap
CaliforniumJavaRFC 7252, RFC 7641, RFC 7959Cliente + ServidorObserve, Transferências em blocos, Multicast (desde 2.x), DTLS (+ ID de Conexão DTLS 1.2)EPL+EDLwww.eclipse.org/californium github.com/eclipse/californium
CoAPSharpC#, .NETRFC 7252Cliente + ServidorCore, Observe, Bloco, RDMITgithub.com/FemtomaxInc/coapsharp
FreeCoAPCRFC 7252Cliente + Servidor + Proxy HTTP/CoAPCore, DTLS, Transferências em blocosBSDgithub.com/keith-cullen/FreeCoAP
Go-CoAPGoRFC 7252, RFC 8232, RFC 7641, RFC 7959Cliente + ServidorCore, Observe, Blockwise, Multicast, TCP/TLSApache License 2.0github.com/plgd-dev/go-coap
java-coapJavaRFC 7252, RFC 7641, RFC 7959, RFC 8323Cliente + ServidorApache License 2.0github.com/PelionIoT/java-coap
libcoapCRFC 7252, RFC 7390, RFC 7641, RFC 7959, RFC 7967, RFC 8132, RFC 8323, RFC 8516, RFC 8613, RFC 8768, RFC 8974, RFC 9175, RFC 9177Cliente + ServidorCore, Observe, Multicast, Transferências em blocos, Patch/Fetch, OSCORE, (D)TLSBSD/GPLhttps://github.com/obgm/libcoap
libcoapy Python mesmo suporte que o libcoap MIT github.com/anyc/libcoapy
lobaro-coapCRFC 7252Cliente + ServidorObserve, Transferências em blocosMITwww.lobaro.com/lobaro-coap
microCoAPyMicroPythonRFC 7252Cliente + ServidorCoreApache License 2.0github.com/insighio/microCoAPy
nanoCoAPCRFC 7252Cliente + ServidorCore, Transferências em blocos, DTLSLGPLapi.riot-os.org/group__net__nanocoap.html
node-coapJavaScriptRFC 7252,

RFC 7641, RFC 7959

Cliente + ServidorCore, Observe, BlocoMITgithub.com/mcollina/node-coap
Qt CoAPC++RFC 7252ClienteCore, Observe, Transferências em blocosGPL, Comercialhttps://doc.qt.io/qt-6/qtcoap-index.html
coap-rsRustRFC 7252Cliente + ServidorCore, Multicast, opção Observe, Código de resposta Too Many RequestsMITgithub.com/Covertness/coap-rs

docs.rs/coap/

Implementações de proxy

Existem implementações de proxy que fornecem funcionalidade de proxy direto (forward proxy) ou reverso (reverse proxy) para o protocolo CoAP, bem como implementações que fazem a tradução entre protocolos como HTTP e CoAP.

Os seguintes projetos fornecem funcionalidade de proxy:

Projetos que usam CoAP

NomeLinguagem de programaçãoVersão do CoAP implementadaCliente/ServidorRecursos do CoAP implementadosLicençaLink
CoAP ShellJavaRFC 7252ClienteObserve, Transferências em blocos, DTLSApache License 2.0https://github.com/tzolov/coap-shell
CopperJavaScript (plug-in de navegador)RFC 7252ClienteObserve, Transferências em blocos3-clause BSDhttps://github.com/mkovatsc/Copper https://addons.mozilla.org/firefox/addon/copper-270430/[ligação inativa]
MeteoStation ™ React, TypeScript - Cliente Sensores meteorológicos Licença MIT www.meteostationit.wordpress.com

Implementações inativas do protocolo

NomeLinguagem de programaçãoVersão do CoAP implementadaCliente/ServidorRecursos do CoAP implementadosLicençaLink
cantcoapC++/CRFC 7252Cliente + ServidorBSDhttps://github.com/staropram/cantcoap
CanopusGoRFC 7252Cliente + ServidorCoreApache License 2.0https://github.com/zubairhamed/canopus
CoAP implementation for GoGoRFC 7252Cliente + ServidorCore + Draft SubscribeMIThttps://github.com/dustin/go-coap
CoAP.NETC#RFC 7252, coap-13, coap-08, coap-03Cliente + ServidorCore, Observe, Transferências em blocos3-clause BSDhttps://github.com/smeshlink/CoAP.NET
CoAPthonPythonRFC 7252Cliente + Servidor + Proxy Direto + Proxy ReversoObserve, Descoberta de servidores multicast, Análise de CoRE Link Format, Block-wiseMIThttps://github.com/Tanganelli/CoAPthon
eCoAPCRFC 7252Cliente + ServidorCoreMIThttps://gitlab.com/jobol/ecoap
Erbium for ContikiCRFC 7252Cliente + ServidorObserve, Transferências em blocos3-clause BSDhttp://www.contiki-os.org/ (er-rest-example)
guile-coapGuileRFC 7252, RFC 8323Cliente + ServidorGPL-3.0-or-laterhttps://codeberg.org/eris/guile-coap
iCoAPObjective-CRFC 7252ClienteCore, Observe, Transferências em blocosMIThttps://github.com/stuffrabbit/iCoAP
jCoAPJavaRFC 7252Cliente + ServidorObserve, Transferências em blocosApache License 2.0https://code.google.com/p/jcoap/
LibNyociCRFC 7252Cliente + ServidorCore, Observe, Bloco, DTLSMIThttps://github.com/darconeous/libnyoci
microcoapCRFC 7252Cliente + ServidorMIThttps://github.com/1248/microcoap
nCoapJavaRFC 7252Cliente + ServidorObserve, Transferências em blocos, CoRE Link Format, Endpoint-ID-DraftBSDhttps://github.com/okleine/nCoAP
Ruby coapRubyRFC 7252Cliente + Servidor (david)Core, Observe, Bloco, RDMIT, GPLhttps://github.com/nning/coap
https://github.com/nning/david
Sensinode C Device LibraryCRFC 7252Cliente + ServidorCore, Observe, Bloco, RDComercialhttps://silver.arm.com/browse/SEN00
Sensinode Java Device LibraryJava SERFC 7252Cliente + ServidorCore, Observe, Bloco, RDComercialhttps://silver.arm.com/browse/SEN00
Sensinode NanoService PlatformJava SERFC 7252Servidor em NuvemCore, Observe, Bloco, RDComercialhttps://silver.arm.com/browse/SEN00
SwiftCoAPSwiftRFC 7252Cliente + ServidorCore, Observe, Transferências em blocosMIThttps://github.com/stuffrabbit/SwiftCoAP
TinyOS CoapBlipnesC/Ccoap-13Cliente + ServidorObserve, Transferências em blocosBSDhttps://web.archive.org/web/20130312140509/http://docs.tinyos.net/tinywiki/index.php/CoAP
txThingsPython (Twisted)RFC 7252Cliente + ServidorTransferências em blocos, Observe (parcial)MIThttps://github.com/mwasilak/txThings/
YaCoAPCMIThttps://github.com/RIOT-Makers/YaCoAP

Comunicação em grupo no CoAP

Em muitos domínios de aplicação do CoAP, é essencial ter a capacidade de endereçar vários recursos CoAP como um grupo, em vez de endereçar cada recurso individualmente (por exemplo, para acender todas as luzes habilitadas para CoAP em uma sala com uma única requisição CoAP disparada ao acionar o interruptor de luz). Para atender a essa necessidade, o IETF desenvolveu uma extensão opcional para o CoAP na forma de um RFC experimental: Group Communication for CoAP - RFC 7390 Esta extensão depende de IP multicast para entregar a requisição CoAP a todos os membros do grupo. O uso de multicast tem certos benefícios, como a redução do número de pacotes necessários para entregar a requisição aos membros. No entanto, o multicast também tem suas limitações, como baixa confiabilidade e incompatibilidade com cache (cache-unfriendly). Um método alternativo para a comunicação em grupo no CoAP que usa unicasts em vez de multicasts depende de ter um intermediário onde os grupos são criados. Os clientes enviam suas requisições de grupo para o intermediário, que por sua vez envia requisições unicast individuais para os membros do grupo, coleta as respostas deles e envia de volta uma resposta agregada ao cliente.

Segurança

O CoAP define quatro modos de segurança:

Pesquisas foram conduzidas sobre a otimização do DTLS implementando associações de segurança como recursos CoAP, em vez de usar o DTLS como um invólucro de segurança para o tráfego CoAP. Essa pesquisa indicou melhorias de até 6,5 vezes em relação a implementações não otimizadas.

Além do DTLS, a RFC 8613 define o protocolo Object Security for Constrained RESTful Environments (OSCORE), que fornece segurança para o CoAP na camada de aplicação.

Problemas de segurança

Embora o padrão do protocolo inclua provisões para mitigar a ameaça de ataques de ampliação DDoS, essas provisões não são implementadas na prática, resultando na presença de mais de 580.000 alvos localizados principalmente na China e ataques de até 320 Gbit/s.

Ver também

Referências

  1. ↑ RFC 7252, Constrained Application Protocol (CoAP)
  2. ↑ "Integrating Wireless Sensor Networks with the Web Arquivado em 2017-08-30 no Wayback Machine", Walter, Colitti 2011
  3. ↑ S. Lenders, Martine; Amsüss, Christian; Gündoğan, Cenk; C. Schmidt, Thomas C.; Wählisch, Matthias (março de 2026). «DNS over CoAP (DoC)». RFC Editor. IETF RFC. RFC 9953. doi:10.17487/RFC9953
  4. ↑ Lenders, Martine S.; Amsüss, Christian; Gündogan, Cenk; Nawrocki, Marcin; Schmidt, Thomas C.; Wählisch, Matthias (28 de setembro de 2023). «Securing Name Resolution in the IoT: DNS over CoAP». Proceedings of the ACM on Networking. 1 (CoNEXT2): 1–25. arXiv:2207.07486Acessível livremente. doi:10.1145/3609423
  5. ↑ RFC 7390, Group Communication for CoAP
  6. ↑ "Flexible Unicast-Based Group Communication for CoAP-Enabled Devices", Ishaq, I.; Hoebeke, J.; Van den Abeele, F.; Rossey, J.; Moerman, I.; Demeester, P. Sensors 2014
  7. ↑ RFC 7252, Constrained Application Protocol (CoAP)
  8. ↑ Capossele, Angelo; Cervo, Valerio; De Cicco, Gianluca; Petrioli, Chiara (junho de 2015). «Security as a CoAP resource: An optimized DTLS implementation for the IoT». 2015 IEEE International Conference on Communications (ICC). [S.l.]: IEEE. pp. 529–554. ISBN 978-1-4673-6432-4. doi:10.1109/ICC.2015.7248379
  9. ↑ Palombini, Francesca; Seitz, Ludwig; Selander, Goeran; Mattsson, John (2019). «Object Security for Constrained RESTful Environments (OSCORE)»Subscrição paga é requerida. tools.ietf.org (em inglês). doi:10.17487/RFC8613. Consultado em 7 de maio de 2021
  10. ↑ "TLS 1.3 is going to save us all, and other reasons why IoT is still insecure", Dani Grant, 2017-12-24
  11. ↑ "When Machines Can't Talk: Security and Privacy Issues of Machine-to-Machine Data Protocols", Federico Maggi and Rainer Vosseler, 2018-12-06
  12. ↑ "The CoAP protocol is the next big thing for DDoS attacks", Catalin Cimpanu, 2018-12-05

Ligações externas

O Commons possui uma categoria com imagens e outros ficheiros sobre Protocolo de Aplicação Restrita