摘要

  • draft-ietf-core-conditional-attributes-14 允许客户端用阈值、步长、区间、边沿与时间参数建立资源状态投影;投影没有发出通知,不等于底层状态没有变化。
  • 要把“没有报警”变成可信结论,必须分别保存参数支持、采样求值、触发计算、发送调度、代理交付、消息确认与最终动作的回执。

一次被漏掉的短暂越界

冷库温度在两次求值之间升过警戒线,又在下一次采样前降了回来。服务器忠实执行了自己的采样周期,c.gt 从未看到一次由下向上的越界,客户端也就没有收到消息。控制台连续数小时保持绿色。

绿色并没有造假。它展示的只是条件投影收到的结果。把它解释为“冷库从未超温”,才是越过证据边界的那一步。

修订版 14 发布于 2026 年 9 月 14 日,2027 年 3 月 18 日到期。Datatracker 将它列为 CoRE 工作组的有效 Internet-Draft,目标是 Standards Track;工作组状态仍写着在最后征求意见后有问题待修订。它不是 RFC,也不是任何产品支持这些参数的证明。

草案解决的是很具体的效率问题。普通 Observe 让客户端持续取得资源的新表示;受限设备往往没有电量与带宽发送每次变化。条件查询让服务器为一个完整 URI 维护独立的“资源状态投影”,只在条件满足时交付子集。减少流量是真实收益,但沉默也因此有了多种来源。

阈值不是持续告警

c.gt 与 c.lt 关注相对于“上一次已报告值”的跨越。温度越过上限时可以发出一次通知;如果继续上升,单靠 c.gt 不会不断报警。只有再次跌回阈值另一侧后又跨越,或者另有 c.band、c.pmax 等条件,才会出现新的消息。

c.st 关注采样值相对上次报告值的步长。若 c.pmin 尚未结束,服务器可能只保留区间内最后一次采样。于是相邻两条通知的差可能远大于请求的步长,中间轨迹也不会自动进入历史。

c.band 又改变了阈值的含义。c.gt 小于 c.lt 时,区间内部触发;顺序反过来时,区间外部触发。c.edge 只关注布尔值某一方向的边沿。多项条件同时满足没有优先级,服务器只发一条通知并更新“最后通知值”和时间。一个包可能折叠多个事实,也可能只代表一个离散样本。

接受请求不等于接受每个条件

资源可以用 if="core.conditional" 声明广义能力,却不必支持每个参数;草案也没有定义逐参数能力发现。反过来,资源即使不公开这个标记,也可能支持条件参数。

最容易被误读的是“不支持”的处理。只要参数语法有效,服务器就必须把不支持的参数当作无效条件继续处理,不能仅因不支持而拒绝观察。因此 2.05 Content 与 Observe 选项可以证明观察关系建立,却不能证明请求中的每一项过滤或时间要求都在运行。

这与参数非法不同。错误类型、非正周期、最大值小于最小值应返回 4.00 Bad Request。它也与服务器因放大攻击风险拒绝极短的 c.pmax 或 c.epmax 不同;服务器可正常回答 GET,却不返回 Observe 选项。是否注册成功,要看选项,而不是只看成功状态码。

三只钟不能压成一个时间戳

c.pmin 是通知之间的最短间隔。它不一定驱动采样;条件可能已经成立,但消息仍需等待。c.pmax 要求即使状态未变,也不要让两次通知相隔过久。然而草案明确说,即使 c.pmin 与 c.pmax 相等,也不构成硬实时调度合同,服务器只能尽力满足。

c.epmin 与 c.epmax 管的是求值。前者告诉服务器客户端不关心更密的求值,后者规定服务器最多可以等多久再求值。它们都不意味着连续测量。物理状态可以在两次求值之间完成一次越界和恢复。

所以至少要区分资源状态、传感器采样、条件求值、触发义务与通知发送。若再考虑网络,后面还有代理交付、客户端接收和应用执行。把一条通知上的时间戳解释为整条链的时间,只会把未知写成确定。

代理会让心跳看起来消失

CoAP Observe 保留缓存与代理的架构属性。修订版 14 特别提醒:当表示值没有变化时,代理可能干扰 c.pmax 产生的周期更新。草案建议把 Max-Age 设为不大于 c.pmax,但这是缓解,不是端到端交付证明。

c.con=true 可以要求确认式通知。ACK 说明一条 CoAP 消息交换得到确认;它不证明之前没有漏掉越界,不证明客户端业务逻辑读取了负载,更不证明风机、阀门或告警流程真的动作。

Token 用来关联请求与响应,Observe 序列帮助处理新旧顺序,OSCORE 可在其安全上下文内保护消息。它们各自解决一个问题,却没有任何一项能把离散采样变成连续物理真相。

取消也必须指向原来的投影

显式取消 GET 必须带回原始条件 URI。/temperature?c.gt=8 与 /temperature?c.gt=10 虽然观察同一资源,却是两项不同投影。控制台删除一个卡片,不等于服务器端旧观察关系已经终止。

可信取消记录应包含端点、Token、完整 URI、Observe 取消信号与响应。否则遗忘的观察者仍可能耗电、发包或保留旧告警逻辑,而管理面只剩一个看似干净的列表。

“没有报警”的八张回执

第一张是能力回执:哪个资源在什么时刻支持什么。第二张是注册回执:完整 URI、Token 与返回的 Observe 选项。第三张是参数回执:服务器真正支持的条件子集。第四张是求值回执:采样来源、量化精度与求值时间。第五张是触发回执:用正确的上次报告值完成阈值、区间、边沿或步长计算。第六张是调度回执:pmin、pmax 与合并规则解释发送时机。第七张是交付回执:消息穿过代理到达预期客户端。第八张才是结果回执:应用采取动作,物理状态出现预期变化。

沉默只有在这些时钟和路径都被界定时才有意义。否则它只是某条投影流中的空白。

证据的适用范围

冻结资料证明的是修订版 14 的协议语义、尽力而为的时间边界、不支持参数的处理、代理风险与防放大拒绝方式。它不证明部署率、具体产品、事故、丢包率、安全认证或法律义务。被引用的 CoAP 放大攻击文档本身还是一份已过期的 IRTF 草案,也不能拿来指认某个部署发生过攻击。

按照 Lu Heng 对记录与权力的区分,条件观察是一层协调证据。它报告某台服务器选择采什么、算什么、发什么。对最终运营结论拥有事实权威的,仍是能证明物理状态并执行响应的系统。

来源