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 客户端/服务器代码就在这层。处理请求、构造响应、资源发现。
- 安全层(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 的问题。