跳到主要内容

7.1. "alpn" 和 "no-default-alpn"

"alpn" 和 "no-default-alpn" SvcParamKeys 一起指示该服务端点支持的应用层协议协商(ALPN)协议标识符集合和相关传输协议("SVCB ALPN 集")。

与 Alt-Svc 一样,每个 ALPN 协议标识符用于标识端点支持的应用协议和相关协议套件("协议套件")。SVCB ALPN 集中存在 ALPN 协议标识符表示此服务端点(由 TargetName 和其他参数(例如"port")描述)提供与此 ALPN 标识符关联的协议套件的服务。

客户端过滤 ALPN 标识符集以匹配它们支持的协议套件,这决定了所使用的底层传输协议(例如基于 UDP 的 QUIC 或基于 TCP 的 TLS)。不能唯一标识协议套件的 ALPN 协议标识符(例如可以同时用于 TLS 和 DTLS 的标识序列)与此 SvcParamKey 不兼容,不得包含在 SVCB ALPN 集中。

7.1.1. 表示

ALPN 由其注册的"标识序列"(alpn-id)标识,这是一个 1-255 字节的序列。

alpn-id = 1*255OCTET

对于"alpn",呈现值应为一个或多个 alpn-id 的逗号分隔列表。区域文件实现可以禁止在 ALPN ID 中使用","和"\"字符,而不是实现值列表转义过程,在需要这些字符的情况下依赖不透明键格式(例如 key1=\002h2)。

"alpn"的线路格式值由至少一个带有单字节长度前缀的 alpn-id 组成,这些长度-值对连接在一起形成 SvcParamValue。这些对必须恰好填满 SvcParamValue;否则,SvcParamValue 格式错误。

对于"no-default-alpn",呈现值和线路格式值必须为空。当在 RR 中指定"no-default-alpn"时,也必须指定"alpn",以使 RR"自洽"(第 2.4.3 节)。

每个使用此 SvcParamKey 的方案定义了一组几乎所有客户端和服务器都支持的"默认集"ALPN ID;此集合可能为空。要确定 SVCB ALPN 集,客户端从"alpn" SvcParamKey 的 alpn-id 列表开始,并且除非存在"no-default-alpn" SvcParamKey,否则添加默认集。

7.1.2. 使用

要建立到端点的连接,客户端必须:

  1. 令 SVCB-ALPN-Intersection 为 SVCB ALPN 集中客户端支持的协议集。

  2. 令 Intersection-Transports 为 SVCB-ALPN-Intersection 中协议所暗示的传输集(例如 TLS、DTLS、QUIC)。

  3. 对于 Intersection-Transports 中的每个传输,构造一个 ProtocolNameList,包含客户端为该传输支持的所有 ALPN 协议的标识序列,而不考虑 SVCB ALPN 集。

例如,如果 SVCB ALPN 集为 ["http/1.1", "h3"],并且客户端支持 HTTP/1.1、HTTP/2 和 HTTP/3,则客户端可以尝试使用基于 TCP 的 TLS 连接,其 ProtocolNameList 为 ["http/1.1", "h2"],也可以尝试使用 QUIC 连接,其 ProtocolNameList 为 ["h3"]。

一旦客户端构造了 ClientHello,该握手中的协议协商按照 [ALPN] 中指定的方式进行,而不考虑 SVCB ALPN 集。

如果首选传输连接失败,客户端可以实现回退过程,使用不太首选的传输。此回退行为容易受到阻止首选传输的网络攻击者的操纵,但可能对于与现有网络的兼容性是必要的。

有了这个过程,能够修改 DNS 和网络流量的攻击者可以阻止成功的传输连接,但不能以其他方式干扰 ALPN 协议选择。此过程还确保每个 ProtocolNameList 至少包含 SVCB ALPN 集中的一个协议。

客户端不应尝试连接到其 SVCB ALPN 集不包含任何支持协议的服务端点。

为确保行为的一致性,如果所有兼容的 RR 都指示"no-default-alpn",即使使用非默认 ALPN 协议可以成功连接,客户端也可以拒绝整个 SVCB RRset 并回退到基本连接建立。

区域运营商应确保每个 RRset 中至少有一个 RR 支持默认传输。这使得与最大数量的客户端兼容成为可能。