1. CoAP 协议概述

各位好,我是老赵。今天咱们开始聊 CoAP 协议。说实话,我第一次接触 CoAP 是在一个智能路灯项目里。当时客户要求设备端必须用 UDP,功耗要低,还得能跟云端 RESTful API 对接。HTTP 太重,MQTT 又不太适合那种请求-响应的场景。嗯,最后我选了 CoAP,效果还不错。

这一章咱们先把 CoAP 的底子打牢。我会从背景、特点、与 HTTP 的对比、协议栈架构这几个角度来讲。你不用担心听不懂,我会用我踩过的坑帮你理解。

1.1 CoAP 协议背景

CoAP 的全称是 Constrained Application Protocol,翻译过来就是“受限应用协议”。它由 IETF 的 CoRE 工作组制定,标准是 RFC 7252。

为什么要搞这么个协议?说白了,物联网设备太“穷”了。你想想看,一个温度传感器,RAM 可能只有几十 KB,CPU 主频几十 MHz,电池还得撑一年。HTTP 那套东西,光是 TCP 三次握手就能把设备搞死机。

我记得 2016 年有个项目,用 ESP8266 做数据采集,跑 HTTP 请求。结果呢?设备经常因为内存不足重启。后来换成 CoAP,同样的硬件,稳定运行了两年多。这就是 CoAP 的价值——让“穷”设备也能联网。

核心定位:CoAP 专为资源受限的物联网设备设计,运行在 UDP 之上,提供类似 HTTP 的请求/响应模型,但开销极低。

1.2 CoAP 协议特点

CoAP 的特点,我总结为“小而美”。咱们一条条来看。

  • 基于 UDP:没有 TCP 三次握手的开销。但别担心可靠性,CoAP 自己实现了重传和确认机制。
  • 轻量级头部:固定头部只有 4 字节。相比之下,HTTP 头部动辄几百字节。
  • 支持 RESTful 架构:GET、POST、PUT、DELETE,跟 HTTP 一样。后端开发人员上手很快。
  • 内置资源发现:通过 /.well-known/core 路径,客户端可以知道设备支持哪些资源。
  • 异步消息:支持非确认消息,适合周期性上报数据的场景。
  • 安全层 DTLS:这是咱们这门课的重点。CoAP 通过 DTLS 实现加密、认证和完整性保护。

我的经验:在低功耗场景下,尽量使用非确认消息(NON)。我曾经在一个电池供电的传感器项目里,把所有数据都改成 NON 模式,续航从 3 个月提升到了 8 个月。当然,前提是你能容忍偶尔丢包。

1.3 CoAP 与 HTTP 对比

很多人问我:“CoAP 是不是就是 HTTP 的 UDP 版本?” 嗯,不完全对。咱们直接看对比表。

对比维度 HTTP CoAP
传输层 TCP UDP
头部大小 通常 200-800 字节 固定 4 字节
消息模型 请求/响应 请求/响应 + 异步通知
可靠性 TCP 保证 CoAP 自身重传机制
资源发现 无内置机制 内置 /.well-known/core
安全层 TLS DTLS
适用设备 PC、手机、服务器 传感器、执行器、微控制器

你看,CoAP 不是简单地把 HTTP 搬到 UDP 上。它重新设计了消息格式,加入了资源发现,还支持观察模式——客户端可以“订阅”某个资源,资源变化时服务器主动推送。这个功能在 HTTP 里得靠 WebSocket 或者轮询才能实现。

避坑指南:我曾经在一个项目中,直接把 HTTP API 的 JSON 结构原封不动地塞进 CoAP 响应里。结果发现,CoAP 的 MTU 通常只有 1280 字节,大 JSON 会被分片,导致 DTLS 握手失败。后来我不得不重新设计数据模型,把字段名缩短,去掉冗余信息。记住:CoAP 不是 HTTP,数据模型要精简。

1.4 CoAP 协议栈架构

CoAP 的协议栈分四层。我画了一张图,你一看就明白。

CoAP 协议栈架构 应用层 CoAP 请求/响应模型 · 资源发现 · 观察模式 安全层(DTLS) 加密 · 认证 · 完整性保护 · 防重放 传输层(UDP) 无连接 · 尽力交付 · 端口 5683(非安全)/ 5684(DTLS) 网络层(IPv6 / 6LoWPAN) IPv6 地址 · 6LoWPAN 分片重组 · 低功耗无线网络 说明:DTLS 位于 CoAP 与 UDP 之间,对上层 CoAP 消息进行加密,对下层 UDP 透明

从上往下看:

  • 应用层:咱们写的 CoAP 客户端/服务器代码就在这层。处理请求、构造响应、资源发现。
  • 安全层(DTLS):这是这门课的核心。DTLS 在 UDP 上实现了类似 TLS 的安全功能。握手、加密、认证都在这一层完成。
  • 传输层(UDP):CoAP 默认端口 5683(非安全),5684(DTLS 安全)。记住这两个端口,配置防火墙时用得上。
  • 网络层(IPv6 / 6LoWPAN):CoAP 原生支持 IPv6。在低功耗无线网络里,6LoWPAN 负责把 IPv6 包压缩到 IEEE 802.15.4 帧里。

我的建议:刚开始学 CoAP 时,别急着上 DTLS。先用非安全模式把 CoAP 的请求/响应流程跑通。等理解了消息模型,再引入 DTLS。否则,握手失败了你都不知道是 CoAP 的问题还是 DTLS 的问题。