rfc9460v6.txt | rfc9460.txt | |||
---|---|---|---|---|
Internet Engineering Task Force (IETF) B. Schwartz | Internet Engineering Task Force (IETF) B. Schwartz | |||
Request for Comments: 9460 Meta Platforms, Inc. | Request for Comments: 9460 Meta Platforms, Inc. | |||
Category: Standards Track M. Bishop | Category: Standards Track M. Bishop | |||
ISSN: 2070-1721 E. Nygren | ISSN: 2070-1721 E. Nygren | |||
Akamai Technologies | Akamai Technologies | |||
October 2023 | November 2023 | |||
Service Binding and Parameter Specification via the DNS (SVCB and HTTPS | Service Binding and Parameter Specification via the DNS (SVCB and HTTPS | |||
Resource Records) | Resource Records) | |||
Abstract | Abstract | |||
This document specifies the "SVCB" ("Service Binding") and "HTTPS" | This document specifies the "SVCB" ("Service Binding") and "HTTPS" | |||
DNS resource record (RR) types to facilitate the lookup of | DNS resource record (RR) types to facilitate the lookup of | |||
information needed to make connections to network services, such as | information needed to make connections to network services, such as | |||
for HTTP origins. SVCB records allow a service to be provided from | for HTTP origins. SVCB records allow a service to be provided from | |||
skipping to change at line 241 ¶ | skipping to change at line 241 ¶ | |||
The SVCB RR has two modes: 1) AliasMode (Section 2.4.2), which | The SVCB RR has two modes: 1) AliasMode (Section 2.4.2), which | |||
aliases a name to another name and 2) ServiceMode (Section 2.4.3), | aliases a name to another name and 2) ServiceMode (Section 2.4.3), | |||
which provides connection information bound to a service endpoint | which provides connection information bound to a service endpoint | |||
domain. Placing both forms in a single RR type allows clients to | domain. Placing both forms in a single RR type allows clients to | |||
fetch the relevant information with a single query (Section 2.3). | fetch the relevant information with a single query (Section 2.3). | |||
The SVCB RR has two required fields and one optional field. The | The SVCB RR has two required fields and one optional field. The | |||
fields are: | fields are: | |||
SvcPriority (Section 2.4.1): | SvcPriority (Section 2.4.1): The priority of this record (relative | |||
The priority of this record (relative to others, with lower values | to others, with lower values preferred). A value of 0 indicates | |||
preferred). A value of 0 indicates AliasMode. | AliasMode. | |||
TargetName: | TargetName: The domain name of either the alias target (for | |||
The domain name of either the alias target (for AliasMode) or the | AliasMode) or the alternative endpoint (for ServiceMode). | |||
alternative endpoint (for ServiceMode). | ||||
SvcParams (optional): | SvcParams (optional): A list of key=value pairs describing the | |||
A list of key=value pairs describing the alternative endpoint at | alternative endpoint at TargetName (only used in ServiceMode and | |||
TargetName (only used in ServiceMode and otherwise ignored). | otherwise ignored). SvcParams are described in Section 2.1. | |||
SvcParams are described in Section 2.1. | ||||
Cooperating DNS recursive resolvers will perform subsequent record | Cooperating DNS recursive resolvers will perform subsequent record | |||
resolution (for SVCB, A, and AAAA records) and return them in the | resolution (for SVCB, A, and AAAA records) and return them in the | |||
Additional section of the response (Section 4.2). Clients either use | Additional section of the response (Section 4.2). Clients either use | |||
responses included in the Additional section returned by the | responses included in the Additional section returned by the | |||
recursive resolver or perform necessary SVCB, A, and AAAA record | recursive resolver or perform necessary SVCB, A, and AAAA record | |||
resolutions (Section 3). DNS authoritative servers can attach in- | resolutions (Section 3). DNS authoritative servers can attach in- | |||
bailiwick SVCB, A, AAAA, and CNAME records in the Additional section | bailiwick SVCB, A, AAAA, and CNAME records in the Additional section | |||
to responses for a SVCB query (Section 4.1). | to responses for a SVCB query (Section 4.1). | |||
skipping to change at line 276 ¶ | skipping to change at line 274 ¶ | |||
each of these alternative endpoints (Section 7). | each of these alternative endpoints (Section 7). | |||
For HTTP use cases, the HTTPS RR (Section 9) enables many of the | For HTTP use cases, the HTTPS RR (Section 9) enables many of the | |||
benefits of Alt-Svc [AltSvc] without waiting for a full HTTP | benefits of Alt-Svc [AltSvc] without waiting for a full HTTP | |||
connection initiation (multiple round trips) before learning of the | connection initiation (multiple round trips) before learning of the | |||
preferred alternative, and without necessarily revealing the user's | preferred alternative, and without necessarily revealing the user's | |||
intended destination to all entities along the network path. | intended destination to all entities along the network path. | |||
1.3. Terminology | 1.3. Terminology | |||
Our terminology is based on the common case where the SVCB record is | Terminology in this document is based on the common case where the | |||
used to access a resource identified by a URI whose authority field | SVCB record is used to access a resource identified by a URI whose | |||
contains a DNS hostname as the host. | authority field contains a DNS hostname as the host. | |||
* The "service" is the information source identified by the | * The "service" is the information source identified by the | |||
authority and scheme of the URI, capable of providing access to | authority and scheme of the URI, capable of providing access to | |||
the resource. For "https" URIs, the "service" corresponds to an | the resource. For "https" URIs, the "service" corresponds to an | |||
"origin" [RFC6454]. | "origin" [RFC6454]. | |||
* The "service name" is the host portion of the authority. | * The "service name" is the host portion of the authority. | |||
* The "authority endpoint" is the authority's hostname and a port | * The "authority endpoint" is the authority's hostname and a port | |||
number implied by the scheme or specified in the URI. | number implied by the scheme or specified in the URI. | |||
skipping to change at line 432 ¶ | skipping to change at line 430 ¶ | |||
prepending the service name with a label indicating the scheme, | prepending the service name with a label indicating the scheme, | |||
prefixed with an underscore, resulting in a domain name like | prefixed with an underscore, resulting in a domain name like | |||
"_examplescheme.api.example.com.". This follows the Attrleaf naming | "_examplescheme.api.example.com.". This follows the Attrleaf naming | |||
pattern [Attrleaf], so the scheme MUST be registered appropriately | pattern [Attrleaf], so the scheme MUST be registered appropriately | |||
with IANA (see Section 11). | with IANA (see Section 11). | |||
Protocol mapping documents MAY specify additional underscore-prefixed | Protocol mapping documents MAY specify additional underscore-prefixed | |||
labels to be prepended. For schemes that specify a port | labels to be prepended. For schemes that specify a port | |||
(Section 3.2.3 of [URI]), one reasonable possibility is to prepend | (Section 3.2.3 of [URI]), one reasonable possibility is to prepend | |||
the indicated port number if a non-default port number is specified. | the indicated port number if a non-default port number is specified. | |||
We term this behavior "Port Prefix Naming" and use it in the examples | This document terms this behavior "Port Prefix Naming" and uses it in | |||
throughout this document. | the examples throughout. | |||
See Section 9.1 for information regarding HTTPS RR behavior. | See Section 9.1 for information regarding HTTPS RR behavior. | |||
When a prior CNAME or SVCB record has aliased to a SVCB record, each | When a prior CNAME or SVCB record has aliased to a SVCB record, each | |||
RR SHALL be returned under its own owner name, as in ordinary CNAME | RR SHALL be returned under its own owner name, as in ordinary CNAME | |||
processing ([RFC1034], Section 3.6.2). For details, see the | processing ([RFC1034], Section 3.6.2). For details, see the | |||
recommendations regarding aliases for clients (Section 3), servers | recommendations regarding aliases for clients (Section 3), servers | |||
(Section 4), and zones (Section 10). | (Section 4), and zones (Section 10). | |||
Note that none of these forms alter the origin or authority for | Note that none of these forms alter the origin or authority for | |||
skipping to change at line 463 ¶ | skipping to change at line 461 ¶ | |||
could publish this record: | could publish this record: | |||
svc4.example.net. 7200 IN SVCB 3 svc4.example.net. ( | svc4.example.net. 7200 IN SVCB 3 svc4.example.net. ( | |||
alpn="bar" port="8004" ) | alpn="bar" port="8004" ) | |||
This record would indicate that these services are served on port | This record would indicate that these services are served on port | |||
number 8004, which supports the protocol "bar" and its associated | number 8004, which supports the protocol "bar" and its associated | |||
transport in addition to the default transport protocol for "foo://". | transport in addition to the default transport protocol for "foo://". | |||
(Parentheses are used to ignore a line break in DNS zone-file | (Parentheses are used to ignore a line break in DNS zone-file | |||
presentation format ([RFC1035], Section 5.1).) | presentation format, per Section 5.1 of [RFC1035].) | |||
2.4. Interpretation | 2.4. Interpretation | |||
2.4.1. SvcPriority | 2.4.1. SvcPriority | |||
When SvcPriority is 0, the SVCB record is in AliasMode | When SvcPriority is 0, the SVCB record is in AliasMode | |||
(Section 2.4.2). Otherwise, it is in ServiceMode (Section 2.4.3). | (Section 2.4.2). Otherwise, it is in ServiceMode (Section 2.4.3). | |||
Within a SVCB RRset, all RRs SHOULD have the same mode. If an RRset | Within a SVCB RRset, all RRs SHOULD have the same mode. If an RRset | |||
contains a record in AliasMode, the recipient MUST ignore any | contains a record in AliasMode, the recipient MUST ignore any | |||
skipping to change at line 1998 ¶ | skipping to change at line 1996 ¶ | |||
[DNSTerm] Hoffman, P., Sullivan, A., and K. Fujiwara, "DNS | [DNSTerm] Hoffman, P., Sullivan, A., and K. Fujiwara, "DNS | |||
Terminology", BCP 219, RFC 8499, DOI 10.17487/RFC8499, | Terminology", BCP 219, RFC 8499, DOI 10.17487/RFC8499, | |||
January 2019, <https://www.rfc-editor.org/info/rfc8499>. | January 2019, <https://www.rfc-editor.org/info/rfc8499>. | |||
[ECH] Rescorla, E., Oku, K., Sullivan, N., and C. A. Wood, "TLS | [ECH] Rescorla, E., Oku, K., Sullivan, N., and C. A. Wood, "TLS | |||
Encrypted Client Hello", Work in Progress, Internet-Draft, | Encrypted Client Hello", Work in Progress, Internet-Draft, | |||
draft-ietf-tls-esni-17, 9 October 2023, | draft-ietf-tls-esni-17, 9 October 2023, | |||
<https://datatracker.ietf.org/doc/html/draft-ietf-tls- | <https://datatracker.ietf.org/doc/html/draft-ietf-tls- | |||
esni-17>. | esni-17>. | |||
[FETCH] WHATWG, "Fetch Living Standard", June 2023, | [FETCH] WHATWG, "Fetch Living Standard", October 2023, | |||
<https://fetch.spec.whatwg.org/>. | <https://fetch.spec.whatwg.org/>. | |||
[FETCH-WEBSOCKETS] | [FETCH-WEBSOCKETS] | |||
WHATWG, "WebSockets Living Standard", May 2023, | WHATWG, "WebSockets Living Standard", September 2023, | |||
<https://websockets.spec.whatwg.org/>. | <https://websockets.spec.whatwg.org/>. | |||
[HSTS] Hodges, J., Jackson, C., and A. Barth, "HTTP Strict | [HSTS] Hodges, J., Jackson, C., and A. Barth, "HTTP Strict | |||
Transport Security (HSTS)", RFC 6797, | Transport Security (HSTS)", RFC 6797, | |||
DOI 10.17487/RFC6797, November 2012, | DOI 10.17487/RFC6797, November 2012, | |||
<https://www.rfc-editor.org/info/rfc6797>. | <https://www.rfc-editor.org/info/rfc6797>. | |||
[HTTP-DNS-RR] | [HTTP-DNS-RR] | |||
Bellis, R., "A DNS Resource Record for HTTP", Work in | Bellis, R., "A DNS Resource Record for HTTP", Work in | |||
Progress, Internet-Draft, draft-bellis-dnsop-http-record- | Progress, Internet-Draft, draft-bellis-dnsop-http-record- | |||
skipping to change at line 2042 ¶ | skipping to change at line 2040 ¶ | |||
[URI] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform | [URI] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform | |||
Resource Identifier (URI): Generic Syntax", STD 66, | Resource Identifier (URI): Generic Syntax", STD 66, | |||
RFC 3986, DOI 10.17487/RFC3986, January 2005, | RFC 3986, DOI 10.17487/RFC3986, January 2005, | |||
<https://www.rfc-editor.org/info/rfc3986>. | <https://www.rfc-editor.org/info/rfc3986>. | |||
Appendix A. Decoding Text in Zone Files | Appendix A. Decoding Text in Zone Files | |||
DNS zone files are capable of representing arbitrary octet sequences | DNS zone files are capable of representing arbitrary octet sequences | |||
in basic ASCII text, using various delimiters and encodings, | in basic ASCII text, using various delimiters and encodings, | |||
according to an algorithm defined in Section 5.1 of [RFC1035]. Here, | according to an algorithm defined in Section 5.1 of [RFC1035]. The | |||
we summarize some allowed inputs to that algorithm, using ABNF: | following summarizes some allowed inputs to that algorithm, using | |||
ABNF: | ||||
; non-special is VCHAR minus DQUOTE, ";", "(", ")", and "\". | ; non-special is VCHAR minus DQUOTE, ";", "(", ")", and "\". | |||
non-special = %x21 / %x23-27 / %x2A-3A / %x3C-5B / %x5D-7E | non-special = %x21 / %x23-27 / %x2A-3A / %x3C-5B / %x5D-7E | |||
; non-digit is VCHAR minus DIGIT. | ; non-digit is VCHAR minus DIGIT. | |||
non-digit = %x21-2F / %x3A-7E | non-digit = %x21-2F / %x3A-7E | |||
; dec-octet is a number 0-255 as a three-digit decimal number. | ; dec-octet is a number 0-255 as a three-digit decimal number. | |||
dec-octet = ( "0" / "1" ) 2DIGIT / | dec-octet = ( "0" / "1" ) 2DIGIT / | |||
"2" ( ( %x30-34 DIGIT ) / ( "5" %x30-35 ) ) | "2" ( ( %x30-34 DIGIT ) / ( "5" %x30-35 ) ) | |||
escaped = "\" ( non-digit / dec-octet ) | escaped = "\" ( non-digit / dec-octet ) | |||
contiguous = 1*( non-special / escaped ) | contiguous = 1*( non-special / escaped ) | |||
skipping to change at line 2142 ¶ | skipping to change at line 2141 ¶ | |||
| include* | | | | include* | | | |||
+--------------------------+----------------------+ | +--------------------------+----------------------+ | |||
Table 3 | Table 3 | |||
Appendix C. Comparison with Alternatives | Appendix C. Comparison with Alternatives | |||
The SVCB and HTTPS RR types closely resemble, and are inspired by, | The SVCB and HTTPS RR types closely resemble, and are inspired by, | |||
some existing record types and proposals. One complaint regarding | some existing record types and proposals. One complaint regarding | |||
all of the alternatives is that web clients have seemed | all of the alternatives is that web clients have seemed | |||
unenthusiastic about implementing them. The hope here is that by | unenthusiastic about implementing them. The hope here is that an | |||
providing an extensible solution that solves multiple problems we | extensible solution that solves multiple problems will overcome this | |||
will overcome this inertia and have a path to achieve client | inertia and have a path to achieve client implementation. | |||
implementation. | ||||
C.1. Differences from the SRV RR Type | C.1. Differences from the SRV RR Type | |||
An SRV record [SRV] can perform a function similar to that of the | An SRV record [SRV] can perform a function similar to that of the | |||
SVCB record, informing a client to look in a different location for a | SVCB record, informing a client to look in a different location for a | |||
service. However, there are several differences: | service. However, there are several differences: | |||
* SRV records are typically mandatory, whereas SVCB is intended to | * SRV records are typically mandatory, whereas SVCB is intended to | |||
be optional when used with pre-existing protocols. | be optional when used with pre-existing protocols. | |||
skipping to change at line 2410 ¶ | skipping to change at line 2408 ¶ | |||
\x00\x10 # priority | \x00\x10 # priority | |||
\x03foo\x07example\x03org\x00 # target | \x03foo\x07example\x03org\x00 # target | |||
\x00\x01 # key 1 | \x00\x01 # key 1 | |||
\x00\x0c # param length 12 | \x00\x0c # param length 12 | |||
\x08 # alpn length 8 | \x08 # alpn length 8 | |||
f\oo,bar # alpn value | f\oo,bar # alpn value | |||
\x02 # alpn length 2 | \x02 # alpn length 2 | |||
h2 # alpn value | h2 # alpn value | |||
Figure 10: An alpn Value with an Escaped Comma and an Escaped | Figure 10: An "alpn" Value with an Escaped Comma and an Escaped | |||
Backslash in Two Presentation Formats | Backslash in Two Presentation Formats | |||
D.3. Failure Cases | D.3. Failure Cases | |||
This subsection contains test vectors that are not compliant with | This subsection contains test vectors that are not compliant with | |||
this document. The various reasons for non-compliance are explained | this document. The various reasons for non-compliance are explained | |||
with each example. | with each example. | |||
example.com. SVCB 1 foo.example.com. ( | example.com. SVCB 1 foo.example.com. ( | |||
key123=abc key123=def | key123=abc key123=def | |||
End of changes. 12 change blocks. | ||||
26 lines changed or deleted | 24 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. |