把 HTTP 语义搬到 UDP 上
CoAP 的交互方式接近 HTTP:有请求方法、URI、响应码与选项,但传输层换成 UDP,报文体量极小,适合内存与电量都受限的设备。它在报文里同时携带消息标识与令牌:前者用于确认与去重,后者用于把响应关联回发起它的请求。这两者的分工是理解 CoAP 的关键。
基本信息
| 默认端口 | 5683 走 UDP,安全传输通常使用 5684 |
|---|---|
| 请求方法 | GET、POST、PUT、DELETE,语义与 HTTP 对应 |
| 报文组成 | 定长头、令牌、选项、载荷,头里含版本、类型、令牌长度与消息标识 |
| 寻址方式 | URI 形式,例如 coap://host:5683/sensors/1/temp |
| 可靠传输 | 由可确认消息与重传机制在应用层实现,而非依赖传输层 |
与 HTTP 对照
| 维度 | CoAP | HTTP |
|---|---|---|
| 传输层 | 以 UDP 为主,也可承载于其他传输之上 | TCP 或 TLS |
| 头部开销 | 二进制定长头加选项,最小报文很小 | 文本头,字段冗余较大 |
| 服务端推送 | 协议内建资源观察机制 | 依赖长连接或轮询等额外机制 |
| 可靠传输 | 可确认消息加重传,由协议实现 | 由传输层保证 |
| 缓存 | 通过响应选项表达有效期与对应关系 | 通过头部字段表达 |
交互示意
交互示意
# 请求:GET /sensors/1/temp
# 响应:内容码 2.05,载荷为当前温度值
# 消息标识用于匹配确认报文与判断重复报文
# 令牌用于把响应关联回发起请求的那次交互
# 可确认请求未被确认时,按退避策略逐次加倍重传典型使用场景
- 受限设备读写:电量与内存紧张,期望单次请求拿一个小值
- 局域网设备管理:同一网段内直接访问设备资源,无需中间服务
- 设备注册与资源发现:配合发现接口枚举设备暴露的资源路径
- 轻量设备管理:作为上层设备管理协议的承载传输
CoAP 适合请求一次取一个值的交互;需要持续上报与多对多分发时通常改用 MQTT,或在其之上再封装管理协议。
在公网直接暴露明文 CoAP 等于把设备控制接口公开,需要配合安全传输或应用层安全机制,并限制可访问的来源。