摘要

  • RFC 8490 区分“传输已经连通”与“DNS 状态操作会话已经建立”;只有明确成功的 DSO 请求与响应,才为持续状态提供共同起点。
  • 非零消息标识、单一主 TLV、互相独立的非活动超时与保活间隔,以及 Retry Delay,共同限制一条长连接能够积累的状态债务。
  • 真正需要审计的不是套接字是否还活着,而是谁发起了持续操作、什么条件维持它、哪个上限结束它,以及重连凭什么发生。

套接字没有自动获得授权

传统 DNS 的承诺很紧凑:客户端提出问题,服务器给出回答。TCP 可以让多次问答共用一条连接,但连接未关闭,并不表示任一端都可以建立订阅、随后主动推送变化,或在一次响应后继续保留应用状态。传输连续性不是应用授权。

2019 年 3 月发布的 RFC 8490 由 Ray Bellis、Stuart Cheshire、John Dickinson、Sara Dickinson、Ted Lemon 与 Tom Pusateri 共同署名。它以操作码 6 定义 DNS Stateful Operations(DSO),并更新 RFC 1035 与 RFC 7766。其关键不是让 TCP 多开一会儿,而是命名一个双方都知道持续 DNS 操作已经存在、也知道这些操作受什么规则约束的协议状态。

客户端最初只有连接,可以发送普通 DNS 请求。除严格限定的早期数据情形外,只有客户端发出 DSO 请求并收到匹配且成功的响应后,连接才成为 DSO 会话。旧服务器若不认识新操作码,客户端不能假装状态已经建立。无回应持续到规定边界后,应中止连接,并在已知状态下重新开始。由此,活着的套接字只能证明可达,不能证明对方接受了新会话。

一条消息只有一个主操作

DSO 沿用十二字节 DNS 头部,却不使用普通问题区和回答区;状态操作由类型—长度—值结构承载。每条 DSO 消息只有一个主 TLV。这个主操作决定该消息是必须收到确认的请求,还是绝不能触发响应的单向通知。

消息标识把两者分开。请求使用非零标识,响应必须带回相同值;单向消息使用零。实现因而不能把所有信号都当作事务,也不能把需要确认的操作当成发完即忘。请求可以流水发送,响应可以乱序返回,但接收者仍应按收到的先后顺序执行操作。

单一主操作也是一种克制。EDNS 可以在一个 OPT 伪记录里装入多个选项,每个选项还要自行规定是否、如何确认。DSO 让每个操作独占一条消息和一个结果码。附加 TLV 只有在主操作定义允许时才有意义;未知主 TLV 会得到专门的 DSOTYPENI,未知附加 TLV 则被忽略。可扩展性不再要求系统假装自己接受了不理解的含义。

两只钟,不能合并

长寿命状态首先是资源问题。安静的连接可能已经被遗弃,也可能承载着仍有效、只是等待变化的订阅。RFC 8490 因此把非活动超时与保活间隔分开。

非活动计时器关心有意义的操作。普通请求等待响应时,它不会把这段时间当成空闲;长寿命操作在被取消前仍然有效,即使很久没有消息。保活计时器关心路径是否仍可达。保活流量可以维持 NAT、防火墙状态,并确认双方仍能通信,却不等于发生了普通 DNS 工作。脉搏说明通道还在,不能说明保存的状态仍有价值。

区分两只钟,可以避开两个相反错误。若把一切沉默视为放弃,正常订阅会频繁坍塌;若让任何保活包无限续期应用授权,过期状态就可能不死。运营者必须同时看见两个时钟,也要看见究竟是哪项未完成操作为状态继续存在提供理由。

关闭不能制造重连风暴

持续会话需要明确出口。DSO 的 Retry Delay 允许服务器终止会话时告诉客户端等待多久再连。原因码可以区分例行重启、严重格式错误、资源耗尽与重新配置,让客户端不至于把可控关机变成同步重连风暴。

但这些信号只提供有限证据。SERVFAIL 可以表示服务器正在卸载负载,却不能揭示内部资源耗尽的完整原因;REFUSED 可以说明此前的操作暂时无法继续,却不证明不当行为或永久撤回。退避时间是一项协调指令,不是服务器对客户端的所有权。

传输边界同样明确。DSO 依赖可靠、有序的会话语义,目前用于 DNS over TCP 与 DNS over TLS。普通 UDP DNS 不具备这些条件;DNS over HTTPS 也不采用 DSO,因为 HTTP 自己管理会话。加密可以保护通道,但不会自动证明对端值得信任,也不会证明每项持续操作都合适。

后续协议获得了可以依赖的状态

RFC 8765 把 DSO 用于 DNS Push Notifications。订阅者可以等待后续变化,而不必反复轮询整个名字空间。这个实例说明框架的价值不在“连接更长”,而在另一协议可以把持续工作放到一个拥有共同生命周期的底座上。

IANA DNS 参数注册表 公开记录 DSO 类型码与错误码。注册解决冲突和识别问题,却不证明实现数量、部署比例、计时器配置质量或连接共享是否正确。

理解 Ray Bellis 在这份 RFC 中的贡献,应当从边界入手。文件没有授予永久状态权,而是把建立、使用、沉默、可达、过载、终止与重试拆成不同事件。后续 DNS 功能因此可以依赖持久性,同时又不让“持久”变成看不见的权力。

来源