摘要

  • RFC 3059 允许 SLPv2 用户代理要求服务回复中的每个 URL 同时携带完整的已注册属性表。请求端故意发送一个空扩展,回复端才为每个 URL 填入一个扩展。
  • 扩展 0x0002 可选且遇到未知时应被忽略,所以回复中没有它只是启动回退的信号,不是“属性为零”的证明;请求了 SLP SPI 而响应方无法提供认证块时,扩展同样必须缺席。

空白在这里是一条指令

服务发现表面上像一个问题,实际上至少有两层:哪些服务符合条件,以及这些候选服务各有什么属性。SLPv2 的基本交换先返回服务 URL,客户端若需要属性,再对 URL 或服务类型发出 Attribute Request。

2001 年 2 月作为 Proposed Standard 发布的 RFC 3059,把这两层证据装进同一次往返,却没有把它们混成同一个事实。用户代理在 Service Request 中放入 Attribute List Extension,把 Service URL Length 与 Attribute List Length 都设为零,并省略对应字段。这个空结构不是空结果,而是一条语法化请求:请在 Service Reply 里附带属性。

同一个零长度字段,放在不同方向就承担不同含义。若把请求端的空壳读成“服务没有属性”,客户端还没有收到任何业务数据就已经替响应方作出了结论。

每个 URL 都要有自己的属性回执

支持该扩展的服务代理或目录代理,要针对 Service Reply 中的每个 URL Entry 返回一个 Attribute List Extension。扩展包含与之对应的 Service URL 和该服务的完整属性表。RFC 说扩展顺序应该与 URL Entry 顺序一致,同时又把 URL 明确写入每个扩展。

因此真正的连接键是 URL。顺序可以用于一致性检查,却不应取代显式身份。只按数组位置把属性贴到 URL 上,会把实现便利误当成协议权威。

“完整属性表”也不是现实世界中的全知视图。它指响应方持有的、与请求语言一致的注册属性。它受注册内容、语言、作用域、匹配条件和缓存状态约束。注册尚未过期,不证明服务此刻可达;某项现实能力没有登记,也不会凭空出现在列表里。RFC 3059 优化的是广告描述的传输,而不是运行结果的测量。

0x0002 的编号带着兼容政策

IANA 为该扩展登记了 0x0002。RFC 2608 把 0x0000 至 0x3FFF 定义为标准化但可选实现的扩展:接收方不认识时应忽略。这样,较早的实现即使不懂 RFC 3059,也仍能返回普通 Service Reply。

兼容性没有消除不确定性,只是把处理责任交给了客户端。RFC 3059 明确要求:若回复没有 Attribute List Extension,用户代理应假定 SA 或 DA 不支持它,并对拿到的每个 URL 分别发送 Attribute Request。缺席是一条回退指令,不是一个肯定的空属性表。

后来的 SLP 扩展可能使用强制实现编号区间,并对未知选项返回 OPTION_NOT_UNDERSTOOD。RFC 3421 的 Select 与 Sort 就提供了这种对照。但那是另一套编号和错误语义,不能倒灌进 0x0002。扩展这一形式从来不保证统一的失败表现。

认证会让同一种缺席拥有另一条路径

Service Request 可以带 SLP Security Parameter Index。只要带了 SPI,返回的每个 Attribute List Extension 就必须包括对应的认证块。若 SA 或 DA 不支持该 SPI,或者无法返回所需认证块,它就不得返回这个扩展。

于是,线上看到的“没有扩展”至少有两条相关路径:响应方根本没有实现 0x0002,或它无法满足这次请求的认证上下文。RFC 给客户端的实际动作仍是回退查询,并没有授权客户端从沉默中推导更精细的根因。

认证块也有清晰边界。按照 RFC 2608,它让用户代理验证覆盖内容未被修改,并由获授权代理发出,同时依赖 SPI 所指的密钥材料、算法参数与到期时间。验证通过不等于服务当前在线,不等于这名用户拥有访问权,更不等于后续应用事务成功。

被压缩的是对话,不是证据层级

没有扩展时,发现四个 URL 后获取属性,可能需要一次 Service Request 再加四次 Attribute Request。双方都支持 RFC 3059 时,同一批描述信息可以随一次回复到达。它改变的是时延与报文数量,不是数据的权威范围。

这种区别今天依然常见。界面因为没有拿到富化数据而显示“无能力”;资产表因为兼容路径未执行而记为“无属性”;自动选择器因为把“这里没有携带”误读为“已知不存在”而丢弃可用候选。RFC 3059 的回退规定,是对这类错误的一条早期、精确警告。

协议把成本放在了合理位置:响应方可以不实现优化仍保持兼容;想获得完整选择信息的用户代理必须识别缺失回执,并付出额外往返。节省网络工作不能兑换成凭空制造的确定性。

来源