| rfc9460.original | rfc9460.txt | |||
|---|---|---|---|---|
| DNSOP Working Group B. Schwartz | Internet Engineering Task Force (IETF) B. Schwartz | |||
| Internet-Draft Google | Request for Comments: 9460 Meta Platforms, Inc. | |||
| Intended status: Standards Track M. Bishop | Category: Standards Track M. Bishop | |||
| Expires: 12 September 2023 E. Nygren | ISSN: 2070-1721 E. Nygren | |||
| Akamai Technologies | Akamai Technologies | |||
| 11 March 2023 | November 2023 | |||
| Service binding and parameter specification via the DNS (DNS SVCB and | Service Binding and Parameter Specification via the DNS (SVCB and HTTPS | |||
| HTTPS RRs) | Resource Records) | |||
| draft-ietf-dnsop-svcb-https-12 | ||||
| Abstract | Abstract | |||
| This document specifies the "SVCB" and "HTTPS" DNS resource record | This document specifies the "SVCB" ("Service Binding") and "HTTPS" | |||
| (RR) types to facilitate the lookup of information needed to make | DNS resource record (RR) types to facilitate the lookup of | |||
| connections to network services, such as for HTTP origins. SVCB | information needed to make connections to network services, such as | |||
| records allow a service to be provided from multiple alternative | for HTTP origins. SVCB records allow a service to be provided from | |||
| endpoints, each with associated parameters (such as transport | multiple alternative endpoints, each with associated parameters (such | |||
| protocol configuration), and are extensible to support future uses | as transport protocol configuration), and are extensible to support | |||
| (such as keys for encrypting the TLS ClientHello). They also enable | future uses (such as keys for encrypting the TLS ClientHello). They | |||
| aliasing of apex domains, which is not possible with CNAME. The | also enable aliasing of apex domains, which is not possible with | |||
| HTTPS RR is a variation of SVCB for use with HTTP [HTTP]. By | CNAME. The HTTPS RR is a variation of SVCB for use with HTTP (see | |||
| providing more information to the client before it attempts to | RFC 9110, "HTTP Semantics"). By providing more information to the | |||
| establish a connection, these records offer potential benefits to | client before it attempts to establish a connection, these records | |||
| both performance and privacy. | offer potential benefits to both performance and privacy. | |||
| TO BE REMOVED: This document is being collaborated on in Github at: | ||||
| https://github.com/MikeBishop/dns-alt-svc | ||||
| (https://github.com/MikeBishop/dns-alt-svc). The most recent working | ||||
| version of the document, open issues, etc. should all be available | ||||
| there. The authors (gratefully) accept pull requests. | ||||
| Status of This Memo | Status of This Memo | |||
| This Internet-Draft is submitted in full conformance with the | This is an Internet Standards Track document. | |||
| provisions of BCP 78 and BCP 79. | ||||
| Internet-Drafts are working documents of the Internet Engineering | This document is a product of the Internet Engineering Task Force | |||
| Task Force (IETF). Note that other groups may also distribute | (IETF). It represents the consensus of the IETF community. It has | |||
| working documents as Internet-Drafts. The list of current Internet- | received public review and has been approved for publication by the | |||
| Drafts is at https://datatracker.ietf.org/drafts/current/. | Internet Engineering Steering Group (IESG). Further information on | |||
| Internet Standards is available in Section 2 of RFC 7841. | ||||
| Internet-Drafts are draft documents valid for a maximum of six months | Information about the current status of this document, any errata, | |||
| and may be updated, replaced, or obsoleted by other documents at any | and how to provide feedback on it may be obtained at | |||
| time. It is inappropriate to use Internet-Drafts as reference | https://www.rfc-editor.org/info/rfc9460. | |||
| material or to cite them other than as "work in progress." | ||||
| This Internet-Draft will expire on 12 September 2023. | ||||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2023 IETF Trust and the persons identified as the | Copyright (c) 2023 IETF Trust and the persons identified as the | |||
| document authors. All rights reserved. | document authors. All rights reserved. | |||
| This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
| Provisions Relating to IETF Documents (https://trustee.ietf.org/ | Provisions Relating to IETF Documents | |||
| license-info) in effect on the date of publication of this document. | (https://trustee.ietf.org/license-info) in effect on the date of | |||
| Please review these documents carefully, as they describe your rights | publication of this document. Please review these documents | |||
| and restrictions with respect to this document. Code Components | carefully, as they describe your rights and restrictions with respect | |||
| extracted from this document must include Revised BSD License text as | to this document. Code Components extracted from this document must | |||
| described in Section 4.e of the Trust Legal Provisions and are | include Revised BSD License text as described in Section 4.e of the | |||
| provided without warranty as described in the Revised BSD License. | Trust Legal Provisions and are provided without warranty as described | |||
| in the Revised BSD License. | ||||
| Table of Contents | Table of Contents | |||
| 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | 1. Introduction | |||
| 1.1. Goals of the SVCB RR . . . . . . . . . . . . . . . . . . 5 | 1.1. Goals | |||
| 1.2. Overview of the SVCB RR . . . . . . . . . . . . . . . . . 5 | 1.2. Overview of the SVCB RR | |||
| 1.3. Terminology . . . . . . . . . . . . . . . . . . . . . . . 6 | 1.3. Terminology | |||
| 2. The SVCB record type . . . . . . . . . . . . . . . . . . . . 7 | 2. The SVCB Record Type | |||
| 2.1. Zone file presentation format . . . . . . . . . . . . . . 8 | 2.1. Zone-File Presentation Format | |||
| 2.2. RDATA wire format . . . . . . . . . . . . . . . . . . . . 9 | 2.2. RDATA Wire Format | |||
| 2.3. SVCB query names . . . . . . . . . . . . . . . . . . . . 10 | 2.3. SVCB Query Names | |||
| 2.4. Interpretation . . . . . . . . . . . . . . . . . . . . . 10 | 2.4. Interpretation | |||
| 2.4.1. SvcPriority . . . . . . . . . . . . . . . . . . . . . 11 | 2.4.1. SvcPriority | |||
| 2.4.2. AliasMode . . . . . . . . . . . . . . . . . . . . . . 11 | 2.4.2. AliasMode | |||
| 2.4.3. ServiceMode . . . . . . . . . . . . . . . . . . . . . 12 | 2.4.3. ServiceMode | |||
| 2.5. Special handling of "." in TargetName . . . . . . . . . . 13 | 2.5. Special Handling of "." in TargetName | |||
| 2.5.1. AliasMode . . . . . . . . . . . . . . . . . . . . . . 13 | 2.5.1. AliasMode | |||
| 2.5.2. ServiceMode . . . . . . . . . . . . . . . . . . . . . 13 | 2.5.2. ServiceMode | |||
| 3. Client behavior . . . . . . . . . . . . . . . . . . . . . . . 13 | 3. Client Behavior | |||
| 3.1. Handling resolution failures . . . . . . . . . . . . . . 15 | 3.1. Handling Resolution Failures | |||
| 3.2. Clients using a Proxy . . . . . . . . . . . . . . . . . . 15 | 3.2. Clients Using a Proxy | |||
| 4. DNS Server Behavior . . . . . . . . . . . . . . . . . . . . . 16 | 4. DNS Server Behavior | |||
| 4.1. Authoritative servers . . . . . . . . . . . . . . . . . . 16 | 4.1. Authoritative Servers | |||
| 4.2. Recursive resolvers . . . . . . . . . . . . . . . . . . . 17 | 4.2. Recursive Resolvers | |||
| 4.2.1. DNS64 . . . . . . . . . . . . . . . . . . . . . . . . 17 | 4.2.1. DNS64 | |||
| 4.3. General requirements . . . . . . . . . . . . . . . . . . 18 | 4.3. General Requirements | |||
| 4.4. EDNS Client Subnet (ECS) . . . . . . . . . . . . . . . . 18 | 4.4. EDNS Client Subnet (ECS) | |||
| 5. Performance optimizations . . . . . . . . . . . . . . . . . . 19 | 5. Performance Optimizations | |||
| 5.1. Optimistic pre-connection and connection reuse . . . . . 19 | 5.1. Optimistic Pre-connection and Connection Reuse | |||
| 5.2. Generating and using incomplete responses . . . . . . . . 20 | 5.2. Generating and Using Incomplete Responses | |||
| 6. SVCB-compatible . . . . . . . . . . . . . . . . . . . . . . . 20 | 6. SVCB-Compatible RR Types | |||
| 7. Initial SvcParamKeys . . . . . . . . . . . . . . . . . . . . 21 | 7. Initial SvcParamKeys | |||
| 7.1. "alpn" and "no-default-alpn" . . . . . . . . . . . . . . 21 | 7.1. "alpn" and "no-default-alpn" | |||
| 7.1.1. Representation . . . . . . . . . . . . . . . . . . . 22 | 7.1.1. Representation | |||
| 7.1.2. Use . . . . . . . . . . . . . . . . . . . . . . . . . 22 | 7.1.2. Use | |||
| 7.2. "port" . . . . . . . . . . . . . . . . . . . . . . . . . 23 | 7.2. "port" | |||
| 7.3. "ipv4hint" and "ipv6hint" . . . . . . . . . . . . . . . . 24 | 7.3. "ipv4hint" and "ipv6hint" | |||
| 7.4. "mandatory" . . . . . . . . . . . . . . . . . . . . . . . 25 | 7.4. "mandatory" | |||
| 8. ServiceMode RR compatibility and mandatory keys . . . . . . . 25 | 8. ServiceMode RR Compatibility and Mandatory Keys | |||
| 9. Using Service Bindings with HTTP . . . . . . . . . . . . . . 26 | 9. Using Service Bindings with HTTP | |||
| 9.1. Query names for HTTPS RRs . . . . . . . . . . . . . . . . 26 | 9.1. Query Names for HTTPS RRs | |||
| 9.2. Comparison with Alt-Svc . . . . . . . . . . . . . . . . . 27 | 9.2. Comparison with Alt-Svc | |||
| 9.2.1. ALPN usage . . . . . . . . . . . . . . . . . . . . . 27 | 9.2.1. ALPN Usage | |||
| 9.2.2. Untrusted channel . . . . . . . . . . . . . . . . . . 27 | 9.2.2. Untrusted Channels | |||
| 9.2.3. Cache lifetime . . . . . . . . . . . . . . . . . . . 27 | 9.2.3. Cache Lifetime | |||
| 9.2.4. Granularity . . . . . . . . . . . . . . . . . . . . . 28 | 9.2.4. Granularity | |||
| 9.3. Interaction with Alt-Svc . . . . . . . . . . . . . . . . 28 | 9.3. Interaction with Alt-Svc | |||
| 9.4. Requiring Server Name Indication . . . . . . . . . . . . 29 | 9.4. Requiring Server Name Indication | |||
| 9.5. HTTP Strict Transport Security . . . . . . . . . . . . . 29 | 9.5. HTTP Strict Transport Security (HSTS) | |||
| 9.6. Use of HTTPS RRs in other protocols . . . . . . . . . . . 30 | 9.6. Use of HTTPS RRs in Other Protocols | |||
| 10. Zone Structures . . . . . . . . . . . . . . . . . . . . . . . 30 | 10. Zone Structures | |||
| 10.1. Structuring zones for flexibility . . . . . . . . . . . 31 | 10.1. Structuring Zones for Flexibility | |||
| 10.2. Structuring zones for performance . . . . . . . . . . . 31 | 10.2. Structuring Zones for Performance | |||
| 10.3. Operational considerations . . . . . . . . . . . . . . . 32 | 10.3. Operational Considerations | |||
| 10.4. Examples . . . . . . . . . . . . . . . . . . . . . . . . 32 | 10.4. Examples | |||
| 10.4.1. Protocol enhancements . . . . . . . . . . . . . . . 32 | 10.4.1. Protocol Enhancements | |||
| 10.4.2. Apex aliasing . . . . . . . . . . . . . . . . . . . 32 | 10.4.2. Apex Aliasing | |||
| 10.4.3. Parameter binding . . . . . . . . . . . . . . . . . 33 | 10.4.3. Parameter Binding | |||
| 10.4.4. Multi-CDN . . . . . . . . . . . . . . . . . . . . . 33 | 10.4.4. Multi-CDN Configuration | |||
| 10.4.5. Non-HTTP uses . . . . . . . . . . . . . . . . . . . 35 | 10.4.5. Non-HTTP Uses | |||
| 11. Interaction with other standards . . . . . . . . . . . . . . 36 | 11. Interaction with Other Standards | |||
| 12. Security Considerations . . . . . . . . . . . . . . . . . . . 36 | 12. Security Considerations | |||
| 13. Privacy Considerations . . . . . . . . . . . . . . . . . . . 37 | 13. Privacy Considerations | |||
| 14. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 37 | 14. IANA Considerations | |||
| 14.1. SVCB RRType . . . . . . . . . . . . . . . . . . . . . . 37 | 14.1. SVCB RR Type | |||
| 14.2. HTTPS RRType . . . . . . . . . . . . . . . . . . . . . . 37 | 14.2. HTTPS RR Type | |||
| 14.3. New registry for Service Parameters . . . . . . . . . . 38 | 14.3. New Registry for Service Parameters | |||
| 14.3.1. Procedure . . . . . . . . . . . . . . . . . . . . . 38 | 14.3.1. Procedure | |||
| 14.3.2. Initial contents . . . . . . . . . . . . . . . . . . 39 | 14.3.2. Initial Contents | |||
| 14.4. Other registry updates . . . . . . . . . . . . . . . . . 41 | 14.4. Other Registry Updates | |||
| 15. Acknowledgments and Related Proposals . . . . . . . . . . . . 41 | 15. References | |||
| 16. References . . . . . . . . . . . . . . . . . . . . . . . . . 41 | 15.1. Normative References | |||
| 16.1. Normative References . . . . . . . . . . . . . . . . . . 41 | 15.2. Informative References | |||
| 16.2. Informative References . . . . . . . . . . . . . . . . . 44 | Appendix A. Decoding Text in Zone Files | |||
| Appendix A. Decoding text in zone files . . . . . . . . . . . . 45 | A.1. Decoding a Comma-Separated List | |||
| A.1. Decoding a comma-separated list . . . . . . . . . . . . . 46 | Appendix B. HTTP Mapping Summary | |||
| Appendix B. HTTP Mapping Summary . . . . . . . . . . . . . . . . 47 | Appendix C. Comparison with Alternatives | |||
| Appendix C. Comparison with alternatives . . . . . . . . . . . . 48 | C.1. Differences from the SRV RR Type | |||
| C.1. Differences from the SRV RR type . . . . . . . . . . . . 48 | C.2. Differences from the Proposed HTTP Record | |||
| C.2. Differences from the proposed HTTP record . . . . . . . . 48 | C.3. Differences from the Proposed ANAME Record | |||
| C.3. Differences from the proposed ANAME record . . . . . . . 48 | C.4. Comparison with Separate RR Types for AliasMode and | |||
| C.4. Comparison with separate RR types for AliasMode and | ServiceMode | |||
| ServiceMode . . . . . . . . . . . . . . . . . . . . . . . 49 | Appendix D. Test Vectors | |||
| Appendix D. Test vectors . . . . . . . . . . . . . . . . . . . . 49 | D.1. AliasMode | |||
| D.1. AliasMode . . . . . . . . . . . . . . . . . . . . . . . . 49 | D.2. ServiceMode | |||
| D.2. ServiceMode . . . . . . . . . . . . . . . . . . . . . . . 49 | D.3. Failure Cases | |||
| D.3. Failure cases . . . . . . . . . . . . . . . . . . . . . . 54 | Acknowledgments and Related Proposals | |||
| Appendix E. Change history . . . . . . . . . . . . . . . . . . . 55 | Authors' Addresses | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 60 | ||||
| 1. Introduction | 1. Introduction | |||
| The SVCB ("Service Binding") and HTTPS RRs provide clients with | The SVCB ("Service Binding") and HTTPS resource records (RRs) provide | |||
| complete instructions for access to a service. This information | clients with complete instructions for access to a service. This | |||
| enables improved performance and privacy by avoiding transient | information enables improved performance and privacy by avoiding | |||
| connections to a suboptimal default server, negotiating a preferred | transient connections to a suboptimal default server, negotiating a | |||
| protocol, and providing relevant public keys. | preferred protocol, and providing relevant public keys. | |||
| For example, HTTP clients currently resolve only A and/or AAAA | For example, HTTP clients currently resolve only A and/or AAAA | |||
| records for the origin hostname, learning only its IP addresses. If | records for the origin hostname, learning only its IP addresses. If | |||
| an HTTP client learns more about the origin before connecting, it may | an HTTP client learns more about the origin before connecting, it may | |||
| be able to upgrade "http" URLs to "https", enable HTTP/3 or Encrypted | be able to upgrade "http" URLs to "https", enable HTTP/3 or Encrypted | |||
| ClientHello [ECH], or switch to an operationally preferable endpoint. | ClientHello [ECH], or switch to an operationally preferable endpoint. | |||
| It is highly desirable to minimize the number of round-trips and | It is highly desirable to minimize the number of round trips and | |||
| lookups required to learn this additional information. | lookups required to learn this additional information. | |||
| The SVCB and HTTPS RRs also help when the operator of a service | The SVCB and HTTPS RRs also help when the operator of a service | |||
| wishes to delegate operational control to one or more other domains, | wishes to delegate operational control to one or more other domains, | |||
| e.g. delegating the origin "https://example.com" to a service | e.g., aliasing the origin "https://example.com" to a service operator | |||
| operator endpoint at "svc.example.net". While this case can | endpoint at "svc.example.net". While this case can sometimes be | |||
| sometimes be handled by a CNAME, that does not cover all use-cases. | handled by a CNAME, that does not cover all use cases. CNAME is also | |||
| CNAME is also inadequate when the service operator needs to provide a | inadequate when the service operator needs to provide a bound | |||
| bound collection of consistent configuration parameters through the | collection of consistent configuration parameters through the DNS | |||
| DNS (such as network location, protocol, and keying information). | (such as network location, protocol, and keying information). | |||
| This document first describes the SVCB RR as a general-purpose | This document first describes the SVCB RR as a general-purpose RR | |||
| resource record that can be applied directly and efficiently to a | that can be applied directly and efficiently to a wide range of | |||
| wide range of services (Section 2). It also describes the rules for | services (Section 2). It also describes the rules for defining other | |||
| defining other SVCB-compatible RR types (Section 6), starting with | SVCB-compatible RR types (Section 6), starting with the HTTPS RR type | |||
| the HTTPS RR type (Section 9), which provides improved efficiency and | (Section 9), which provides improved efficiency and convenience with | |||
| convenience with HTTP by avoiding the need for an Attrleaf label | HTTP by avoiding the need for an Attrleaf label [Attrleaf] | |||
| [Attrleaf] (Section 9.1). | (Section 9.1). | |||
| The SVCB RR has two modes: 1) "AliasMode", which simply delegates | The SVCB RR has two modes: 1) "AliasMode", which simply delegates | |||
| operational control for a resource; 2) "ServiceMode", which binds | operational control for a resource and 2) "ServiceMode", which binds | |||
| together configuration information for a service endpoint. | together configuration information for a service endpoint. | |||
| ServiceMode provides additional key=value parameters within each | ServiceMode provides additional key=value parameters within each | |||
| RDATA set. | RDATA set. | |||
| 1.1. Goals of the SVCB RR | 1.1. Goals | |||
| The goal of the SVCB RR is to allow clients to resolve a single | The goal of the SVCB RR is to allow clients to resolve a single | |||
| additional DNS RR in a way that: | additional DNS RR in a way that: | |||
| * Provides alternative endpoints that are authoritative for the | * Provides alternative endpoints that are authoritative for the | |||
| service, along with parameters associated with each of these | service, along with parameters associated with each of these | |||
| endpoints. | endpoints. | |||
| * Does not assume that all alternative endpoints have the same | * Does not assume that all alternative endpoints have the same | |||
| parameters or capabilities, or are even operated by the same | parameters or capabilities, or are even operated by the same | |||
| entity. This is important, as DNS does not provide any way to tie | entity. This is important, as DNS does not provide any way to tie | |||
| together multiple RRSets for the same name. For example, if | together multiple RRsets for the same name. For example, if | |||
| www.example.com is a CNAME alias that switches between one of | "www.example.com" is a CNAME alias that switches between one of | |||
| three CDNs or hosting environments, successive queries for that | three Content Delivery Networks (CDNs) or hosting environments, | |||
| name may return records that correspond to different environments. | successive queries for that name may return records that | |||
| correspond to different environments. | ||||
| * Enables CNAME-like functionality at a zone apex (such as | * Enables CNAME-like functionality at a zone apex (such as | |||
| "example.com") for participating protocols, and generally enables | "example.com") for participating protocols and generally enables | |||
| delegation of operational authority for an origin within the DNS | extending operational authority for a service identified by a | |||
| to an alternate name. | domain name to other instances with alternate names. | |||
| Additional goals specific to HTTPS RRs and the HTTP use-cases | Additional goals specific to HTTPS RRs and the HTTP use cases | |||
| include: | include: | |||
| * Connect directly to HTTP/3 (QUIC transport) alternative endpoints | * Connecting directly to HTTP/3 (QUIC transport) alternative | |||
| [HTTP3] | endpoints [HTTP/3]. | |||
| * Support non-default TCP and UDP ports | * Supporting non-default TCP and UDP ports. | |||
| * Enable SRV-like benefits (e.g. apex delegation, as mentioned | * Enabling SRV-like benefits (e.g., apex aliasing, as mentioned | |||
| above) for HTTP, where SRV [SRV] has not been widely adopted | above) for HTTP, where SRV [SRV] has not been widely adopted. | |||
| * Provide an HSTS-like indication [HSTS] signaling that the "https" | * Providing an indication signaling that the "https" scheme should | |||
| scheme should be used instead of "http" for all HTTP requests to | be used instead of "http" for all HTTP requests to this host and | |||
| this host and port (see Section 9.5). | port, similar to HTTP Strict Transport Security [HSTS] (see | |||
| Section 9.5). | ||||
| * Enable the conveyance of Encrypted ClientHello [ECH] keys | * Enabling the conveyance of Encrypted ClientHello keys [ECH] | |||
| associated with an alternative endpoint. | associated with an alternative endpoint. | |||
| 1.2. Overview of the SVCB RR | 1.2. Overview of the SVCB RR | |||
| This subsection briefly describes the SVCB RR with forward references | This subsection briefly describes the SVCB RR with forward references | |||
| to the full exposition of each component. (As mentioned above, this | to the full exposition of each component. (As discussed in | |||
| all applies equally to the HTTPS RR which shares the same encoding, | Section 6, this all applies equally to the HTTPS RR, which shares the | |||
| format, and high-level semantics.) | same encoding, format, and high-level semantics.) | |||
| The SVCB RR has two modes: AliasMode (Section 2.4.2), which aliases a | ||||
| name to another name, and ServiceMode (Section 2.4.3), which provides | The SVCB RR has two modes: 1) AliasMode (Section 2.4.2), which | |||
| connection information bound to a service endpoint domain. Placing | aliases a name to another name and 2) ServiceMode (Section 2.4.3), | |||
| both forms in a single RR type allows clients to fetch the relevant | which provides connection information bound to a service endpoint | |||
| information with a single query (Section 2.3). | domain. Placing both forms in a single RR type allows clients to | |||
| 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: | |||
| 1. SvcPriority (Section 2.4.1): The priority of this record | SvcPriority (Section 2.4.1): The priority of this record (relative | |||
| (relative to others, with lower values preferred). A value of 0 | to others, with lower values preferred). A value of 0 indicates | |||
| indicates AliasMode. | AliasMode. | |||
| 2. TargetName: The domain name of either the alias target (for | TargetName: The domain name of either the alias target (for | |||
| AliasMode) or the alternative endpoint (for ServiceMode). | AliasMode) or the alternative endpoint (for ServiceMode). | |||
| 3. SvcParams (optional): A list of key=value pairs describing the | SvcParams (optional): A list of key=value pairs describing the | |||
| alternative endpoint at TargetName (only used in ServiceMode and | alternative endpoint at TargetName (only used in ServiceMode and | |||
| otherwise ignored). Described in Section 2.1. | otherwise ignored). 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 | bailiwick SVCB, A, AAAA, and CNAME records in the Additional section | |||
| Section to responses for a SVCB query (Section 4.1). | to responses for a SVCB query (Section 4.1). | |||
| In ServiceMode, the SvcParams of the SVCB RR provide an extensible | In ServiceMode, the SvcParams of the SVCB RR provide an extensible | |||
| data model for describing alternative endpoints that are | data model for describing alternative endpoints that are | |||
| authoritative for a service, along with parameters associated with | authoritative for a service, along with parameters associated with | |||
| 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 roundtrips) 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. | |||
| * An "alternative endpoint" is a hostname, port number, and other | * An "alternative endpoint" is a hostname, port number, and other | |||
| associated instructions to the client on how to reach an instance | associated instructions to the client on how to reach an instance | |||
| of service. | of a service. | |||
| Additional DNS terminology intends to be consistent with [DNSTerm]. | Additional DNS terminology intends to be consistent with [DNSTerm]. | |||
| SVCB is a contraction of "service binding". The SVCB RR, HTTPS RR, | SVCB is a contraction of "service binding". The SVCB RR, HTTPS RR, | |||
| and future RR types that share SVCB's formats and registry are | and future RR types that share SVCB's formats and registry are | |||
| collectively known as SVCB-compatible RR types. The contraction | collectively known as SVCB-compatible RR types. The contraction | |||
| "SVCB" is also used to refer to this system as a whole. | "SVCB" is also used to refer to this system as a whole. | |||
| The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
| "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
| "OPTIONAL" in this document are to be interpreted as described in BCP | "OPTIONAL" in this document are to be interpreted as described in | |||
| 14 [RFC2119] [RFC8174] when, and only when, they appear in all | BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
| capitals, as shown here. | capitals, as shown here. | |||
| 2. The SVCB record type | 2. The SVCB Record Type | |||
| The SVCB DNS resource record (RR) type (RR type 64) is used to locate | The SVCB DNS RR type (RR type 64) is used to locate alternative | |||
| alternative endpoints for a service. | endpoints for a service. | |||
| The algorithm for resolving SVCB records and associated address | The algorithm for resolving SVCB records and associated address | |||
| records is specified in Section 3. | records is specified in Section 3. | |||
| Other SVCB-compatible resource record types can also be defined as- | Other SVCB-compatible RR types can also be defined as needed (see | |||
| needed (see Section 6). In particular, the HTTPS RR (RR type 65) | Section 6). In particular, the HTTPS RR (RR type 65) provides | |||
| provides special handling for the case of "https" origins as | special handling for the case of "https" origins as described in | |||
| described in Section 9. | Section 9. | |||
| SVCB RRs are extensible by a list of SvcParams, which are pairs | SVCB RRs are extensible by a list of SvcParams, which are pairs | |||
| consisting of a SvcParamKey and a SvcParamValue. Each SvcParamKey | consisting of a SvcParamKey and a SvcParamValue. Each SvcParamKey | |||
| has a presentation name and a registered number. Values are in a | has a presentation name and a registered number. Values are in a | |||
| format specific to the SvcParamKey. Each SvcParam has a specified | format specific to the SvcParamKey. Each SvcParam has a specified | |||
| presentation format (used in zone files) and wire encoding (e.g., | presentation format (used in zone files) and wire encoding (e.g., | |||
| domain names, binary data, or numeric values). The initial | domain names, binary data, or numeric values). The initial | |||
| SvcParamKeys and their formats are defined in Section 7. | SvcParamKeys and their formats are defined in Section 7. | |||
| 2.1. Zone file presentation format | 2.1. Zone-File Presentation Format | |||
| The presentation format <RDATA> of the record ([RFC1035], | The presentation format <RDATA> of the record ([RFC1035], | |||
| Section 5.1) has the form: | Section 5.1) has the form: | |||
| SvcPriority TargetName SvcParams | SvcPriority TargetName SvcParams | |||
| The SVCB record is defined specifically within the Internet ("IN") | The SVCB record is defined specifically within the Internet ("IN") | |||
| Class ([RFC1035], Section 3.2.4). | Class ([RFC1035], Section 3.2.4). | |||
| SvcPriority is a number in the range 0-65535, TargetName is a | SvcPriority is a number in the range 0-65535, TargetName is a | |||
| <domain-name> ([RFC1035], Section 5.1), and the SvcParams are a | <domain-name> ([RFC1035], Section 5.1), and the SvcParams are a | |||
| whitespace-separated list, with each SvcParam consisting of a | whitespace-separated list with each SvcParam consisting of a | |||
| SvcParamKey=SvcParamValue pair or a standalone SvcParamKey. | SvcParamKey=SvcParamValue pair or a standalone SvcParamKey. | |||
| SvcParamKeys are subject to IANA control (Section 14.3). | SvcParamKeys are registered by IANA (Section 14.3). | |||
| Each SvcParamKey SHALL appear at most once in the SvcParams. In | Each SvcParamKey SHALL appear at most once in the SvcParams. In | |||
| presentation format, SvcParamKeys are lower-case alphanumeric | presentation format, SvcParamKeys are lowercase alphanumeric strings. | |||
| strings. Key names contain 1-63 characters from the ranges "a"-"z", | Key names contain 1-63 characters from the ranges "a"-"z", "0"-"9", | |||
| "0"-"9", and "-". In ABNF [RFC5234], | and "-". In ABNF [RFC5234], | |||
| alpha-lc = %x61-7A ; a-z | alpha-lc = %x61-7A ; a-z | |||
| SvcParamKey = 1*63(alpha-lc / DIGIT / "-") | SvcParamKey = 1*63(alpha-lc / DIGIT / "-") | |||
| SvcParam = SvcParamKey ["=" SvcParamValue] | SvcParam = SvcParamKey ["=" SvcParamValue] | |||
| SvcParamValue = char-string ; See Appendix A | SvcParamValue = char-string ; See Appendix A. | |||
| value = *OCTET ; Value before key-specific parsing | value = *OCTET ; Value before key-specific parsing | |||
| The SvcParamValue is parsed using the character-string decoding | The SvcParamValue is parsed using the character-string decoding | |||
| algorithm (Appendix A), producing a value. The value is then | algorithm (Appendix A), producing a value. The value is then | |||
| validated and converted into wire-format in a manner specific to each | validated and converted into wire format in a manner specific to each | |||
| key. | key. | |||
| When the optional "=" and SvcParamValue are omitted, the value is | When the optional "=" and SvcParamValue are omitted, the value is | |||
| interpreted as empty. | interpreted as empty. | |||
| Arbitrary keys can be represented using the unknown-key presentation | Arbitrary keys can be represented using the unknown-key presentation | |||
| format "keyNNNNN" where NNNNN is the numeric value of the key type | format "keyNNNNN" where NNNNN is the numeric value of the key type | |||
| without leading zeros. A SvcParam in this form SHALL be parsed as | without leading zeros. A SvcParam in this form SHALL be parsed as | |||
| specified above, and the decoded value SHALL be used as its wire | specified above, and the decoded value SHALL be used as its wire- | |||
| format encoding. | format encoding. | |||
| For some SvcParamKeys, the value corresponds to a list or set of | For some SvcParamKeys, the value corresponds to a list or set of | |||
| items. Presentation formats for such keys SHOULD use a comma- | items. Presentation formats for such keys SHOULD use a comma- | |||
| separated list (Appendix A.1). | separated list (Appendix A.1). | |||
| SvcParams in presentation format MAY appear in any order, but keys | SvcParams in presentation format MAY appear in any order, but keys | |||
| MUST NOT be repeated. | MUST NOT be repeated. | |||
| 2.2. RDATA wire format | 2.2. RDATA Wire Format | |||
| The RDATA for the SVCB RR consists of: | The RDATA for the SVCB RR consists of: | |||
| * a 2-octet field for SvcPriority as an integer in network byte | * a 2-octet field for SvcPriority as an integer in network byte | |||
| order. | order. | |||
| * the uncompressed, fully-qualified TargetName, represented as a | * the uncompressed, fully qualified TargetName, represented as a | |||
| sequence of length-prefixed labels as in Section 3.1 of [RFC1035]. | sequence of length-prefixed labels per Section 3.1 of [RFC1035]. | |||
| * the SvcParams, consuming the remainder of the record (so smaller | * the SvcParams, consuming the remainder of the record (so smaller | |||
| than 65535 octets and constrained by the RDATA and DNS message | than 65535 octets and constrained by the RDATA and DNS message | |||
| sizes). | sizes). | |||
| When the list of SvcParams is non-empty, it contains a series of | When the list of SvcParams is non-empty, it contains a series of | |||
| SvcParamKey=SvcParamValue pairs, represented as: | SvcParamKey=SvcParamValue pairs, represented as: | |||
| * a 2-octet field containing the SvcParamKey as an integer in | * a 2-octet field containing the SvcParamKey as an integer in | |||
| network byte order. (See Section 14.3.2 for the defined values.) | network byte order. (See Section 14.3.2 for the defined values.) | |||
| skipping to change at page 9, line 39 ¶ | skipping to change at line 408 ¶ | |||
| SvcParamValue in a format determined by the SvcParamKey. | SvcParamValue in a format determined by the SvcParamKey. | |||
| SvcParamKeys SHALL appear in increasing numeric order. | SvcParamKeys SHALL appear in increasing numeric order. | |||
| Clients MUST consider an RR malformed if: | Clients MUST consider an RR malformed if: | |||
| * the end of the RDATA occurs within a SvcParam. | * the end of the RDATA occurs within a SvcParam. | |||
| * SvcParamKeys are not in strictly increasing numeric order. | * SvcParamKeys are not in strictly increasing numeric order. | |||
| * the SvcParamValue for an SvcParamKey does not have the expected | * the SvcParamValue for a SvcParamKey does not have the expected | |||
| format. | format. | |||
| Note that the second condition implies that there are no duplicate | Note that the second condition implies that there are no duplicate | |||
| SvcParamKeys. | SvcParamKeys. | |||
| If any RRs are malformed, the client MUST reject the entire RRSet and | If any RRs are malformed, the client MUST reject the entire RRset and | |||
| fall back to non-SVCB connection establishment. | fall back to non-SVCB connection establishment. | |||
| 2.3. SVCB query names | 2.3. SVCB Query Names | |||
| When querying the SVCB RR, a service is translated into a QNAME by | When querying the SVCB RR, a service is translated into a QNAME by | |||
| 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 | This document terms this behavior "Port Prefix Naming" and uses it in | |||
| examples throughout this document. | the examples throughout. | |||
| See Section 9.1 for the 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 | |||
| validation purposes. For example, TLS clients MUST continue to | validation purposes. For example, TLS clients MUST continue to | |||
| validate TLS certificates for the original service name. | validate TLS certificates for the original service name. | |||
| As an example, the owner of example.com could publish this record: | As an example, the owner of "example.com" could publish this record: | |||
| _8443._foo.api.example.com. 7200 IN SVCB 0 svc4.example.net. | _8443._foo.api.example.com. 7200 IN SVCB 0 svc4.example.net. | |||
| to indicate that "foo://api.example.com:8443" is aliased to | This record would indicate that "foo://api.example.com:8443" is | |||
| "svc4.example.net". The owner of example.net, in turn, could publish | aliased to "svc4.example.net". The owner of "example.net", in turn, | |||
| 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" ) | |||
| to indicate that these services are served on port number 8004, which | This record would indicate that these services are served on port | |||
| supports the protocol "bar" and its associated transport in addition | number 8004, which supports the protocol "bar" and its associated | |||
| 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 | |||
| ServiceMode records in the set. | ServiceMode records in the set. | |||
| RRSets are explicitly unordered collections, so the SvcPriority field | RRsets are explicitly unordered collections, so the SvcPriority field | |||
| is used to impose an ordering on SVCB RRs. A smaller SvcPriority | is used to impose an ordering on SVCB RRs. A smaller SvcPriority | |||
| indicates that the domain owner recommends use of this record over | indicates that the domain owner recommends the use of this record | |||
| ServiceMode RRs with a larger SvcPriority value. | over ServiceMode RRs with a larger SvcPriority value. | |||
| When receiving an RRSet containing multiple SVCB records with the | When receiving an RRset containing multiple SVCB records with the | |||
| same SvcPriority value, clients SHOULD apply a random shuffle within | same SvcPriority value, clients SHOULD apply a random shuffle within | |||
| a priority level to the records before using them, to ensure uniform | a priority level to the records before using them, to ensure uniform | |||
| load-balancing. | load balancing. | |||
| 2.4.2. AliasMode | 2.4.2. AliasMode | |||
| In AliasMode, the SVCB record aliases a service to a TargetName. | In AliasMode, the SVCB record aliases a service to a TargetName. | |||
| SVCB RRSets SHOULD only have a single resource record in AliasMode. | SVCB RRsets SHOULD only have a single RR in AliasMode. If multiple | |||
| If multiple are present, clients or recursive resolvers SHOULD pick | AliasMode RRs are present, clients or recursive resolvers SHOULD pick | |||
| one at random. | one at random. | |||
| The primary purpose of AliasMode is to allow aliasing at the zone | The primary purpose of AliasMode is to allow aliasing at the zone | |||
| apex, where CNAME is not allowed (see e.g. [RFC1912], Section 2.4). | apex, where CNAME is not allowed (see, for example, [RFC1912], | |||
| In AliasMode, the TargetName will be the name of a domain that | Section 2.4). In AliasMode, the TargetName will be the name of a | |||
| resolves to SVCB, AAAA, and/or A records. (See Section 6 for | domain that resolves to SVCB, AAAA, and/or A records. (See Section 6 | |||
| aliasing of SVCB-compatible RR types.) Unlike CNAME, AliasMode | for aliasing of SVCB-compatible RR types.) Unlike CNAME, AliasMode | |||
| records do not affect the resolution of other RR types, and apply | records do not affect the resolution of other RR types and apply only | |||
| only to a specific service, not an entire domain name. | to a specific service, not an entire domain name. | |||
| The AliasMode TargetName SHOULD NOT be equal to the owner name, as | The AliasMode TargetName SHOULD NOT be equal to the owner name, as | |||
| this would result in a loop. In AliasMode, recipients MUST ignore | this would result in a loop. In AliasMode, recipients MUST ignore | |||
| any SvcParams that are present. Zone-file parsers MAY emit a warning | any SvcParams that are present. Zone-file parsers MAY emit a warning | |||
| if an AliasMode record has SvcParams. The use of SvcParams in | if an AliasMode record has SvcParams. The use of SvcParams in | |||
| AliasMode records is currently not defined, but a future | AliasMode records is currently not defined, but a future | |||
| specification could extend AliasMode records to include SvcParams. | specification could extend AliasMode records to include SvcParams. | |||
| For example, the operator of foo://example.com:8080 could point | For example, the operator of "foo://example.com:8080" could point | |||
| requests to a service operating at foosvc.example.net by publishing: | requests to a service operating at "foosvc.example.net" by | |||
| publishing: | ||||
| _8080._foo.example.com. 3600 IN SVCB 0 foosvc.example.net. | _8080._foo.example.com. 3600 IN SVCB 0 foosvc.example.net. | |||
| Using AliasMode maintains a separation of concerns: the owner of | Using AliasMode maintains a separation of concerns: the owner of | |||
| foosvc.example.net can add or remove ServiceMode SVCB records without | "foosvc.example.net" can add or remove ServiceMode SVCB records | |||
| requiring a corresponding change to example.com. Note that if | without requiring a corresponding change to "example.com". Note that | |||
| foosvc.example.net promises to always publish a SVCB record, this | if "foosvc.example.net" promises to always publish a SVCB record, | |||
| AliasMode record can be replaced by a CNAME at the same owner name, | this AliasMode record can be replaced by a CNAME at the same owner | |||
| which would likely improve performance. | name. | |||
| AliasMode is especially useful for SVCB-compatible RR types that do | AliasMode is especially useful for SVCB-compatible RR types that do | |||
| not require an underscore prefix, such as the HTTPS RR type. For | not require an underscore prefix, such as the HTTPS RR type. For | |||
| example, the operator of https://example.com could point requests to | example, the operator of "https://example.com" could point requests | |||
| a server at svc.example.net by publishing this record at the zone | to a server at "svc.example.net" by publishing this record at the | |||
| apex: | zone apex: | |||
| example.com. 3600 IN HTTPS 0 svc.example.net. | example.com. 3600 IN HTTPS 0 svc.example.net. | |||
| Note that the SVCB record's owner name MAY be the canonical name of a | Note that the SVCB record's owner name MAY be the canonical name of a | |||
| CNAME record, and the TargetName MAY be the owner of a CNAME record. | CNAME record, and the TargetName MAY be the owner of a CNAME record. | |||
| Clients and recursive resolvers MUST follow CNAMEs as normal. | Clients and recursive resolvers MUST follow CNAMEs as normal. | |||
| To avoid unbounded alias chains, clients and recursive resolvers MUST | To avoid unbounded alias chains, clients and recursive resolvers MUST | |||
| impose a limit on the total number of SVCB aliases they will follow | impose a limit on the total number of SVCB aliases they will follow | |||
| for each resolution request. This limit MUST NOT be zero, i.e. | for each resolution request. This limit MUST NOT be zero, i.e., | |||
| implementations MUST be able to follow at least one AliasMode record. | implementations MUST be able to follow at least one AliasMode record. | |||
| The exact value of this limit is left to implementations. | The exact value of this limit is left to implementations. | |||
| Zones that require following multiple AliasMode records could | Zones that require following multiple AliasMode records could | |||
| encounter compatibility and performance issues. | encounter compatibility and performance issues. | |||
| As legacy clients will not know to use this record, service operators | As legacy clients will not know to use this record, service operators | |||
| will likely need to retain fallback AAAA and A records alongside this | will likely need to retain fallback AAAA and A records alongside this | |||
| SVCB record, although in a common case the target of the SVCB record | SVCB record, although in a common case the target of the SVCB record | |||
| might offer better performance, and therefore would be preferable for | might offer better performance, and therefore would be preferable for | |||
| clients implementing this specification to use. | clients implementing this specification to use. | |||
| AliasMode records only apply to queries for the specific RR type. | AliasMode records only apply to queries for the specific RR type. | |||
| For example, a SVCB record cannot alias to an HTTPS record, nor vice- | For example, a SVCB record cannot alias to an HTTPS record or vice | |||
| versa. | versa. | |||
| 2.4.3. ServiceMode | 2.4.3. ServiceMode | |||
| In ServiceMode, the TargetName and SvcParams within each resource | In ServiceMode, the TargetName and SvcParams within each RR associate | |||
| record associate an alternative endpoint for the service with its | an alternative endpoint for the service with its connection | |||
| connection parameters. | parameters. | |||
| Each protocol scheme that uses SVCB MUST define a protocol mapping | Each protocol scheme that uses SVCB MUST define a protocol mapping | |||
| that explains how SvcParams are applied for connections of that | that explains how SvcParams are applied for connections of that | |||
| scheme. Unless specified otherwise by the protocol mapping, clients | scheme. Unless specified otherwise by the protocol mapping, clients | |||
| MUST ignore any SvcParam that they do not recognize. | MUST ignore any SvcParam that they do not recognize. | |||
| Some SvcParams impose requirements on other SvcParams in the RR. A | Some SvcParams impose requirements on other SvcParams in the RR. A | |||
| ServiceMode RR is called "self-consistent" if its SvcParams all | ServiceMode RR is called "self-consistent" if its SvcParams all | |||
| comply with each other's requirements. Clients MUST reject any RR | comply with each other's requirements. Clients MUST reject any RR | |||
| whose recognized SvcParams are not self-consistent, and MAY reject | whose recognized SvcParams are not self-consistent and MAY reject the | |||
| the entire RRSet. To help zone operators avoid this condition, zone- | entire RRset. To help zone operators avoid this condition, zone-file | |||
| file implementations SHOULD enforce self-consistency as well. | implementations SHOULD enforce self-consistency as well. | |||
| 2.5. Special handling of "." in TargetName | 2.5. Special Handling of "." in TargetName | |||
| If TargetName has the value "." (represented in the wire format as a | If TargetName has the value "." (represented in the wire format as a | |||
| zero-length label), special rules apply. | zero-length label), special rules apply. | |||
| 2.5.1. AliasMode | 2.5.1. AliasMode | |||
| For AliasMode SVCB RRs, a TargetName of "." indicates that the | For AliasMode SVCB RRs, a TargetName of "." indicates that the | |||
| service is not available or does not exist. This indication is | service is not available or does not exist. This indication is | |||
| advisory: clients encountering this indication MAY ignore it and | advisory: clients encountering this indication MAY ignore it and | |||
| attempt to connect without the use of SVCB. | attempt to connect without the use of SVCB. | |||
| 2.5.2. ServiceMode | 2.5.2. ServiceMode | |||
| For ServiceMode SVCB RRs, if TargetName has the value ".", then the | For ServiceMode SVCB RRs, if TargetName has the value ".", then the | |||
| owner name of this record MUST be used as the effective TargetName. | owner name of this record MUST be used as the effective TargetName. | |||
| If the record has a wildcard owner name in the zone file, the | If the record has a wildcard owner name in the zone file, the | |||
| recipient SHALL use the response's synthesized owner name as the | recipient SHALL use the response's synthesized owner name as the | |||
| effective TargetName. | effective TargetName. | |||
| For example, in the following example "svc2.example.net" is the | Here, for example, "svc2.example.net" is the effective TargetName: | |||
| effective TargetName: | ||||
| example.com. 7200 IN HTTPS 0 svc.example.net. | example.com. 7200 IN HTTPS 0 svc.example.net. | |||
| svc.example.net. 7200 IN CNAME svc2.example.net. | svc.example.net. 7200 IN CNAME svc2.example.net. | |||
| svc2.example.net. 7200 IN HTTPS 1 . port=8002 | svc2.example.net. 7200 IN HTTPS 1 . port=8002 | |||
| svc2.example.net. 300 IN A 192.0.2.2 | svc2.example.net. 300 IN A 192.0.2.2 | |||
| svc2.example.net. 300 IN AAAA 2001:db8::2 | svc2.example.net. 300 IN AAAA 2001:db8::2 | |||
| 3. Client behavior | 3. Client Behavior | |||
| "SVCB resolution" is the process of enumerating the priority-ordered | "SVCB resolution" is the process of enumerating and ordering the | |||
| endpoints for a service, as performed by the client. SVCB resolution | available endpoints for a service, as performed by the client. SVCB | |||
| is implemented as follows: | resolution is implemented as follows: | |||
| 1. Let $QNAME be the service name plus appropriate prefixes for the | 1. Let $QNAME be the service name plus appropriate prefixes for the | |||
| scheme (see Section 2.3). | scheme (see Section 2.3). | |||
| 2. Issue a SVCB query for $QNAME. | 2. Issue a SVCB query for $QNAME. | |||
| 3. If an AliasMode SVCB record is returned for $QNAME (after | 3. If an AliasMode SVCB record is returned for $QNAME (after | |||
| following CNAMEs as normal), set $QNAME to its TargetName | following CNAMEs as normal), set $QNAME to its TargetName | |||
| (without additional prefixes) and loop back to step 2, subject to | (without additional prefixes) and loop back to Step 2, subject to | |||
| chain length limits and loop detection heuristics (see | chain length limits and loop detection heuristics (see | |||
| Section 3.1). | Section 3.1). | |||
| 4. If one or more "compatible" (Section 8) ServiceMode records are | 4. If one or more "compatible" (Section 8) ServiceMode records are | |||
| returned, these represent the alternative endpoints. | returned, these represent the alternative endpoints. Sort the | |||
| records by ascending SvcPriority. | ||||
| 5. Otherwise, SVCB resolution has failed, and the list of known | 5. Otherwise, SVCB resolution has failed, and the list of available | |||
| endpoints is empty. | endpoints is empty. | |||
| This procedure does not rely on any recursive or authoritative DNS | This procedure does not rely on any recursive or authoritative DNS | |||
| server to comply with this specification or have any awareness of | server to comply with this specification or have any awareness of | |||
| SVCB. | SVCB. | |||
| A client is called "SVCB-optional" if it can connect without the use | A client is called "SVCB-optional" if it can connect without the use | |||
| of ServiceMode records, and "SVCB-reliant" otherwise. Clients for | of ServiceMode records; otherwise, it is called "SVCB-reliant". | |||
| pre-existing protocols (e.g. HTTP) SHALL implement SVCB-optional | Clients for pre-existing protocols (e.g., HTTP) SHALL implement SVCB- | |||
| behavior (except as noted in Section 3.1 or when modified by future | optional behavior (except as noted in Section 3.1 or when modified by | |||
| specifications). | future specifications). | |||
| SVCB-optional clients SHOULD issue in parallel any other DNS queries | SVCB-optional clients SHOULD issue in parallel any other DNS queries | |||
| that might be needed for connection establishment if the SVCB record | that might be needed for connection establishment if the SVCB record | |||
| is absent, in order to minimize delay in that case and enable the | is absent, in order to minimize delay in that case and enable the | |||
| optimizations discussed in Section 5. | optimizations discussed in Section 5. | |||
| Once SVCB resolution has concluded, whether successful or not, if at | Once SVCB resolution has concluded, whether successful or not, if at | |||
| least one AliasMode record was processed, SVCB-optional clients SHALL | least one AliasMode record was processed, SVCB-optional clients SHALL | |||
| append to the priority list an endpoint consisting of the final value | append to the list of endpoints an endpoint consisting of the final | |||
| of $QNAME, the authority endpoint's port number, and no SvcParams. | value of $QNAME, the authority endpoint's port number, and no | |||
| (This endpoint will be attempted before falling back to non-SVCB | SvcParams. (This endpoint will be attempted before falling back to | |||
| connection modes. This ensures that SVCB-optional clients will make | non-SVCB connection modes. This ensures that SVCB-optional clients | |||
| use of an AliasMode record whose TargetName has A and/or AAAA records | will make use of an AliasMode record whose TargetName has A and/or | |||
| but no SVCB records.) | AAAA records but no SVCB records.) | |||
| The client proceeds with connection establishment using the resolved | The client proceeds with connection establishment using this list of | |||
| list of endpoints. Clients SHOULD try higher-priority alternatives | endpoints. Clients SHOULD try higher-priority alternatives first, | |||
| first, with fallback to lower-priority alternatives. Clients resolve | with fallback to lower-priority alternatives. Clients resolve AAAA | |||
| AAAA and/or A records for the selected TargetName, and MAY choose | and/or A records for the selected TargetName and MAY choose between | |||
| between them using an approach such as Happy Eyeballs | them using an approach such as Happy Eyeballs [HappyEyeballsV2]. | |||
| [HappyEyeballsV2]. | ||||
| If the client is SVCB-optional, and connecting using this list of | If the client is SVCB-optional and connecting using this list of | |||
| endpoints has failed, the client now attempts to use non-SVCB | endpoints has failed, the client now attempts to use non-SVCB | |||
| connection modes. | connection modes. | |||
| Some important optimizations are discussed in Section 5 to avoid | Some important optimizations are discussed in Section 5 to avoid | |||
| additional latency in comparison to ordinary AAAA/A lookups. | additional latency in comparison to ordinary AAAA/A lookups. | |||
| 3.1. Handling resolution failures | 3.1. Handling Resolution Failures | |||
| If DNS responses are cryptographically protected (e.g. using DNSSEC | If DNS responses are cryptographically protected (e.g., using DNSSEC | |||
| or TLS [DoT][DoH]), and SVCB resolution fails due to an | or TLS [DoT] [DoH]) and SVCB resolution fails due to an | |||
| authentication error, SERVFAIL response, transport error, or timeout, | authentication error, SERVFAIL response, transport error, or timeout, | |||
| the client SHOULD abandon its attempt to reach the service, even if | the client SHOULD abandon its attempt to reach the service, even if | |||
| the client is SVCB-optional. Otherwise, an active attacker could | the client is SVCB-optional. Otherwise, an active attacker could | |||
| mount a downgrade attack by denying the user access to the SvcParams. | mount a downgrade attack by denying the user access to the SvcParams. | |||
| A SERVFAIL error can occur if the domain is DNSSEC-signed, the | A SERVFAIL error can occur if the domain is DNSSEC-signed, the | |||
| recursive resolver is DNSSEC-validating, and the attacker is between | recursive resolver is DNSSEC-validating, and the attacker is between | |||
| the recursive resolver and the authoritative DNS server. A transport | the recursive resolver and the authoritative DNS server. A transport | |||
| error or timeout can occur if an active attacker between the client | error or timeout can occur if an active attacker between the client | |||
| and the recursive resolver is selectively dropping SVCB queries or | and the recursive resolver is selectively dropping SVCB queries or | |||
| skipping to change at page 15, line 34 ¶ | skipping to change at line 683 ¶ | |||
| If the client enforces DNSSEC validation on A/AAAA responses, it | If the client enforces DNSSEC validation on A/AAAA responses, it | |||
| SHOULD apply the same validation policy to SVCB. Otherwise, an | SHOULD apply the same validation policy to SVCB. Otherwise, an | |||
| attacker could defeat the A/AAAA protection by forging SVCB responses | attacker could defeat the A/AAAA protection by forging SVCB responses | |||
| that direct the client to other IP addresses. | that direct the client to other IP addresses. | |||
| If DNS responses are not cryptographically protected, clients MAY | If DNS responses are not cryptographically protected, clients MAY | |||
| treat SVCB resolution failure as fatal or nonfatal. | treat SVCB resolution failure as fatal or nonfatal. | |||
| If the client is unable to complete SVCB resolution due to its chain | If the client is unable to complete SVCB resolution due to its chain | |||
| length limit, the client MUST fall back to the authority endpoint, as | length limit, the client MUST fall back to the authority endpoint, as | |||
| if the origin's SVCB record did not exist. | if the service's SVCB record did not exist. | |||
| 3.2. Clients using a Proxy | 3.2. Clients Using a Proxy | |||
| Clients using a domain-oriented transport proxy like HTTP CONNECT | Clients using a domain-oriented transport proxy like HTTP CONNECT | |||
| ([RFC7231], Section 4.3.6) or SOCKS5 ([RFC1928]) have the option to | ([RFC7231], Section 4.3.6) or SOCKS5 [RFC1928] have the option of | |||
| use named destinations, in which case the client does not perform any | using named destinations, in which case the client does not perform | |||
| A or AAAA queries for destination domains. If the client is | any A or AAAA queries for destination domains. If the client is | |||
| configured to use named destinations with a proxy that does not | configured to use named destinations with a proxy that does not | |||
| provide SVCB query capability (e.g. through an affiliated DNS | provide SVCB query capability (e.g., through an affiliated DNS | |||
| resolver), the client would have to perform SVCB resolution | resolver), the client would have to perform SVCB resolution | |||
| separately, likely disclosing the destinations to additional parties | separately, likely disclosing the destinations to additional parties | |||
| than just the proxy. Clients in this configuration SHOULD arrange | and not just the proxy. Clients in this configuration SHOULD arrange | |||
| for a separate SVCB resolution procedure with appropriate privacy | for a separate SVCB resolution procedure with appropriate privacy | |||
| properties. If this is not possible, SVCB-optional clients MUST | properties. If this is not possible, SVCB-optional clients MUST | |||
| disable SVCB resolution entirely, and SVCB-reliant clients MUST treat | disable SVCB resolution entirely, and SVCB-reliant clients MUST treat | |||
| the configuration as invalid. | the configuration as invalid. | |||
| If the client does use SVCB and named destinations, the client SHOULD | If the client does use SVCB and named destinations, the client SHOULD | |||
| follow the standard SVCB resolution process, selecting the smallest- | follow the standard SVCB resolution process, selecting the smallest- | |||
| SvcPriority option that is compatible with the client and the proxy. | SvcPriority option that is compatible with the client and the proxy. | |||
| When connecting using a SVCB record, clients MUST provide the final | When connecting using a SVCB record, clients MUST provide the final | |||
| TargetName and port to the proxy, which will perform any required A | TargetName and port to the proxy, which will perform any required A | |||
| and AAAA lookups. | and AAAA lookups. | |||
| This arrangement has several benefits: | This arrangement has several benefits: | |||
| * Compared to disabling SVCB: | * Compared to disabling SVCB: | |||
| - It allows the client to use the SvcParams, if present, which | - It allows the client to use the SvcParams, if present, which | |||
| are only usable with a specific TargetName. The SvcParams may | are only usable with a specific TargetName. The SvcParams may | |||
| include information that enhances performance (e.g. alpn) and | include information that enhances performance (e.g., supported | |||
| privacy. | protocols) and privacy. | |||
| - It allows the service to delegate the apex domain. | - It allows a service on an apex domain to use aliasing. | |||
| * Compared to providing the proxy with an IP address: | * Compared to providing the proxy with an IP address: | |||
| - It allows the proxy to select between IPv4 and IPv6 addresses | - It allows the proxy to select between IPv4 and IPv6 addresses | |||
| for the server according to its configuration. | for the server according to its configuration. | |||
| - It ensures that the proxy receives addresses based on its | - It ensures that the proxy receives addresses based on its | |||
| network geolocation, not the client's. | network geolocation, not the client's. | |||
| - It enables faster fallback for TCP destinations with multiple | - It enables faster fallback for TCP destinations with multiple | |||
| addresses of the same family. | addresses of the same family. | |||
| 4. DNS Server Behavior | 4. DNS Server Behavior | |||
| 4.1. Authoritative servers | 4.1. Authoritative Servers | |||
| When replying to a SVCB query, authoritative DNS servers SHOULD | When replying to a SVCB query, authoritative DNS servers SHOULD | |||
| return A, AAAA, and SVCB records in the Additional Section for any | return A, AAAA, and SVCB records in the Additional section for any | |||
| TargetNames that are in the zone. If the zone is signed, the server | TargetNames that are in the zone. If the zone is signed, the server | |||
| SHOULD also include positive or negative DNSSEC responses for these | SHOULD also include DNSSEC records authenticating the existence or | |||
| records in the Additional section. | nonexistence of these records in the Additional section. | |||
| See Section 4.4 for exceptions. | See Section 4.4 for exceptions. | |||
| 4.2. Recursive resolvers | 4.2. Recursive Resolvers | |||
| Whether the recursive resolver is aware of SVCB or not, the normal | Whether the recursive resolver is aware of SVCB or not, the normal | |||
| response construction process (i.e. unknown RR type resolution under | response construction process used for unknown RR types [RFC3597] | |||
| [RFC3597]) generates the Answer section of the response. Recursive | generates the Answer section of the response. Recursive resolvers | |||
| resolvers that are aware of SVCB SHOULD help the client to execute | that are aware of SVCB SHOULD help the client to execute the | |||
| the procedure in Section 3 with minimum overall latency by | procedure in Section 3 with minimum overall latency by incorporating | |||
| incorporating additional useful information into the Additional | additional useful information into the Additional section of the | |||
| section of the response as follows: | response as follows: | |||
| 1. Incorporate the results of SVCB resolution. If the recursive | 1. Incorporate the results of SVCB resolution. If the recursive | |||
| resolver's local chain length limit (which may be different from | resolver's local chain length limit (which may be different from | |||
| the client's limit) has been reached, terminate. | the client's limit) has been reached, terminate. | |||
| 2. If any of the resolved SVCB records are in AliasMode, choose one | 2. If any of the resolved SVCB records are in AliasMode, choose one | |||
| of them at random, and resolve SVCB, A, and AAAA records for its | of them at random, and resolve SVCB, A, and AAAA records for its | |||
| TargetName. | TargetName. | |||
| * If any SVCB records are resolved, go to step 1. | * If any SVCB records are resolved, go to Step 1. | |||
| * Otherwise, incorporate the results of A and AAAA resolution, | * Otherwise, incorporate the results of A and AAAA resolution, | |||
| and terminate. | and terminate. | |||
| 3. All the resolved SVCB records are in ServiceMode. Resolve A and | 3. All the resolved SVCB records are in ServiceMode. Resolve A and | |||
| AAAA queries for each TargetName (or for the owner name if | AAAA queries for each TargetName (or for the owner name if | |||
| TargetName is "."), incorporate all the results, and terminate. | TargetName is "."), incorporate all the results, and terminate. | |||
| In this procedure, "resolve" means the resolver's ordinary recursive | In this procedure, "resolve" means the resolver's ordinary recursive | |||
| resolution procedure, as if processing a query for that RRSet. This | resolution procedure, as if processing a query for that RRset. This | |||
| includes following any aliases that the resolver would ordinarily | includes following any aliases that the resolver would ordinarily | |||
| follow (e.g. CNAME, DNAME [DNAME]). Errors or anomalies in | follow (e.g., CNAME, DNAME [DNAME]). Errors or anomalies in | |||
| obtaining additional records MAY cause this process to terminate, but | obtaining additional records MAY cause this process to terminate but | |||
| MUST NOT themselves cause the resolver to send a failure response. | MUST NOT themselves cause the resolver to send a failure response. | |||
| See Section 2.4.2 for additional safeguards for recursive resolvers | See Section 2.4.2 for additional safeguards for recursive resolvers | |||
| to implement to mitigate loops. | to implement to mitigate loops. | |||
| See Section 5.2 for possible optimizations of this procedure. | See Section 5.2 for possible optimizations of this procedure. | |||
| 4.2.1. DNS64 | 4.2.1. DNS64 | |||
| DNS64 resolvers synthesize responses to AAAA queries for names that | DNS64 resolvers synthesize responses to AAAA queries for names that | |||
| only have an A record (Section 5.1.7 of [RFC6147]). SVCB-aware DNS64 | only have an A record (Section 5.1.7 of [RFC6147]). SVCB-aware DNS64 | |||
| resolvers SHOULD apply the same synthesis logic when resolving AAAA | resolvers SHOULD apply the same synthesis logic when resolving AAAA | |||
| records for the TargetName for inclusion as Additionals (Step 2 in | records for the TargetName for inclusion in the Additional section | |||
| Section 4.2), and MAY omit the Additional A records. | (Step 2 in Section 4.2) and MAY omit the A records from this section. | |||
| DNS64 resolvers MUST NOT extrapolate the AAAA synthesis logic to the | DNS64 resolvers MUST NOT extrapolate the AAAA synthesis logic to the | |||
| IP hints in the SvcParams (Section 7.3). Modifying the IP hints | IP hints in the SvcParams (Section 7.3). Modifying the IP hints | |||
| would break DNSSEC validation for the SVCB record and would not | would break DNSSEC validation for the SVCB record and would not | |||
| improve performance when the above recommendation is implemented. | improve performance when the above recommendation is implemented. | |||
| 4.3. General requirements | 4.3. General Requirements | |||
| Recursive resolvers MUST be able to convey SVCB records with | Recursive resolvers MUST be able to convey SVCB records with | |||
| unrecognized SvcParamKeys, and MAY treat the entire SvcParams portion | unrecognized SvcParamKeys. Resolvers MAY accomplish this by treating | |||
| of the record as opaque, even if the contents are invalid. | the entire SvcParams portion of the record as opaque, even if the | |||
| Alternatively, recursive resolvers MAY report an error such as | contents are invalid. If a recognized SvcParamKey is followed by a | |||
| SERVFAIL to avoid returning a SvcParamValue that is invalid according | value that is invalid according to the SvcParam's specification, a | |||
| to the SvcParam's specification. For complex value types whose | recursive resolver MAY report an error such as SERVFAIL instead of | |||
| interpretation might differ between implementations or have | returning the record. For complex value types whose interpretation | |||
| additional future allowed values added (e.g. URIs or "alpn"), | might differ between implementations or have additional future | |||
| resolvers SHOULD limit validation to specified constraints. | allowed values added (e.g., URIs or "alpn"), resolvers SHOULD limit | |||
| validation to specified constraints. | ||||
| When responding to a query that includes the DNSSEC OK bit | When responding to a query that includes the DNSSEC OK bit [RFC3225], | |||
| ([RFC3225]), DNSSEC-capable recursive and authoritative DNS servers | DNSSEC-capable recursive and authoritative DNS servers MUST accompany | |||
| MUST accompany each RRSet in the Additional section with the same | each RRset in the Additional section with the same DNSSEC-related | |||
| DNSSEC-related records that they would send when providing that RRSet | records that they would send when providing that RRset as an Answer | |||
| as an Answer (e.g. RRSIG, NSEC, NSEC3). | (e.g., RRSIG, NSEC, NSEC3). | |||
| According to Section 5.4.1 of [RFC2181], "Unauthenticated RRs | According to Section 5.4.1 of [RFC2181], "Unauthenticated RRs | |||
| received and cached from ... the additional data section ... should | received and cached from ... the additional data section ... should | |||
| not be cached in such a way that they would ever be returned as | not be cached in such a way that they would ever be returned as | |||
| answers to a received query. They may be returned as additional | answers to a received query. They may be returned as additional | |||
| information where appropriate.". Recursive resolvers therefore MAY | information where appropriate." Recursive resolvers therefore MAY | |||
| cache records from the Additional section for use in populating | cache records from the Additional section for use in populating | |||
| Additional section responses, and MAY cache them for general use if | Additional section responses and MAY cache them for general use if | |||
| they are authenticated by DNSSEC. | they are authenticated by DNSSEC. | |||
| 4.4. EDNS Client Subnet (ECS) | 4.4. EDNS Client Subnet (ECS) | |||
| The EDNS Client Subnet option (ECS, [RFC7871]) allows recursive | The EDNS Client Subnet (ECS) option [RFC7871] allows recursive | |||
| resolvers to request IP addresses that are suitable for a particular | resolvers to request IP addresses that are suitable for a particular | |||
| client IP range. SVCB records may contain IP addresses (in ipv*hint | client IP range. SVCB records may contain IP addresses (in ipv*hint | |||
| SvcParams), or direct users to a subnet-specific TargetName, so | SvcParams) or direct users to a subnet-specific TargetName, so | |||
| recursive resolvers SHOULD include the same ECS option in SVCB | recursive resolvers SHOULD include the same ECS option in SVCB | |||
| queries as in A/AAAA queries. | queries as in A/AAAA queries. | |||
| According to Section 7.3.1 of [RFC7871], "Any records from [the | According to Section 7.3.1 of [RFC7871], "Any records from [the | |||
| Additional section] MUST NOT be tied to a network". Accordingly, | Additional section] MUST NOT be tied to a network." Accordingly, | |||
| when processing a response whose QTYPE is SVCB-compatible, resolvers | when processing a response whose QTYPE is SVCB-compatible, resolvers | |||
| SHOULD treat any records in the Additional section as having SOURCE | SHOULD treat any records in the Additional section as having SOURCE | |||
| PREFIX-LENGTH zero and SCOPE PREFIX-LENGTH as specified in the ECS | PREFIX-LENGTH set to zero and SCOPE PREFIX-LENGTH as specified in the | |||
| option. Authoritative servers MUST omit such records if they are not | ECS option. Authoritative servers MUST omit such records if they are | |||
| suitable for use by any stub resolvers that set SOURCE PREFIX-LENGTH | not suitable for use by any stub resolvers that set SOURCE PREFIX- | |||
| to zero. This will cause the resolver to perform a follow-up query | LENGTH to zero. This will cause the resolver to perform a follow-up | |||
| that can receive properly tailored ECS. (This is similar to the | query that can receive a properly tailored ECS. (This is similar to | |||
| usage of CNAME with ECS discussed in [RFC7871], Section 7.2.1.) | the usage of CNAME with the ECS option as discussed in [RFC7871], | |||
| Section 7.2.1.) | ||||
| Authoritative servers that omit Additional records can avoid the | Authoritative servers that omit Additional records can avoid the | |||
| added latency of a follow-up query by following the advice in | added latency of a follow-up query by following the advice in | |||
| Section 10.2. | Section 10.2. | |||
| 5. Performance optimizations | 5. Performance Optimizations | |||
| For optimal performance (i.e. minimum connection setup time), clients | For optimal performance (i.e., minimum connection setup time), | |||
| SHOULD implement a client-side DNS cache. Responses in the | clients SHOULD implement a client-side DNS cache. Responses in the | |||
| Additional section of a SVCB response SHOULD be placed in cache | Additional section of a SVCB response SHOULD be placed in cache | |||
| before performing any follow-up queries. With this behavior, and | before performing any follow-up queries. With this behavior, and | |||
| conforming DNS servers, using SVCB does not add network latency to | with conforming DNS servers, using SVCB does not add network latency | |||
| connection setup. | to connection setup. | |||
| To improve performance when using a non-conforming recursive | To improve performance when using a non-conforming recursive | |||
| resolver, clients SHOULD issue speculative A and/or AAAA queries in | resolver, clients SHOULD issue speculative A and/or AAAA queries in | |||
| parallel with each SVCB query, based on a predicted value of | parallel with each SVCB query, based on a predicted value of | |||
| TargetName (see Section 10.2). | TargetName (see Section 10.2). | |||
| After a ServiceMode RRSet is received, clients MAY try more than one | After a ServiceMode RRset is received, clients MAY try more than one | |||
| option in parallel, and MAY prefetch A and AAAA records for multiple | option in parallel and MAY prefetch A and AAAA records for multiple | |||
| TargetNames. | TargetNames. | |||
| 5.1. Optimistic pre-connection and connection reuse | 5.1. Optimistic Pre-connection and Connection Reuse | |||
| If an address response arrives before the corresponding SVCB | If an address response arrives before the corresponding SVCB | |||
| response, the client MAY initiate a connection as if the SVCB query | response, the client MAY initiate a connection as if the SVCB query | |||
| returned NODATA, but MUST NOT transmit any information that could be | returned NODATA but MUST NOT transmit any information that could be | |||
| altered by the SVCB response until it arrives. For example, future | altered by the SVCB response until it arrives. For example, future | |||
| SvcParamKeys could be defined that alter the TLS ClientHello. | SvcParamKeys could be defined that alter the TLS ClientHello. | |||
| Clients implementing this optimization SHOULD wait for 50 | Clients implementing this optimization SHOULD wait for 50 | |||
| milliseconds before starting optimistic pre-connection, as per the | milliseconds before starting optimistic pre-connection, as per the | |||
| guidance in [HappyEyeballsV2]. | guidance in [HappyEyeballsV2]. | |||
| A SVCB record is consistent with a connection if the client would | A SVCB record is consistent with a connection if the client would | |||
| attempt an equivalent connection when making use of that record. If | attempt an equivalent connection when making use of that record. If | |||
| a SVCB record is consistent with an active or in-progress connection | a SVCB record is consistent with an active or in-progress connection | |||
| C, the client MAY prefer that record and use C as its connection. | C, the client MAY prefer that record and use C as its connection. | |||
| For example, suppose the client receives this SVCB RRSet for a | For example, suppose the client receives this SVCB RRset for a | |||
| protocol that uses TLS over TCP: | protocol that uses TLS over TCP: | |||
| _1234._bar.example.com. 300 IN SVCB 1 svc1.example.net. ( | _1234._bar.example.com. 300 IN SVCB 1 svc1.example.net. ( | |||
| ipv6hint=2001:db8::1 port=1234 ) | ipv6hint=2001:db8::1 port=1234 ) | |||
| SVCB 2 svc2.example.net. ( | SVCB 2 svc2.example.net. ( | |||
| ipv6hint=2001:db8::2 port=1234 ) | ipv6hint=2001:db8::2 port=1234 ) | |||
| If the client has an in-progress TCP connection to | If the client has an in-progress TCP connection to | |||
| [2001:db8::2]:1234, it MAY proceed with TLS on that connection, even | [2001:db8::2]:1234, it MAY proceed with TLS on that connection, even | |||
| though the other record in the RRSet has higher priority. | though the other record in the RRset has higher priority. | |||
| If none of the SVCB records are consistent with any active or in- | If none of the SVCB records are consistent with any active or in- | |||
| progress connection, clients proceed with connection establishment as | progress connection, clients proceed with connection establishment as | |||
| described in Section 3. | described in Section 3. | |||
| 5.2. Generating and using incomplete responses | 5.2. Generating and Using Incomplete Responses | |||
| When following the procedure in Section 4.2, recursive resolvers MAY | When following the procedure in Section 4.2, recursive resolvers MAY | |||
| terminate the procedure early and produce a reply that omits some of | terminate the procedure early and produce a reply that omits some of | |||
| the associated RRSets. This is REQUIRED when the chain length limit | the associated RRsets. This is REQUIRED when the chain length limit | |||
| is reached (Section 4.2 step 1), but might also be appropriate when | is reached (Step 1 in Section 4.2) but might also be appropriate when | |||
| the maximum response size is reached, or when responding before fully | the maximum response size is reached or when responding before fully | |||
| chasing dependencies would improve performance. When omitting | chasing dependencies would improve performance. When omitting | |||
| certain RRSets, recursive resolvers SHOULD prioritize information for | certain RRsets, recursive resolvers SHOULD prioritize information for | |||
| smaller-SvcPriority records. | smaller-SvcPriority records. | |||
| As discussed in Section 3, clients MUST be able to fetch additional | As discussed in Section 3, clients MUST be able to fetch additional | |||
| information that is required to use a SVCB record, if it is not | information that is required to use a SVCB record, if it is not | |||
| included in the initial response. As a performance optimization, if | included in the initial response. As a performance optimization, if | |||
| some of the SVCB records in the response can be used without | some of the SVCB records in the response can be used without | |||
| requiring additional DNS queries, the client MAY prefer those | requiring additional DNS queries, the client MAY prefer those | |||
| records, regardless of their priorities. | records, regardless of their priorities. | |||
| 6. SVCB-compatible | 6. SVCB-Compatible RR Types | |||
| An RR type is called "SVCB-compatible" if it permits an | An RR type is called "SVCB-compatible" if it permits an | |||
| implementation that is identical to SVCB in its: | implementation that is identical to SVCB in its: | |||
| * RDATA presentation format | * RDATA presentation format | |||
| * RDATA wire format | * RDATA wire format | |||
| * IANA registry used for SvcParamKeys | * IANA registry used for SvcParamKeys | |||
| * Authoritative server Additional Section processing | * Authoritative server Additional section processing | |||
| * Recursive resolution process | * Recursive resolution process | |||
| * Relevant Class (i.e. Internet ("IN") [RFC1035]) | * Relevant Class (i.e., Internet ("IN") [RFC1035]) | |||
| This allows authoritative and recursive DNS servers to apply | This allows authoritative and recursive DNS servers to apply | |||
| identical processing to all SVCB-compatible RR types. | identical processing to all SVCB-compatible RR types. | |||
| All other behaviors described as applying to the SVCB RR also apply | All other behaviors described as applying to the SVCB RR also apply | |||
| to all SVCB-compatible RR types unless explicitly stated otherwise. | to all SVCB-compatible RR types unless explicitly stated otherwise. | |||
| When following an AliasMode record (Section 2.4.2) of RR type $T , | When following an AliasMode record (Section 2.4.2) of RR type $T, the | |||
| the followup query to the TargetName MUST also be for type $T. | follow-up query to the TargetName MUST also be for type $T. | |||
| This document defines one SVCB-compatible RR type (other than SVCB | This document defines one SVCB-compatible RR type (other than SVCB | |||
| itself): the HTTPS RR type (Section 9), which avoids Attrleaf label | itself): the HTTPS RR type (Section 9), which avoids Attrleaf label | |||
| prefixes [Attrleaf] in order to improve compatibility with wildcards | prefixes [Attrleaf] in order to improve compatibility with wildcards | |||
| and CNAMEs, which are widely used with HTTP. | and CNAMEs, which are widely used with HTTP. | |||
| Standards authors should consider carefully whether to use SVCB or | Standards authors should consider carefully whether to use SVCB or | |||
| define a new SVCB-compatible RR type, as this choice cannot easily be | define a new SVCB-compatible RR type, as this choice cannot easily be | |||
| reversed after deployment. | reversed after deployment. | |||
| skipping to change at page 21, line 35 ¶ | skipping to change at line 963 ¶ | |||
| applicable to other schemes as well. | applicable to other schemes as well. | |||
| Each new protocol mapping document MUST specify which keys are | Each new protocol mapping document MUST specify which keys are | |||
| applicable and safe to use. Protocol mappings MAY alter the | applicable and safe to use. Protocol mappings MAY alter the | |||
| interpretation of SvcParamKeys but MUST NOT alter their presentation | interpretation of SvcParamKeys but MUST NOT alter their presentation | |||
| or wire formats. | or wire formats. | |||
| 7.1. "alpn" and "no-default-alpn" | 7.1. "alpn" and "no-default-alpn" | |||
| The "alpn" and "no-default-alpn" SvcParamKeys together indicate the | The "alpn" and "no-default-alpn" SvcParamKeys together indicate the | |||
| set of Application Layer Protocol Negotiation (ALPN) protocol | set of Application-Layer Protocol Negotiation (ALPN) protocol | |||
| identifiers [ALPN] and associated transport protocols supported by | identifiers [ALPN] and associated transport protocols supported by | |||
| this service endpoint (the "SVCB ALPN set"). | this service endpoint (the "SVCB ALPN set"). | |||
| As with Alt-Svc [AltSvc], each ALPN protocol identifier is used to | As with Alt-Svc [AltSvc], each ALPN protocol identifier is used to | |||
| identify the application protocol and associated suite of protocols | identify the application protocol and associated suite of protocols | |||
| supported by the endpoint (the "protocol suite"). The presence of an | supported by the endpoint (the "protocol suite"). The presence of an | |||
| ALPN protocol identifier in the SVCB ALPN set indicates that this | ALPN protocol identifier in the SVCB ALPN set indicates that this | |||
| service endpoint, described by TargetName and the other parameters | service endpoint, described by TargetName and the other parameters | |||
| (e.g. "port") offers service with the protocol suite associated with | (e.g., "port"), offers service with the protocol suite associated | |||
| this ALPN identifier. | with this ALPN identifier. | |||
| Clients filter the set of ALPN identifiers to match the protocol | Clients filter the set of ALPN identifiers to match the protocol | |||
| suites they support, and this informs the underlying transport | suites they support, and this informs the underlying transport | |||
| protocol used (such as QUIC-over-UDP or TLS-over-TCP). ALPN protocol | protocol used (such as QUIC over UDP or TLS over TCP). ALPN protocol | |||
| identifiers that do not uniquely identify a protocol suite (e.g. an | identifiers that do not uniquely identify a protocol suite (e.g., an | |||
| Identification Sequence that can be used with both TLS and DTLS) are | Identification Sequence that can be used with both TLS and DTLS) are | |||
| not compatible with this SvcParamKey and MUST NOT be included in the | not compatible with this SvcParamKey and MUST NOT be included in the | |||
| SVCB ALPN set. | SVCB ALPN set. | |||
| 7.1.1. Representation | 7.1.1. Representation | |||
| ALPNs are identified by their registered "Identification Sequence" | ALPNs are identified by their registered "Identification Sequence" | |||
| (alpn-id), which is a sequence of 1-255 octets. | (alpn-id), which is a sequence of 1-255 octets. | |||
| alpn-id = 1*255OCTET | alpn-id = 1*255OCTET | |||
| For "alpn", the presentation value SHALL be a comma-separated list | For "alpn", the presentation value SHALL be a comma-separated list | |||
| (Appendix A.1) of one or more alpn-ids. Zone file implementations | (Appendix A.1) of one or more alpn-ids. Zone-file implementations | |||
| MAY disallow the "," and "\" characters instead of implementing the | MAY disallow the "," and "\" characters in ALPN IDs instead of | |||
| value-list escaping procedure, relying on the opaque key format (e.g. | implementing the value-list escaping procedure, relying on the opaque | |||
| key1=\002h2) in the event that these characters are needed. | key format (e.g., key1=\002h2) in the event that these characters are | |||
| needed. | ||||
| The wire format value for "alpn" consists of at least one alpn-id | The wire-format value for "alpn" consists of at least one alpn-id | |||
| prefixed by its length as a single octet, and these length-value | prefixed by its length as a single octet, and these length-value | |||
| pairs are concatenated to form the SvcParamValue. These pairs MUST | pairs are concatenated to form the SvcParamValue. These pairs MUST | |||
| exactly fill the SvcParamValue; otherwise, the SvcParamValue is | exactly fill the SvcParamValue; otherwise, the SvcParamValue is | |||
| malformed. | malformed. | |||
| For "no-default-alpn", the presentation and wire format values MUST | For "no-default-alpn", the presentation and wire-format values MUST | |||
| be empty. When "no-default-alpn" is specified in an RR, "alpn" must | be empty. When "no-default-alpn" is specified in an RR, "alpn" must | |||
| also be specified in order for the RR to be "self-consistent" | also be specified in order for the RR to be "self-consistent" | |||
| (Section 2.4.3). | (Section 2.4.3). | |||
| Each scheme that uses this SvcParamKey defines a "default set" of | Each scheme that uses this SvcParamKey defines a "default set" of | |||
| ALPNs that are supported by nearly all clients and servers, which MAY | ALPN IDs that are supported by nearly all clients and servers; this | |||
| be empty. To determine the SVCB ALPN set, the client starts with the | set MAY be empty. To determine the SVCB ALPN set, the client starts | |||
| list of alpn-ids from the "alpn" SvcParamKey, and adds the default | with the list of alpn-ids from the "alpn" SvcParamKey, and it adds | |||
| set unless the "no-default-alpn" SvcParamKey is present. | the default set unless the "no-default-alpn" SvcParamKey is present. | |||
| 7.1.2. Use | 7.1.2. Use | |||
| To establish a connection to the endpoint, clients MUST | To establish a connection to the endpoint, clients MUST | |||
| 1. Let SVCB-ALPN-Intersection be the set of protocols in the SVCB | 1. Let SVCB-ALPN-Intersection be the set of protocols in the SVCB | |||
| ALPN set that the client supports. | ALPN set that the client supports. | |||
| 2. Let Intersection-Transports be the set of transports (e.g. TLS, | 2. Let Intersection-Transports be the set of transports (e.g., TLS, | |||
| DTLS, QUIC) implied by the protocols in SVCB-ALPN-Intersection. | DTLS, QUIC) implied by the protocols in SVCB-ALPN-Intersection. | |||
| 3. For each transport in Intersection-Transports, construct a | 3. For each transport in Intersection-Transports, construct a | |||
| ProtocolNameList containing the Identification Sequences of all | ProtocolNameList containing the Identification Sequences of all | |||
| the client's supported ALPN protocols for that transport, without | the client's supported ALPN protocols for that transport, without | |||
| regard to the SVCB ALPN set. | regard to the SVCB ALPN set. | |||
| For example, if the SVCB ALPN set is ["http/1.1", "h3"], and the | For example, if the SVCB ALPN set is ["http/1.1", "h3"] and the | |||
| client supports HTTP/1.1, HTTP/2, and HTTP/3, the client could | client supports HTTP/1.1, HTTP/2, and HTTP/3, the client could | |||
| attempt to connect using TLS over TCP with a ProtocolNameList of | attempt to connect using TLS over TCP with a ProtocolNameList of | |||
| ["http/1.1", "h2"], and could also attempt a connection using QUIC, | ["http/1.1", "h2"] and could also attempt a connection using QUIC | |||
| with a ProtocolNameList of ["h3"]. | with a ProtocolNameList of ["h3"]. | |||
| Once the client has constructed a ClientHello, protocol negotiation | Once the client has constructed a ClientHello, protocol negotiation | |||
| in that handshake proceeds as specified in [ALPN], without regard to | in that handshake proceeds as specified in [ALPN], without regard to | |||
| the SVCB ALPN set. | the SVCB ALPN set. | |||
| Clients MAY implement a fallback procedure, using a less-preferred | Clients MAY implement a fallback procedure, using a less-preferred | |||
| transport if more-preferred transports fail to connect. This | transport if more-preferred transports fail to connect. This | |||
| fallback behavior is vulnerable to manipulation by a network attacker | fallback behavior is vulnerable to manipulation by a network attacker | |||
| who blocks the more-preferred transports, but it may be necessary for | who blocks the more-preferred transports, but it may be necessary for | |||
| compatibility with existing networks. | compatibility with existing networks. | |||
| With this procedure in place, an attacker who can modify DNS and | With this procedure in place, an attacker who can modify DNS and | |||
| network traffic can prevent a successful transport connection, but | network traffic can prevent a successful transport connection but | |||
| cannot otherwise interfere with ALPN protocol selection. This | cannot otherwise interfere with ALPN protocol selection. This | |||
| procedure also ensures that each ProtocolNameList includes at least | procedure also ensures that each ProtocolNameList includes at least | |||
| one protocol from the SVCB ALPN set. | one protocol from the SVCB ALPN set. | |||
| Clients SHOULD NOT attempt connection to a service endpoint whose | Clients SHOULD NOT attempt connection to a service endpoint whose | |||
| SVCB ALPN set does not contain any supported protocols. | SVCB ALPN set does not contain any supported protocols. | |||
| To ensure consistency of behavior, clients MAY reject the entire SVCB | To ensure consistency of behavior, clients MAY reject the entire SVCB | |||
| RRSet and fall back to basic connection establishment if all of the | RRset and fall back to basic connection establishment if all of the | |||
| compatible RRs indicate "no-default-alpn", even if connection could | compatible RRs indicate "no-default-alpn", even if connection could | |||
| have succeeded using a non-default alpn. | have succeeded using a non-default ALPN protocol. | |||
| Zone operators SHOULD ensure that at least one RR in each RRSet | Zone operators SHOULD ensure that at least one RR in each RRset | |||
| supports the default transports. This enables compatibility with the | supports the default transports. This enables compatibility with the | |||
| greatest number of clients. | greatest number of clients. | |||
| 7.2. "port" | 7.2. "port" | |||
| The "port" SvcParamKey defines the TCP or UDP port that should be | The "port" SvcParamKey defines the TCP or UDP port that should be | |||
| used to reach this alternative endpoint. If this key is not present, | used to reach this alternative endpoint. If this key is not present, | |||
| clients SHALL use the authority endpoint's port number. | clients SHALL use the authority endpoint's port number. | |||
| The presentation value of the SvcParamValue is a single decimal | The presentation value of the SvcParamValue is a single decimal | |||
| integer between 0 and 65535 in ASCII. Any other value (e.g. an empty | integer between 0 and 65535 in ASCII. Any other value (e.g., an | |||
| value) is a syntax error. To enable simpler parsing, this SvcParam | empty value) is a syntax error. To enable simpler parsing, this | |||
| MUST NOT contain escape sequences. | SvcParamValue MUST NOT contain escape sequences. | |||
| The wire format of the SvcParamValue is the corresponding 2 octet | The wire format of the SvcParamValue is the corresponding 2-octet | |||
| numeric value in network byte order. | numeric value in network byte order. | |||
| If a port-restricting firewall is in place between some client and | If a port-restricting firewall is in place between some client and | |||
| the service endpoint, changing the port number might cause that | the service endpoint, changing the port number might cause that | |||
| client to lose access to the service, so operators should exercise | client to lose access to the service, so operators should exercise | |||
| caution when using this SvcParamKey to specify a non-default port. | caution when using this SvcParamKey to specify a non-default port. | |||
| 7.3. "ipv4hint" and "ipv6hint" | 7.3. "ipv4hint" and "ipv6hint" | |||
| The "ipv4hint" and "ipv6hint" keys convey IP addresses that clients | The "ipv4hint" and "ipv6hint" keys convey IP addresses that clients | |||
| MAY use to reach the service. If A and AAAA records for TargetName | MAY use to reach the service. If A and AAAA records for TargetName | |||
| are locally available, the client SHOULD ignore these hints. | are locally available, the client SHOULD ignore these hints. | |||
| Otherwise, clients SHOULD perform A and/or AAAA queries for | Otherwise, clients SHOULD perform A and/or AAAA queries for | |||
| TargetName as in Section 3, and clients SHOULD use the IP address in | TargetName per Section 3, and clients SHOULD use the IP address in | |||
| those responses for future connections. Clients MAY opt to terminate | those responses for future connections. Clients MAY opt to terminate | |||
| any connections using the addresses in hints and instead switch to | any connections using the addresses in hints and instead switch to | |||
| the addresses in response to the TargetName query. Failure to use A | the addresses in response to the TargetName query. Failure to use A | |||
| and/or AAAA response addresses could negatively impact load balancing | and/or AAAA response addresses could negatively impact load balancing | |||
| or other geo-aware features and thereby degrade client performance. | or other geo-aware features and thereby degrade client performance. | |||
| The presentation value SHALL be a comma-separated list (Appendix A.1) | The presentation value SHALL be a comma-separated list (Appendix A.1) | |||
| of one or more IP addresses of the appropriate family in standard | of one or more IP addresses of the appropriate family in standard | |||
| textual format [RFC5952][RFC4001]. To enable simpler parsing, this | textual format [RFC5952] [RFC4001]. To enable simpler parsing, this | |||
| SvcParamValue MUST NOT contain escape sequences. | SvcParamValue MUST NOT contain escape sequences. | |||
| The wire format for each parameter is a sequence of IP addresses in | The wire format for each parameter is a sequence of IP addresses in | |||
| network byte order (for the respective address-family). Like an A or | network byte order (for the respective address family). Like an A or | |||
| AAAA RRSet, the list of addresses represents an unordered collection, | AAAA RRset, the list of addresses represents an unordered collection, | |||
| and clients SHOULD pick addresses to use in a random order. An empty | and clients SHOULD pick addresses to use in a random order. An empty | |||
| list of addresses is invalid. | list of addresses is invalid. | |||
| When selecting between IPv4 and IPv6 addresses to use, clients may | When selecting between IPv4 and IPv6 addresses to use, clients may | |||
| use an approach such as Happy Eyeballs [HappyEyeballsV2]. When only | use an approach such as Happy Eyeballs [HappyEyeballsV2]. When only | |||
| "ipv4hint" is present, NAT64 clients may synthesize IPv6 addresses as | "ipv4hint" is present, NAT64 clients may synthesize IPv6 addresses as | |||
| specified in [RFC7050] or ignore the "ipv4hint" key and wait for AAAA | specified in [RFC7050] or ignore the "ipv4hint" key and wait for AAAA | |||
| resolution (Section 3). For best performance, server operators | resolution (Section 3). For best performance, server operators | |||
| SHOULD include an "ipv6hint" parameter whenever they include an | SHOULD include an "ipv6hint" parameter whenever they include an | |||
| "ipv4hint" parameter. | "ipv4hint" parameter. | |||
| These parameters are intended to minimize additional connection | These parameters are intended to minimize additional connection | |||
| latency when a recursive resolver is not compliant with the | latency when a recursive resolver is not compliant with the | |||
| requirements in Section 4, and SHOULD NOT be included if most clients | requirements in Section 4 and SHOULD NOT be included if most clients | |||
| are using compliant recursive resolvers. When TargetName is the | are using compliant recursive resolvers. When TargetName is the | |||
| origin hostname or the owner name (which can be written as "."), | service name or the owner name (which can be written as "."), server | |||
| server operators SHOULD NOT include these hints, because they are | operators SHOULD NOT include these hints, because they are unlikely | |||
| unlikely to convey any performance benefit. | to convey any performance benefit. | |||
| 7.4. "mandatory" | 7.4. "mandatory" | |||
| See Section 8. | See Section 8. | |||
| 8. ServiceMode RR compatibility and mandatory keys | 8. ServiceMode RR Compatibility and Mandatory Keys | |||
| In a ServiceMode RR, a SvcParamKey is considered "mandatory" if the | In a ServiceMode RR, a SvcParamKey is considered "mandatory" if the | |||
| RR will not function correctly for clients that ignore this | RR will not function correctly for clients that ignore this | |||
| SvcParamKey. Each SVCB protocol mapping SHOULD specify a set of keys | SvcParamKey. Each SVCB protocol mapping SHOULD specify a set of keys | |||
| that are "automatically mandatory", i.e. mandatory if they are | that are "automatically mandatory", i.e., mandatory if they are | |||
| present in an RR. The SvcParamKey "mandatory" is used to indicate | present in an RR. The SvcParamKey "mandatory" is used to indicate | |||
| any mandatory keys for this RR, in addition to any automatically | any mandatory keys for this RR, in addition to any automatically | |||
| mandatory keys that are present. | mandatory keys that are present. | |||
| A ServiceMode RR is considered "compatible" by a client if the client | A ServiceMode RR is considered "compatible" by a client if the client | |||
| recognizes all the mandatory keys, and their values indicate that | recognizes all the mandatory keys and their values indicate that | |||
| successful connection establishment is possible. If the SVCB RRSet | successful connection establishment is possible. Incompatible RRs | |||
| contains no compatible RRs, the client will generally act as if the | are ignored (see step 5 of the procedure defined in Section 3). | |||
| RRSet is empty. | ||||
| The presentation value SHALL be a comma-separated list (Appendix A.1) | The presentation value SHALL be a comma-separated list (Appendix A.1) | |||
| of one or more valid SvcParamKeys, either by their registered name or | of one or more valid SvcParamKeys, either by their registered name or | |||
| in the unknown-key format (Section 2.1). Keys MAY appear in any | in the unknown-key format (Section 2.1). Keys MAY appear in any | |||
| order, but MUST NOT appear more than once. For self-consistency | order but MUST NOT appear more than once. For self-consistency | |||
| (Section 2.4.3), listed keys MUST also appear in the SvcParams. | (Section 2.4.3), listed keys MUST also appear in the SvcParams. | |||
| To enable simpler parsing, this SvcParamValue MUST NOT contain escape | To enable simpler parsing, this SvcParamValue MUST NOT contain escape | |||
| sequences. | sequences. | |||
| For example, the following is a valid list of SvcParams: | For example, the following is a valid list of SvcParams: | |||
| ipv6hint=... key65333=ex1 key65444=ex2 mandatory=key65444,ipv6hint | ipv6hint=... key65333=ex1 key65444=ex2 mandatory=key65444,ipv6hint | |||
| In wire format, the keys are represented by their numeric values in | In wire format, the keys are represented by their numeric values in | |||
| network byte order, concatenated in strictly increasing numeric | network byte order, concatenated in strictly increasing numeric | |||
| order. | order. | |||
| This SvcParamKey is always automatically mandatory, and MUST NOT | This SvcParamKey is always automatically mandatory and MUST NOT | |||
| appear in its own value-list. Other automatically mandatory keys | appear in its own value-list. Other automatically mandatory keys | |||
| SHOULD NOT appear in the list either. (Including them wastes space | SHOULD NOT appear in the list either. (Including them wastes space | |||
| and otherwise has no effect.) | and otherwise has no effect.) | |||
| 9. Using Service Bindings with HTTP | 9. Using Service Bindings with HTTP | |||
| Use of any protocol with SVCB requires a protocol-specific mapping | The use of any protocol with SVCB requires a protocol-specific | |||
| specification. This section specifies the mapping for the "http" and | mapping specification. This section specifies the mapping for the | |||
| "https" URI schemes [HTTP]. | "http" and "https" URI schemes [HTTP]. | |||
| To enable special handling for HTTP use-cases, the HTTPS RR type is | To enable special handling for HTTP use cases, the HTTPS RR type is | |||
| defined as a SVCB-compatible RR type, specific to the "https" and | defined as a SVCB-compatible RR type, specific to the "https" and | |||
| "http" schemes. Clients MUST NOT perform SVCB queries or accept SVCB | "http" schemes. Clients MUST NOT perform SVCB queries or accept SVCB | |||
| responses for "https" or "http" schemes. | responses for "https" or "http" schemes. | |||
| The presentation format of the record is: | The presentation format of the record is: | |||
| Name TTL IN HTTPS SvcPriority TargetName SvcParams | Name TTL IN HTTPS SvcPriority TargetName SvcParams | |||
| All the SvcParamKeys defined in Section 7 are permitted for use in | All the SvcParamKeys defined in Section 7 are permitted for use in | |||
| HTTPS RRs. The default set of ALPN IDs is the single value | HTTPS RRs. The default set of ALPN IDs is the single value | |||
| "http/1.1". The "automatically mandatory" keys (Section 8) are | "http/1.1". The "automatically mandatory" keys (Section 8) are | |||
| "port" and "no-default-alpn". (As described in Section 8, clients | "port" and "no-default-alpn". (As described in Section 8, clients | |||
| must either implement these keys or ignore any RR in which they | must either implement these keys or ignore any RR in which they | |||
| appear.) Clients that restrict the destination port in "https" URIs | appear.) Clients that restrict the destination port in "https" URIs | |||
| (e.g. using the "bad ports" list from [FETCH]) SHOULD apply the same | (e.g., using the "bad ports" list from [FETCH]) SHOULD apply the same | |||
| restriction to the "port" SvcParam. | restriction to the "port" SvcParam. | |||
| The presence of an HTTPS RR for an origin also indicates that clients | The presence of an HTTPS RR for an origin also indicates that clients | |||
| should connect securely and use the "https" scheme, as discussed in | should connect securely and use the "https" scheme, as discussed in | |||
| Section 9.5. This allows HTTPS RRs to apply to pre-existing "http" | Section 9.5. This allows HTTPS RRs to apply to pre-existing "http" | |||
| scheme URLs, while ensuring that the client uses a secure and | scheme URLs, while ensuring that the client uses a secure and | |||
| authenticated connection. | authenticated connection. | |||
| The HTTPS RR parallels the concepts introduced in the HTTP | The HTTPS RR parallels the concepts introduced in "HTTP Alternative | |||
| Alternative Services proposed standard [AltSvc]. Clients and servers | Services" [AltSvc]. Clients and servers that implement HTTPS RRs are | |||
| that implement HTTPS RRs are not required to implement Alt-Svc. | not required to implement Alt-Svc. | |||
| 9.1. Query names for HTTPS RRs | 9.1. Query Names for HTTPS RRs | |||
| The HTTPS RR uses Port Prefix Naming (Section 2.3), with one | The HTTPS RR uses Port Prefix Naming (Section 2.3), with one | |||
| modification: if the scheme is "https" and the port is 443, then the | modification: if the scheme is "https" and the port is 443, then the | |||
| client's original QNAME is equal to the service name (i.e. the | client's original QNAME is equal to the service name (i.e., the | |||
| origin's hostname), without any prefix labels. | origin's hostname), without any prefix labels. | |||
| By removing the Attrleaf labels [Attrleaf] used in SVCB, this | By removing the Attrleaf labels [Attrleaf] used in SVCB, this | |||
| construction enables offline DNSSEC signing of wildcard domains, | construction enables offline DNSSEC signing of wildcard domains, | |||
| which are commonly used with HTTP. Using the service name as the | which are commonly used with HTTP. Using the service name as the | |||
| owner name of the HTTPS record, without prefixes, also allows the | owner name of the HTTPS record, without prefixes, also allows the | |||
| targets of existing CNAME chains (e.g. CDN hosts) to start returning | targets of existing CNAME chains (e.g., CDN hosts) to start returning | |||
| HTTPS RR responses without requiring origin domains to configure and | HTTPS RR responses without requiring origin domains to configure and | |||
| maintain an additional delegation. | maintain an additional delegation. | |||
| Following of HTTPS AliasMode RRs and CNAME aliases is unchanged from | The procedure for following HTTPS AliasMode RRs and CNAME aliases is | |||
| SVCB. | unchanged from SVCB (as described in Sections 2.4.2 and 3). | |||
| Clients always convert "http" URLs to "https" before performing an | Clients always convert "http" URLs to "https" before performing an | |||
| HTTPS RR query using the process described in Section 9.5, so domain | HTTPS RR query using the process described in Section 9.5, so domain | |||
| owners MUST NOT publish HTTPS RRs with a prefix of "_http". | owners MUST NOT publish HTTPS RRs with a prefix of "_http". | |||
| Note that none of these forms alter the HTTPS origin or authority. | Note that none of these forms alter the HTTPS origin or authority. | |||
| For example, clients MUST continue to validate TLS certificate | For example, clients MUST continue to validate TLS certificate | |||
| hostnames based on the origin. | hostnames based on the origin. | |||
| 9.2. Comparison with Alt-Svc | 9.2. Comparison with Alt-Svc | |||
| Publishing a ServiceMode HTTPS RR in DNS is intended to be similar to | Publishing a ServiceMode HTTPS RR in DNS is intended to be similar to | |||
| transmitting an Alt-Svc field value over HTTP, and receiving an HTTPS | transmitting an Alt-Svc field value over HTTP, and receiving an HTTPS | |||
| RR is intended to be similar to receiving that field value over HTTP. | RR is intended to be similar to receiving that field value over HTTP. | |||
| However, there are some differences in the intended client and server | However, there are some differences in the intended client and server | |||
| behavior. | behavior. | |||
| 9.2.1. ALPN usage | 9.2.1. ALPN Usage | |||
| Unlike Alt-Svc Field Values, HTTPS RRs can contain multiple ALPN IDs. | Unlike Alt-Svc field values, HTTPS RRs can contain multiple ALPN IDs. | |||
| The meaning and use of these IDs is discussed in Section 7.1.2. | The meaning and use of these IDs are discussed in Section 7.1.2. | |||
| 9.2.2. Untrusted channel | 9.2.2. Untrusted Channels | |||
| HTTPS records do not require or provide any assurance of | HTTPS records do not require or provide any assurance of | |||
| authenticity. (DNSSEC signing and verification, which would provide | authenticity. (DNSSEC signing and verification, which would provide | |||
| such assurance, are OPTIONAL.) The DNS resolution process is modeled | such assurance, are OPTIONAL.) The DNS resolution process is modeled | |||
| as an untrusted channel that might be controlled by an attacker, so | as an untrusted channel that might be controlled by an attacker, so | |||
| Alt-Svc parameters that cannot be safely received in this model MUST | Alt-Svc parameters that cannot be safely received in this model MUST | |||
| NOT have a corresponding defined SvcParamKey. For example, there is | NOT have a corresponding defined SvcParamKey. For example, there is | |||
| no SvcParamKey corresponding to the Alt-Svc "persist" parameter, | no SvcParamKey corresponding to the Alt-Svc "persist" parameter, | |||
| because this parameter is not safe to accept over an untrusted | because this parameter is not safe to accept over an untrusted | |||
| channel. | channel. | |||
| 9.2.3. Cache lifetime | 9.2.3. Cache Lifetime | |||
| There is no SvcParamKey corresponding to the Alt-Svc "ma" (max age) | There is no SvcParamKey corresponding to the Alt-Svc "ma" (max age) | |||
| parameter. Instead, server operators encode the expiration time in | parameter. Instead, server operators encode the expiration time in | |||
| the DNS TTL. | the DNS TTL. | |||
| The appropriate TTL value might be different from the "ma" value used | The appropriate TTL value might be different from the "ma" value used | |||
| for Alt-Svc, depending on the desired efficiency and agility. Some | for Alt-Svc, depending on the desired efficiency and agility. Some | |||
| DNS caches incorrectly extend the lifetime of DNS records beyond the | DNS caches incorrectly extend the lifetime of DNS records beyond the | |||
| stated TTL, so server operators cannot rely on HTTPS RRs expiring on | stated TTL, so server operators cannot rely on HTTPS RRs expiring on | |||
| time. Shortening the TTL to compensate for incorrect caching is NOT | time. Shortening the TTL to compensate for incorrect caching is NOT | |||
| RECOMMENDED, as this practice impairs the performance of correctly | RECOMMENDED, as this practice impairs the performance of correctly | |||
| functioning caches and does not guarantee faster expiration from | functioning caches and does not guarantee faster expiration from | |||
| incorrect caches. Instead, server operators SHOULD maintain | incorrect caches. Instead, server operators SHOULD maintain | |||
| compatibility with expired records until they observe that nearly all | compatibility with expired records until they observe that nearly all | |||
| connections have migrated to the new configuration. | connections have migrated to the new configuration. | |||
| 9.2.4. Granularity | 9.2.4. Granularity | |||
| Sending Alt-Svc over HTTP allows the server to tailor the Alt-Svc | Sending Alt-Svc over HTTP allows the server to tailor the Alt-Svc | |||
| Field Value specifically to the client. When using an HTTPS RR, | field value specifically to the client. When using an HTTPS RR, | |||
| groups of clients will necessarily receive the same SvcParams. | groups of clients will necessarily receive the same SvcParams. | |||
| Therefore, HTTPS RRs are not suitable for uses that require single- | Therefore, HTTPS RRs are not suitable for uses that require single- | |||
| client granularity. | client granularity. | |||
| 9.3. Interaction with Alt-Svc | 9.3. Interaction with Alt-Svc | |||
| Clients that implement support for both Alt-Svc and HTTPS records and | Clients that implement support for both Alt-Svc and HTTPS records and | |||
| are making a connection based on a cached Alt-Svc response SHOULD | are making a connection based on a cached Alt-Svc response SHOULD | |||
| retrieve any HTTPS records for the Alt-Svc alt-authority, and ensure | retrieve any HTTPS records for the Alt-Svc alt-authority and ensure | |||
| that their connection attempts are consistent with both the Alt-Svc | that their connection attempts are consistent with both the Alt-Svc | |||
| parameters and any received HTTPS SvcParams. If present, the HTTPS | parameters and any received HTTPS SvcParams. If present, the HTTPS | |||
| record's TargetName and port are used for connection establishment | record's TargetName and port are used for connection establishment | |||
| (as in Section 3). For example, suppose that "https://example.com" | (per Section 3). For example, suppose that "https://example.com" | |||
| sends an Alt-Svc field value of: | sends an Alt-Svc field value of: | |||
| Alt-Svc: h2="alt.example:443", h2="alt2.example:443", h3=":8443" | Alt-Svc: h2="alt.example:443", h2="alt2.example:443", h3=":8443" | |||
| The client would retrieve the following HTTPS records: | The client would retrieve the following HTTPS records: | |||
| alt.example. IN HTTPS 1 . alpn=h2,h3 foo=... | alt.example. IN HTTPS 1 . alpn=h2,h3 foo=... | |||
| alt2.example. IN HTTPS 1 alt2b.example. alpn=h3 foo=... | alt2.example. IN HTTPS 1 alt2b.example. alpn=h3 foo=... | |||
| _8443._https.example.com. IN HTTPS 1 alt3.example. ( | _8443._https.example.com. IN HTTPS 1 alt3.example. ( | |||
| port=9443 alpn=h2,h3 foo=... ) | port=9443 alpn=h2,h3 foo=... ) | |||
| skipping to change at page 28, line 50 ¶ | skipping to change at line 1306 ¶ | |||
| * HTTP/2 to alt.example:443 | * HTTP/2 to alt.example:443 | |||
| * HTTP/3 to alt3.example:9443 | * HTTP/3 to alt3.example:9443 | |||
| * Fallback to the client's non-Alt-Svc connection behavior | * Fallback to the client's non-Alt-Svc connection behavior | |||
| The following connection attempts would not be allowed: | The following connection attempts would not be allowed: | |||
| * HTTP/3 to alt.example:443 (not consistent with Alt-Svc) | * HTTP/3 to alt.example:443 (not consistent with Alt-Svc) | |||
| * Any connection to alt2b.example (no ALPN consistent with both the | * Any connection to alt2b.example (no ALPN ID consistent with both | |||
| HTTPS record and Alt-Svc) | the HTTPS record and Alt-Svc) | |||
| * HTTPS over TCP to any port on alt3.example (not consistent with | * HTTPS over TCP to any port on alt3.example (not consistent with | |||
| Alt-Svc) | Alt-Svc) | |||
| Suppose that "foo" is a SvcParamKey that renders the client SVCB- | Suppose that "foo" is a SvcParamKey that renders the client SVCB- | |||
| reliant. The following Alt-Svc-only connection attempts would be | reliant. The following Alt-Svc-only connection attempts would be | |||
| allowed only if the client does not support "foo", as they rely on | allowed only if the client does not support "foo", as they rely on | |||
| SVCB-optional fallback behavior: | SVCB-optional fallback behavior: | |||
| * HTTP/2 to alt2.example:443 | * HTTP/2 to alt2.example:443 | |||
| * HTTP/3 to example.com:8443 | * HTTP/3 to example.com:8443 | |||
| Alt-authorities SHOULD carry the same SvcParams as the origin unless | Alt-authorities SHOULD carry the same SvcParams as the origin unless | |||
| a deviation is specifically known to be safe. As noted in | a deviation is specifically known to be safe. As noted in | |||
| Section 2.4 of [AltSvc], clients MAY disallow any Alt-Svc connection | Section 2.4 of [AltSvc], clients MAY disallow any Alt-Svc connection | |||
| according to their own criteria, e.g. disallowing Alt-Svc connections | according to their own criteria, e.g., disallowing Alt-Svc | |||
| that lack support for privacy features that are available on the | connections that lack support for privacy features that are available | |||
| origin endpoint. | on the authority endpoint. | |||
| 9.4. Requiring Server Name Indication | 9.4. Requiring Server Name Indication | |||
| Clients MUST NOT use an HTTPS RR response unless the client supports | Clients MUST NOT use an HTTPS RR response unless the client supports | |||
| TLS Server Name Indication (SNI) and indicates the origin name in the | the TLS Server Name Indication (SNI) extension and indicates the | |||
| TLS ClientHello (which might be encrypted via a future specification | origin name in the TLS ClientHello (which might be encrypted via a | |||
| such as ECH). This supports the conservation of IP addresses. | future specification such as [ECH]). This supports the conservation | |||
| of IP addresses. | ||||
| Note that the TLS SNI (and also the HTTP "Host" or ":authority") will | Note that the TLS SNI (and also the HTTP "Host" or ":authority") will | |||
| indicate the origin, not the TargetName. | indicate the origin, not the TargetName. | |||
| 9.5. HTTP Strict Transport Security | 9.5. HTTP Strict Transport Security (HSTS) | |||
| An HTTPS RR directs the client to communicate with this host only | An HTTPS RR directs the client to communicate with this host only | |||
| over a secure transport, similar to HTTP Strict Transport Security | over a secure transport, similar to HSTS [HSTS]. Prior to making an | |||
| [HSTS]. Prior to making an "http" scheme request, the client SHOULD | "http" scheme request, the client SHOULD perform a lookup to | |||
| perform a lookup to determine if any HTTPS RRs exist for that origin. | determine if any HTTPS RRs exist for that origin. To do so, the | |||
| To do so, the client SHOULD construct a corresponding "https" URL as | client SHOULD construct a corresponding "https" URL as follows: | |||
| follows: | ||||
| 1. Replace the "http" scheme with "https". | 1. Replace the "http" scheme with "https". | |||
| 2. If the "http" URL explicitly specifies port 80, specify port 443. | 2. If the "http" URL explicitly specifies port 80, specify port 443. | |||
| 3. Do not alter any other aspect of the URL. | 3. Do not alter any other aspect of the URL. | |||
| This construction is equivalent to Section 8.3 of [HSTS], point 5. | This construction is equivalent to Section 8.3 of [HSTS], Step 5. | |||
| If an HTTPS RR query for this "https" URL returns any AliasMode HTTPS | If an HTTPS RR query for this "https" URL returns any AliasMode HTTPS | |||
| RRs, or any compatible ServiceMode HTTPS RRs (see Section 8), the | RRs or any compatible ServiceMode HTTPS RRs (see Section 8), the | |||
| client SHOULD behave as if it has received an HTTP 307 (Temporary | client SHOULD behave as if it has received an HTTP 307 (Temporary | |||
| Redirect) status code with this "https" URL in the "Location" field. | Redirect) status code with this "https" URL in the "Location" field. | |||
| (Receipt of an incompatible ServiceMode RR does not trigger the | (Receipt of an incompatible ServiceMode RR does not trigger the | |||
| redirect behavior.) Because HTTPS RRs are received over an often- | redirect behavior.) Because HTTPS RRs are received over an often- | |||
| insecure channel (DNS), clients MUST NOT place any more trust in this | insecure channel (DNS), clients MUST NOT place any more trust in this | |||
| signal than if they had received a 307 (Temporary Redirect) response | signal than if they had received a 307 (Temporary Redirect) response | |||
| over cleartext HTTP. | over cleartext HTTP. | |||
| Publishing an HTTPS RR has the potential to have unexpected results | Publishing an HTTPS RR can potentially lead to unexpected results or | |||
| or a loss in functionality in cases where the "http" resource neither | a loss in functionality in cases where the "http" resource neither | |||
| redirects to the "https" resource nor references the same underlying | redirects to the "https" resource nor references the same underlying | |||
| resource. | resource. | |||
| When an "https" connection fails due to an error in the underlying | When an "https" connection fails due to an error in the underlying | |||
| secure transport, such as an error in certificate validation, some | secure transport, such as an error in certificate validation, some | |||
| clients currently offer a "user recourse" that allows the user to | clients currently offer a "user recourse" that allows the user to | |||
| bypass the security error and connect anyway. When making an "https" | bypass the security error and connect anyway. When making an "https" | |||
| scheme request to an origin with an HTTPS RR, either directly or via | scheme request to an origin with an HTTPS RR, either directly or via | |||
| the above redirect, such a client MAY remove the user recourse | the above redirect, such a client MAY remove the user recourse | |||
| option. Origins that publish HTTPS RRs therefore MUST NOT rely on | option. Origins that publish HTTPS RRs therefore MUST NOT rely on | |||
| user recourse for access. For more information, see Section 8.4 and | user recourse for access. For more information, see Sections 8.4 and | |||
| Section 12.1 of [HSTS]. | 12.1 of [HSTS]. | |||
| 9.6. Use of HTTPS RRs in other protocols | 9.6. Use of HTTPS RRs in Other Protocols | |||
| All HTTP connections to named origins are eligible to use HTTPS RRs, | All HTTP connections to named origins are eligible to use HTTPS RRs, | |||
| even when HTTP is used as part of another protocol or without an | even when HTTP is used as part of another protocol or without an | |||
| explicit HTTP URL. For example, clients that support HTTPS RRs and | explicit HTTP-related URI scheme (Section 4.2 of [HTTP]). For | |||
| implement the altered WebSocket [WebSocket] opening handshake from | example, clients that support HTTPS RRs and implement [WebSocket] | |||
| the W3C Fetch specification [FETCH] SHOULD use HTTPS RRs for the | using the altered opening handshake from [FETCH-WEBSOCKETS] SHOULD | |||
| requestURL. | use HTTPS RRs for the requestURL. | |||
| When HTTP is used in a context where URLs or redirects are not | When HTTP is used in a context where URLs or redirects are not | |||
| applicable (e.g. connections to an HTTP proxy), clients that find a | applicable (e.g., connections to an HTTP proxy), clients that find a | |||
| corresponding HTTPS RR SHOULD implement a security upgrade behavior | corresponding HTTPS RR SHOULD implement security upgrade behavior | |||
| equivalent to the one specified in Section 9.5. | equivalent to that specified in Section 9.5. | |||
| Such protocols MAY define their own SVCB mappings, which MAY be | Such protocols MAY define their own SVCB mappings, which MAY be | |||
| defined to take precedence over HTTPS RRs. | defined to take precedence over HTTPS RRs. | |||
| 10. Zone Structures | 10. Zone Structures | |||
| 10.1. Structuring zones for flexibility | ||||
| Each ServiceMode RRSet can only serve a single scheme. The scheme is | 10.1. Structuring Zones for Flexibility | |||
| Each ServiceMode RRset can only serve a single scheme. The scheme is | ||||
| indicated by the owner name and the RR type. For the generic SVCB RR | indicated by the owner name and the RR type. For the generic SVCB RR | |||
| type, this means that each owner name can only be used for a single | type, this means that each owner name can only be used for a single | |||
| scheme. The underscore prefixing requirement (Section 2.3) ensures | scheme. The underscore prefixing requirement (Section 2.3) ensures | |||
| that this is true for the initial query, but it is the responsibility | that this is true for the initial query, but it is the responsibility | |||
| of zone owners to choose names that satisfy this constraint when | of zone owners to choose names that satisfy this constraint when | |||
| using aliases, including CNAME and AliasMode records. | using aliases, including CNAME and AliasMode records. | |||
| When using the generic SVCB RR type with aliasing, zone owners SHOULD | When using the generic SVCB RR type with aliasing, zone owners SHOULD | |||
| choose alias target names that indicate the scheme in use (e.g. | choose alias target names that indicate the scheme in use (e.g., | |||
| foosvc.example.net for foo:// schemes). This will help to avoid | "foosvc.example.net" for "foo" schemes). This will help to avoid | |||
| confusion when another scheme needs to be added to the configuration. | confusion when another scheme needs to be added to the configuration. | |||
| When multiple port numbers are in use, it may be helpful to repeat | When multiple port numbers are in use, it may be helpful to repeat | |||
| the prefix labels in the alias target name (e.g. | the prefix labels in the alias target name (e.g., | |||
| _1234._foo.svc.example.net). | "_1234._foo.svc.example.net"). | |||
| 10.2. Structuring zones for performance | 10.2. Structuring Zones for Performance | |||
| To avoid a delay for clients using a nonconforming recursive | To avoid a delay for clients using a non-conforming recursive | |||
| resolver, domain owners SHOULD minimize the use of AliasMode records, | resolver, domain owners SHOULD minimize the use of AliasMode records | |||
| and SHOULD choose TargetName according to a predictable convention | and SHOULD choose TargetName according to a predictable convention | |||
| that is known to the client, so that clients can issue A and/or AAAA | that is known to the client, so that clients can issue A and/or AAAA | |||
| queries for TargetName in advance (see Section 5). Unless otherwise | queries for TargetName in advance (see Section 5). Unless otherwise | |||
| specified, the convention is to set TargetName to the service name | specified, the convention is to set TargetName to the service name | |||
| for an initial ServiceMode record, or to "." if it is reached via an | for an initial ServiceMode record, or to "." if it is reached via an | |||
| alias. | alias. | |||
| $ORIGIN example.com. ; Origin | $ORIGIN example.com. ; Origin | |||
| foo 3600 IN CNAME foosvc.example.net. | foo 3600 IN CNAME foosvc.example.net. | |||
| _8080._foo.foo 3600 IN CNAME foosvc.example.net. | _8080._foo.foo 3600 IN CNAME foosvc.example.net. | |||
| bar 300 IN AAAA 2001:db8::2 | bar 300 IN AAAA 2001:db8::2 | |||
| _9090._bar.bar 3600 IN SVCB 1 bar key65444=... | _9090._bar.bar 3600 IN SVCB 1 bar key65444=... | |||
| $ORIGIN example.net. ; Service provider zone | $ORIGIN example.net. ; Service provider zone | |||
| foosvc 3600 IN SVCB 1 . key65333=... | foosvc 3600 IN SVCB 1 . key65333=... | |||
| foosvc 300 IN AAAA 2001:db8::1 | foosvc 300 IN AAAA 2001:db8::1 | |||
| Figure 1: foo://foo.example.com:8080 is delegated to | Figure 1: "foo://foo.example.com:8080" Is Available at | |||
| foosvc.example.net, but bar://bar.example.com:9090 is served | "foosvc.example.net", but "bar://bar.example.com:9090" Is Served | |||
| locally. | Locally | |||
| Domain owners SHOULD avoid using a TargetName that is below a DNAME, | Domain owners SHOULD avoid using a TargetName that is below a DNAME, | |||
| as this is likely unnecessary and makes responses slower and larger. | as this is likely unnecessary and makes responses slower and larger. | |||
| Also, zone structures that require following more than 8 aliases | Also, zone structures that require following more than eight aliases | |||
| (counting both AliasMode and CNAME records) are NOT RECOMMENDED. | (counting both AliasMode and CNAME records) are NOT RECOMMENDED. | |||
| 10.3. Operational considerations | 10.3. Operational Considerations | |||
| Note that some implementations may not allow A or AAAA records on | Some authoritative DNS servers may not allow A or AAAA records on | |||
| names starting with an underscore due to various interpretations of | names starting with an underscore (e.g., [BIND-CHECK-NAMES]). This | |||
| RFCs. This could be an operational issue when the TargetName | could create an operational issue when the TargetName contains an | |||
| contains an attrleaf label, as well as using an TargetName of "." | Attrleaf label, or when using a TargetName of "." if the owner name | |||
| when the owner name contains an attrleaf label. | contains an Attrleaf label. | |||
| 10.4. Examples | 10.4. Examples | |||
| 10.4.1. Protocol enhancements | 10.4.1. Protocol Enhancements | |||
| Consider a simple zone of the form: | Consider a simple zone of the form: | |||
| $ORIGIN simple.example. ; Simple example zone | $ORIGIN simple.example. ; Simple example zone | |||
| @ 300 IN A 192.0.2.1 | @ 300 IN A 192.0.2.1 | |||
| AAAA 2001:db8::1 | AAAA 2001:db8::1 | |||
| The domain owner could add this record: | The domain owner could add this record: | |||
| @ 7200 IN HTTPS 1 . alpn=h3 | @ 7200 IN HTTPS 1 . alpn=h3 | |||
| to indicate that https://simple.example supports QUIC in addition to | This record would indicate that "https://simple.example" supports | |||
| HTTP/1.1 over TLS over TCP (the implicit default). The record could | QUIC in addition to HTTP/1.1 over TLS over TCP (the implicit | |||
| also include other information (e.g. non-standard port). For | default). The record could also include other information (e.g., a | |||
| https://simple.example:8443, the record would be: | non-standard port). For "https://simple.example:8443", the record | |||
| would be: | ||||
| _8443._https 7200 IN HTTPS 1 . alpn=h3 | _8443._https 7200 IN HTTPS 1 . alpn=h3 | |||
| These records also respectively tell clients to replace the scheme | These records also respectively tell clients to replace the scheme | |||
| with "https" when loading http://simple.example or | with "https" when loading "http://simple.example" or | |||
| http://simple.example:8443. | "http://simple.example:8443". | |||
| 10.4.2. Apex aliasing | 10.4.2. Apex Aliasing | |||
| Consider a zone that is using CNAME aliasing: | Consider a zone that is using CNAME aliasing: | |||
| $ORIGIN aliased.example. ; A zone that is using a hosting service | $ORIGIN aliased.example. ; A zone that is using a hosting service | |||
| ; Subdomain aliased to a high-performance server pool | ; Subdomain aliased to a high-performance server pool | |||
| www 7200 IN CNAME pool.svc.example. | www 7200 IN CNAME pool.svc.example. | |||
| ; Apex domain on fixed IPs because CNAME is not allowed at the apex | ; Apex domain on fixed IPs because CNAME is not allowed at the apex | |||
| @ 300 IN A 192.0.2.1 | @ 300 IN A 192.0.2.1 | |||
| IN AAAA 2001:db8::1 | IN AAAA 2001:db8::1 | |||
| skipping to change at page 33, line 15 ¶ | skipping to change at line 1507 ¶ | |||
| With this record in place, HTTPS-RR-aware clients will use the same | With this record in place, HTTPS-RR-aware clients will use the same | |||
| server pool for aliased.example and www.aliased.example. (They will | server pool for aliased.example and www.aliased.example. (They will | |||
| also upgrade "http://aliased.example/..." to "https".) Non-HTTPS-RR- | also upgrade "http://aliased.example/..." to "https".) Non-HTTPS-RR- | |||
| aware clients will just ignore the new record. | aware clients will just ignore the new record. | |||
| Similar to CNAME, HTTPS RRs have no impact on the origin name. When | Similar to CNAME, HTTPS RRs have no impact on the origin name. When | |||
| connecting, clients will continue to treat the authoritative origins | connecting, clients will continue to treat the authoritative origins | |||
| as "https://www.aliased.example" and "https://aliased.example", | as "https://www.aliased.example" and "https://aliased.example", | |||
| respectively, and will validate TLS server certificates accordingly. | respectively, and will validate TLS server certificates accordingly. | |||
| 10.4.3. Parameter binding | 10.4.3. Parameter Binding | |||
| Suppose that svc.example's primary server pool supports HTTP/3, but | Suppose that svc.example's primary server pool supports HTTP/3 but | |||
| its backup server pool does not. This can be expressed in the | its backup server pool does not. This can be expressed in the | |||
| following form: | following form: | |||
| $ORIGIN svc.example. ; A hosting provider. | $ORIGIN svc.example. ; A hosting provider | |||
| pool 7200 IN HTTPS 1 . alpn=h2,h3 | pool 7200 IN HTTPS 1 . alpn=h2,h3 | |||
| HTTPS 2 backup alpn=h2 port=8443 | HTTPS 2 backup alpn=h2 port=8443 | |||
| pool 300 IN A 192.0.2.2 | pool 300 IN A 192.0.2.2 | |||
| AAAA 2001:db8::2 | AAAA 2001:db8::2 | |||
| backup 300 IN A 192.0.2.3 | backup 300 IN A 192.0.2.3 | |||
| AAAA 2001:db8::3 | AAAA 2001:db8::3 | |||
| This configuration is entirely compatible with the "Apex aliasing" | This configuration is entirely compatible with the "apex aliasing" | |||
| example, whether the client supports HTTPS RRs or not. If the client | example, whether the client supports HTTPS RRs or not. If the client | |||
| does support HTTPS RRs, all connections will be upgraded to HTTPS, | does support HTTPS RRs, all connections will be upgraded to HTTPS, | |||
| and clients will use HTTP/3 if they can. Parameters are "bound" to | and clients will use HTTP/3 if they can. Parameters are "bound" to | |||
| each server pool, so each server pool can have its own protocol, port | each server pool, so each server pool can have its own protocol, port | |||
| number, etc. | number, etc. | |||
| 10.4.4. Multi-CDN | 10.4.4. Multi-CDN Configuration | |||
| The HTTPS RR is intended to support HTTPS services operated by | The HTTPS RR is intended to support HTTPS services operated by | |||
| multiple independent entities, such as different Content Delivery | multiple independent entities, such as different CDNs or different | |||
| Networks (CDNs) or different hosting providers. This includes the | hosting providers. This includes the case where a service is | |||
| case where a service is migrated from one operator to another, as | migrated from one operator to another, as well as the case where the | |||
| well as the case where the service is multiplexed between multiple | service is multiplexed between multiple operators for performance, | |||
| operators for performance, redundancy, etc. | redundancy, etc. | |||
| This example shows such a configuration, with www.customer.example | This example shows such a configuration, with www.customer.example | |||
| having different DNS responses to different queries, either over time | having different DNS responses to different queries, either over time | |||
| or due to logic within the authoritative DNS server: | or due to logic within the authoritative DNS server: | |||
| ; This zone contains/returns different CNAME records | ; This zone contains/returns different CNAME records | |||
| ; at different points-in-time. The RRset for "www" can | ; at different points in time. The RRset for "www" can | |||
| ; only ever contain a single CNAME. | ; only ever contain a single CNAME. | |||
| ; Sometimes the zone has: | ; Sometimes the zone has: | |||
| $ORIGIN customer.example. ; A Multi-CDN customer domain | $ORIGIN customer.example. ; A multi-CDN customer domain | |||
| www 900 IN CNAME cdn1.svc1.example. | www 900 IN CNAME cdn1.svc1.example. | |||
| ; and other times it contains: | ; and other times it contains: | |||
| $ORIGIN customer.example. | $ORIGIN customer.example. | |||
| www 900 IN CNAME customer.svc2.example. | www 900 IN CNAME customer.svc2.example. | |||
| ; and yet other times it contains: | ; and yet other times it contains: | |||
| $ORIGIN customer.example. | $ORIGIN customer.example. | |||
| www 900 IN CNAME cdn3.svc3.example. | www 900 IN CNAME cdn3.svc3.example. | |||
| ; With the following remaining constant and always included: | ; With the following remaining constant and always included: | |||
| $ORIGIN customer.example. ; A Multi-CDN customer domain | $ORIGIN customer.example. ; A multi-CDN customer domain | |||
| ; The apex is also aliased to www to match its configuration | ; The apex is also aliased to www to match its configuration. | |||
| @ 7200 IN HTTPS 0 www | @ 7200 IN HTTPS 0 www | |||
| ; Non-HTTPS-aware clients use non-CDN IPs | ; Non-HTTPS-aware clients use non-CDN IPs. | |||
| A 203.0.113.82 | A 203.0.113.82 | |||
| AAAA 2001:db8:203::2 | AAAA 2001:db8:203::2 | |||
| ; Resolutions following the cdn1.svc1.example | ; Resolutions following the cdn1.svc1.example | |||
| ; path use these records. | ; path use these records. | |||
| ; This CDN uses a different alternative service for HTTP/3. | ; This CDN uses a different alternative service for HTTP/3. | |||
| $ORIGIN svc1.example. ; domain for CDN 1 | $ORIGIN svc1.example. ; domain for CDN 1 | |||
| cdn1 1800 IN HTTPS 1 h3pool alpn=h3 | cdn1 1800 IN HTTPS 1 h3pool alpn=h3 | |||
| HTTPS 2 . alpn=h2 | HTTPS 2 . alpn=h2 | |||
| A 192.0.2.2 | A 192.0.2.2 | |||
| skipping to change at page 35, line 4 ¶ | skipping to change at line 1589 ¶ | |||
| $ORIGIN svc2.example. ; domain operated by CDN 2 | $ORIGIN svc2.example. ; domain operated by CDN 2 | |||
| customer 300 IN HTTPS 1 . alpn=h2 | customer 300 IN HTTPS 1 . alpn=h2 | |||
| 60 IN A 198.51.100.2 | 60 IN A 198.51.100.2 | |||
| A 198.51.100.3 | A 198.51.100.3 | |||
| A 198.51.100.4 | A 198.51.100.4 | |||
| AAAA 2001:db8:198::7 | AAAA 2001:db8:198::7 | |||
| AAAA 2001:db8:198::12 | AAAA 2001:db8:198::12 | |||
| ; Resolutions following the cdn3.svc3.example | ; Resolutions following the cdn3.svc3.example | |||
| ; path use these records. | ; path use these records. | |||
| ; Note that this CDN has no HTTPS records. | ; Note that this CDN has no HTTPS records. | |||
| $ORIGIN svc3.example. ; domain operated by CDN 3 | $ORIGIN svc3.example. ; domain operated by CDN 3 | |||
| cdn3 60 IN A 203.0.113.8 | cdn3 60 IN A 203.0.113.8 | |||
| AAAA 2001:db8:113::8 | AAAA 2001:db8:113::8 | |||
| Note that in the above example, the different CDNs have different | Note that in the above example, the different CDNs have different | |||
| configurations and different capabilities, but clients will use HTTPS | configurations and different capabilities, but clients will use HTTPS | |||
| RRs as a bound-together unit. | RRs as a bound-together unit. | |||
| Domain owners should be cautious when using a multi-CDN | Domain owners should be cautious when using a multi-CDN | |||
| configuration, as it introduces a number of complexities highlighted | configuration, as it introduces a number of complexities highlighted | |||
| by this example: | by this example: | |||
| * If CDN 1 supports a desired protocol or feature, and CDN 2 does | * If CDN 1 supports a desired protocol or feature and CDN 2 does | |||
| not, the client is vulnerable to downgrade by a network adversary | not, the client is vulnerable to downgrade by a network adversary | |||
| who forces clients to get CDN 2 records. | who forces clients to get CDN 2 records. | |||
| * Aliasing the apex to its subdomain simplifies the zone file but | * Aliasing the apex to its subdomain simplifies the zone file but | |||
| likely increases resolution latency, especially when using a non- | likely increases resolution latency, especially when using a non- | |||
| HTTPS-aware recursive resolver. An alternative would be to alias | HTTPS-aware recursive resolver. An alternative would be to alias | |||
| the zone apex directly to a name managed by a CDN. | the zone apex directly to a name managed by a CDN. | |||
| * The A, AAAA, and HTTPS resolutions are independent lookups, so | * The A, AAAA, and HTTPS resolutions are independent lookups, so | |||
| resolvers may observe and follow different CNAMEs to different | resolvers may observe and follow different CNAMEs to different | |||
| CDNs. Clients may thus find that the A and AAAA responses do not | CDNs. Clients may thus find that the A and AAAA responses do not | |||
| correspond to the TargetName in the HTTPS response, and will need | correspond to the TargetName in the HTTPS response; these clients | |||
| to perform additional queries to retrieve the correct IP | will need to perform additional queries to retrieve the correct IP | |||
| addresses. Including ipv6hint and ipv4hint will reduce the | addresses. Including ipv6hint and ipv4hint will reduce the | |||
| performance impact of this case. | performance impact of this case. | |||
| * If not all CDNs publish HTTPS records, clients will sometimes | * If not all CDNs publish HTTPS records, clients will sometimes | |||
| receive NODATA for HTTPS queries (as with cdn3.svc3.example | receive NODATA for HTTPS queries (as with cdn3.svc3.example above) | |||
| above), but could receive A/AAAA records from a different CDN. | but could receive A/AAAA records from a different CDN. Clients | |||
| Clients will attempt to connect to this CDN without the benefit of | will attempt to connect to this CDN without the benefit of its | |||
| its HTTPS records. | HTTPS records. | |||
| 10.4.5. Non-HTTP uses | 10.4.5. Non-HTTP Uses | |||
| For protocols other than HTTP, the SVCB RR and an Attrleaf label | For protocols other than HTTP, the SVCB RR and an Attrleaf label | |||
| [Attrleaf] will be used. For example, to reach an example resource | [Attrleaf] will be used. For example, to reach an example resource | |||
| of "baz://api.example.com:8765", the following SVCB record would be | of "baz://api.example.com:8765", the following SVCB record would be | |||
| used to alias it to "svc4-baz.example.net." which in-turn could | used to alias it to "svc4-baz.example.net.", which in turn could | |||
| return AAAA/A records and/or SVCB records in ServiceMode: | return AAAA/A records and/or SVCB records in ServiceMode: | |||
| _8765._baz.api.example.com. 7200 IN SVCB 0 svc4-baz.example.net. | _8765._baz.api.example.com. 7200 IN SVCB 0 svc4-baz.example.net. | |||
| HTTPS RRs use similar Attrleaf labels if the origin contains a non- | HTTPS RRs use similar Attrleaf labels if the origin contains a non- | |||
| default port. | default port. | |||
| 11. Interaction with other standards | 11. Interaction with Other Standards | |||
| This standard is intended to reduce connection latency and improve | This standard is intended to reduce connection latency and improve | |||
| user privacy. Server operators implementing this standard SHOULD | user privacy. Server operators implementing this standard SHOULD | |||
| also implement TLS 1.3 [RFC8446] and OCSP Stapling [RFC6066], both of | also implement TLS 1.3 [RFC8446] and Online Certificate Status | |||
| which confer substantial performance and privacy benefits when used | Protocol (OCSP) Stapling (i.e., Certificate Status Request in | |||
| in combination with SVCB records. | Section 8 of [RFC6066]), both of which confer substantial performance | |||
| and privacy benefits when used in combination with SVCB records. | ||||
| To realize the greatest privacy benefits, this proposal is intended | To realize the greatest privacy benefits, this proposal is intended | |||
| for use over a privacy-preserving DNS transport (like DNS over TLS | for use over a privacy-preserving DNS transport (like DNS over TLS | |||
| [DoT] or DNS over HTTPS [DoH]). However, performance improvements, | [DoT] or DNS over HTTPS [DoH]). However, performance improvements, | |||
| and some modest privacy improvements, are possible without the use of | and some modest privacy improvements, are possible without the use of | |||
| those standards. | those standards. | |||
| Any specification for use of SVCB with a protocol MUST have an entry | Any specification for the use of SVCB with a protocol MUST have an | |||
| for its scheme under the SVCB RR type in the IANA DNS Underscore | entry for its scheme under the SVCB RR type in the IANA DNS | |||
| Global Scoped Entry Registry [Attrleaf]. The scheme MUST have an | "Underscored and Globally Scoped DNS Node Names" registry [Attrleaf]. | |||
| entry in the IANA URI Schemes Registry [RFC7595], and MUST have a | The scheme MUST have an entry in the "Uniform Resource Identifier | |||
| defined specification for use with SVCB. | (URI) Schemes" registry [RFC7595] and MUST have a defined | |||
| specification for use with SVCB. | ||||
| 12. Security Considerations | 12. Security Considerations | |||
| SVCB/HTTPS RRs permit distribution over untrusted channels, and | SVCB/HTTPS RRs permit distribution over untrusted channels, and | |||
| clients are REQUIRED to verify that the alternative endpoint is | clients are REQUIRED to verify that the alternative endpoint is | |||
| authoritative for the service (similar to Section 2.1 of [AltSvc]). | authoritative for the service (similar to Section 2.1 of [AltSvc]). | |||
| Therefore, DNSSEC signing and validation are OPTIONAL for publishing | Therefore, DNSSEC signing and validation are OPTIONAL for publishing | |||
| and using SVCB and HTTPS RRs. | and using SVCB and HTTPS RRs. | |||
| Clients MUST ensure that their DNS cache is partitioned for each | Clients MUST ensure that their DNS cache is partitioned for each | |||
| skipping to change at page 36, line 45 ¶ | skipping to change at line 1680 ¶ | |||
| adversary in one network from implanting a forged DNS record that | adversary in one network from implanting a forged DNS record that | |||
| allows them to track users or hinder their connections after they | allows them to track users or hinder their connections after they | |||
| leave that network. | leave that network. | |||
| An attacker who can prevent SVCB resolution can deny clients any | An attacker who can prevent SVCB resolution can deny clients any | |||
| associated security benefits. A hostile recursive resolver can | associated security benefits. A hostile recursive resolver can | |||
| always deny service to SVCB queries, but network intermediaries can | always deny service to SVCB queries, but network intermediaries can | |||
| often prevent resolution as well, even when the client and recursive | often prevent resolution as well, even when the client and recursive | |||
| resolver validate DNSSEC and use a secure transport. These downgrade | resolver validate DNSSEC and use a secure transport. These downgrade | |||
| attacks can prevent the "https" upgrade provided by the HTTPS RR | attacks can prevent the "https" upgrade provided by the HTTPS RR | |||
| (Section 9.5), and disable any other protections coordinated via | (Section 9.5) and can disable any other protections coordinated via | |||
| SvcParams. To prevent downgrades, Section 3.1 recommends that | SvcParams. To prevent downgrades, Section 3.1 recommends that | |||
| clients abandon the connection attempt when such an attack is | clients abandon the connection attempt when such an attack is | |||
| detected. | detected. | |||
| A hostile DNS intermediary might forge AliasMode "." records | A hostile DNS intermediary might forge AliasMode "." records | |||
| (Section 2.5.1) as a way to block clients from accessing particular | (Section 2.5.1) as a way to block clients from accessing particular | |||
| services. Such an adversary could already block entire domains by | services. Such an adversary could already block entire domains by | |||
| forging erroneous responses, but this mechanism allows them to target | forging erroneous responses, but this mechanism allows them to target | |||
| particular protocols or ports within a domain. Clients that might be | particular protocols or ports within a domain. Clients that might be | |||
| subject to such attacks SHOULD ignore AliasMode "." records. | subject to such attacks SHOULD ignore AliasMode "." records. | |||
| A hostile DNS intermediary or origin can return SVCB records | A hostile DNS intermediary or authoritative server can return SVCB | |||
| indicating any IP address and port number, including IP addresses | records indicating any IP address and port number, including IP | |||
| inside the local network and port numbers assigned to internal | addresses inside the local network and port numbers assigned to | |||
| services. If the attacker can influence the client's payload (e.g. | internal services. If the attacker can influence the client's | |||
| TLS session ticket contents), and an internal service has a | payload (e.g., TLS session ticket contents) and an internal service | |||
| sufficiently lax parser, it's possible that the attacker could gain | has a sufficiently lax parser, the attacker could gain access to the | |||
| unintended access. (The same concerns apply to SRV records, HTTP | internal service. (The same concerns apply to SRV records, HTTP Alt- | |||
| Alt-Svc, and HTTP redirects.) As a mitigation, SVCB mapping | Svc, and HTTP redirects.) As a mitigation, SVCB mapping documents | |||
| documents SHOULD indicate any port number restrictions that are | SHOULD indicate any port number restrictions that are appropriate for | |||
| appropriate for the supported transports. | the supported transports. | |||
| 13. Privacy Considerations | 13. Privacy Considerations | |||
| Standard address queries reveal the user's intent to access a | Standard address queries reveal the user's intent to access a | |||
| particular domain. This information is visible to the recursive | particular domain. This information is visible to the recursive | |||
| resolver, and to many other parties when plaintext DNS transport is | resolver, and to many other parties when plaintext DNS transport is | |||
| used. SVCB queries, like queries for SRV records and other specific | used. SVCB queries, like queries for SRV records and other specific | |||
| RR types, additionally reveal the user's intent to use a particular | RR types, additionally reveal the user's intent to use a particular | |||
| protocol. This is not normally sensitive information, but it should | protocol. This is not normally sensitive information, but it should | |||
| be considered when adding SVCB support in a new context. | be considered when adding SVCB support in a new context. | |||
| 14. IANA Considerations | 14. IANA Considerations | |||
| 14.1. SVCB RRType | 14.1. SVCB RR Type | |||
| This document defines a new DNS RR type, SVCB, whose value 64 has | ||||
| been allocated by IANA from the "Resource Record (RR) TYPEs" registry | ||||
| on the "Domain Name System (DNS) Parameters" page: | ||||
| * Type: SVCB | ||||
| * Value: 64 | ||||
| * Meaning: General Purpose Service Binding | ||||
| * Reference: This document | ||||
| 14.2. HTTPS RRType | IANA has registered the following new DNS RR type in the "Resource | |||
| Record (RR) TYPEs" registry on the "Domain Name System (DNS) | ||||
| Parameters" page: | ||||
| This document defines a new DNS RR type, "HTTPS", whose value 65 has | Type: SVCB | |||
| been allocated by IANA from the "Resource Record (RR) TYPEs" registry | Value: 64 | |||
| on the "Domain Name System (DNS) Parameters" page: | Meaning: General-purpose service binding | |||
| Reference: RFC 9460 | ||||
| * Type: HTTPS | 14.2. HTTPS RR Type | |||
| * Value: 65 | ||||
| * Meaning: Service Binding type for use with HTTP | IANA has registered the following new DNS RR type in the "Resource | |||
| Record (RR) TYPEs" registry on the "Domain Name System (DNS) | ||||
| Parameters" page: | ||||
| * Reference: This document | Type: HTTPS | |||
| Value: 65 | ||||
| Meaning: SVCB-compatible type for use with HTTP | ||||
| Reference: RFC 9460 | ||||
| 14.3. New registry for Service Parameters | 14.3. New Registry for Service Parameters | |||
| IANA is requested to create a new registry, entitled "Service | IANA has created the "Service Parameter Keys (SvcParamKeys)" registry | |||
| Parameter Keys (SvcParamKeys)". This registry defines the namespace | in the "Domain Name System (DNS) Parameters" category on a new page | |||
| for parameters, including string representations and numeric | entitled "DNS Service Bindings (SVCB)". This registry defines the | |||
| SvcParamKey values. This registry is shared with other SVCB- | namespace for parameters, including string representations and | |||
| numeric SvcParamKey values. This registry is shared with other SVCB- | ||||
| compatible RR types, such as the HTTPS RR. | compatible RR types, such as the HTTPS RR. | |||
| ACTION: create this registry, on a new page entitled "DNS Service | ||||
| Bindings (SVCB)" under the "Domain Name System (DNS) Parameters" | ||||
| category. | ||||
| 14.3.1. Procedure | 14.3.1. Procedure | |||
| A registration MUST include the following fields: | A registration MUST include the following fields: | |||
| * Number: wire format numeric identifier (range 0-65535) | Number: Wire-format numeric identifier (range 0-65535) | |||
| Name: Unique presentation name | ||||
| * Name: unique presentation name | Meaning: A short description | |||
| Reference: Location of specification or registration source | ||||
| * Meaning: a short description | Change Controller: Person or entity, with contact information if | |||
| appropriate | ||||
| * Format Reference: pointer to specification text | ||||
| * Change Controller: Person or entity, with contact information if | ||||
| appropriate. | ||||
| The characters in the registered Name MUST be lower-case alphanumeric | The characters in the registered Name field entry MUST be lowercase | |||
| or "-" (Section 2.1). The name MUST NOT start with "key" or | alphanumeric or "-" (Section 2.1). The name MUST NOT start with | |||
| "invalid". | "key" or "invalid". | |||
| New entries in this registry are subject to an Expert Review | The registration policy for new entries is Expert Review ([RFC8126], | |||
| registration policy ([RFC8126], Section 4.5). The designated expert | Section 4.5). The designated expert MUST ensure that the reference | |||
| MUST ensure that the Format Reference is stable and publicly | is stable and publicly available and that it specifies how to convert | |||
| available, and that it specifies how to convert the SvcParamValue's | the SvcParamValue's presentation format to wire format. The | |||
| presentation format to wire format. The Format Reference MAY be any | reference MAY be any individual's Internet-Draft or a document from | |||
| individual's Internet-Draft, or a document from any other source with | any other source with similar assurances of stability and | |||
| similar assurances of stability and availability. An entry MAY | availability. An entry MAY specify a reference of the form "Same as | |||
| specify a Format Reference of the form "Same as (other key Name)" if | (other key name)" if it uses the same presentation and wire formats | |||
| it uses the same presentation and wire formats as an existing key. | as an existing key. | |||
| This arrangement supports the development of new parameters while | This arrangement supports the development of new parameters while | |||
| ensuring that zone files can be made interoperable. | ensuring that zone files can be made interoperable. | |||
| 14.3.2. Initial contents | 14.3.2. Initial Contents | |||
| The "Service Binding (SVCB) Parameter Registry" shall initially be | The "Service Parameter Keys (SvcParamKeys)" registry has been | |||
| populated with the registrations below: | populated with the following initial registrations: | |||
| +=============+=================+=============+=========+==========+ | +===========+=================+================+=========+==========+ | |||
| | Number | Name | Meaning |Format |Change | | |Number | Name | Meaning |Reference|Change | | |||
| | | | |Reference|Controller| | | | | | |Controller| | |||
| +=============+=================+=============+=========+==========+ | +===========+=================+================+=========+==========+ | |||
| | 0 | mandatory | Mandatory |(This |IETF | | |0 | mandatory | Mandatory |RFC 9460,|IETF | | |||
| | | | keys in |document)| | | | | | keys in this |Section 8| | | |||
| | | | this RR |Section 8| | | | | | RR | | | | |||
| +-------------+-----------------+-------------+---------+----------+ | +-----------+-----------------+----------------+---------+----------+ | |||
| | 1 | alpn | Additional |(This |IETF | | |1 | alpn | Additional |RFC 9460,|IETF | | |||
| | | | supported |document)| | | | | | supported |Section | | | |||
| | | | protocols |Section | | | | | | protocols |7.1 | | | |||
| | | | |7.1 | | | +-----------+-----------------+----------------+---------+----------+ | |||
| +-------------+-----------------+-------------+---------+----------+ | |2 | no-default-alpn | No support |RFC 9460,|IETF | | |||
| | 2 | no-default-alpn | No support |(This |IETF | | | | | for default |Section | | | |||
| | | | for default |document)| | | | | | protocol |7.1 | | | |||
| | | | protocol |Section | | | +-----------+-----------------+----------------+---------+----------+ | |||
| | | | |7.1 | | | |3 | port | Port for |RFC 9460,|IETF | | |||
| +-------------+-----------------+-------------+---------+----------+ | | | | alternative |Section | | | |||
| | 3 | port | Port for |(This |IETF | | | | | endpoint |7.2 | | | |||
| | | | alternative |document)| | | +-----------+-----------------+----------------+---------+----------+ | |||
| | | | endpoint |Section | | | |4 | ipv4hint | IPv4 address |RFC 9460,|IETF | | |||
| | | | |7.2 | | | | | | hints |Section | | | |||
| +-------------+-----------------+-------------+---------+----------+ | | | | |7.3 | | | |||
| | 4 | ipv4hint | IPv4 |(This |IETF | | +-----------+-----------------+----------------+---------+----------+ | |||
| | | | address |document)| | | |5 | ech | RESERVED |N/A |IETF | | |||
| | | | hints |Section | | | | | | (held for | | | | |||
| | | | |7.3 | | | | | | Encrypted | | | | |||
| +-------------+-----------------+-------------+---------+----------+ | | | | ClientHello) | | | | |||
| | 5 | ech | RESERVED |N/A |IETF | | +-----------+-----------------+----------------+---------+----------+ | |||
| | | | (will be | | | | |6 | ipv6hint | IPv6 address |RFC 9460,|IETF | | |||
| | | | used for | | | | | | | hints |Section | | | |||
| | | | ECH) | | | | | | | |7.3 | | | |||
| +-------------+-----------------+-------------+---------+----------+ | +-----------+-----------------+----------------+---------+----------+ | |||
| | 6 | ipv6hint | IPv6 |(This |IETF | | |65280-65534| N/A | Reserved for |RFC 9460 |IETF | | |||
| | | | address |document)| | | | | | Private Use | | | | |||
| | | | hints |Section | | | +-----------+-----------------+----------------+---------+----------+ | |||
| | | | |7.3 | | | |65535 | N/A | Reserved |RFC 9460 |IETF | | |||
| +-------------+-----------------+-------------+---------+----------+ | | | | ("Invalid | | | | |||
| | 65280-65534 | N/A | Private Use |(This |IETF | | | | | key") | | | | |||
| | | | |document)| | | +-----------+-----------------+----------------+---------+----------+ | |||
| +-------------+-----------------+-------------+---------+----------+ | ||||
| | 65535 | N/A | Reserved |(This |IETF | | ||||
| | | | ("Invalid |document)| | | ||||
| | | | key") | | | | ||||
| +-------------+-----------------+-------------+---------+----------+ | ||||
| Table 1 | Table 1 | |||
| 14.4. Other registry updates | 14.4. Other Registry Updates | |||
| Per [Attrleaf], please add the following entry to the DNS Underscore | Per [Attrleaf], the following entry has been added to the DNS | |||
| Global Scoped Entry Registry: | "Underscored and Globally Scoped DNS Node Names" registry: | |||
| +=========+============+=================+=================+ | +=========+============+===========+ | |||
| | RR TYPE | _NODE NAME | Meaning | Reference | | | RR Type | _NODE NAME | Reference | | |||
| +=========+============+=================+=================+ | +=========+============+===========+ | |||
| | HTTPS | _https | HTTPS SVCB info | (This document) | | | HTTPS | _https | RFC 9460 | | |||
| +---------+------------+-----------------+-----------------+ | +---------+------------+-----------+ | |||
| Table 2 | Table 2 | |||
| 15. Acknowledgments and Related Proposals | 15. References | |||
| There have been a wide range of proposed solutions over the years to | ||||
| the "CNAME at the Zone Apex" challenge proposed. These include | ||||
| [I-D.bellis-dnsop-http-record], [I-D.ietf-dnsop-aname], and others. | ||||
| Thank you to Ian Swett, Ralf Weber, Jon Reed, Martin Thomson, Lucas | ||||
| Pardue, Ilari Liusvaara, Tim Wicinski, Tommy Pauly, Chris Wood, David | ||||
| Benjamin, Mark Andrews, Emily Stark, Eric Orth, Kyle Rose, Craig | ||||
| Taylor, Dan McArdle, Brian Dickson, Willem Toorop, Pieter Lexis, | ||||
| Puneet Sood, Olivier Poitrey, Mashooq Muhaimen, Tom Carpay, and many | ||||
| others for their feedback and suggestions on this draft. | ||||
| 16. References | ||||
| 16.1. Normative References | 15.1. Normative References | |||
| [ALPN] Friedl, S., Popov, A., Langley, A., and E. Stephan, | [ALPN] Friedl, S., Popov, A., Langley, A., and E. Stephan, | |||
| "Transport Layer Security (TLS) Application-Layer Protocol | "Transport Layer Security (TLS) Application-Layer Protocol | |||
| Negotiation Extension", RFC 7301, DOI 10.17487/RFC7301, | Negotiation Extension", RFC 7301, DOI 10.17487/RFC7301, | |||
| July 2014, <https://www.rfc-editor.org/rfc/rfc7301>. | July 2014, <https://www.rfc-editor.org/info/rfc7301>. | |||
| [Attrleaf] Crocker, D., "Scoped Interpretation of DNS Resource | [Attrleaf] Crocker, D., "Scoped Interpretation of DNS Resource | |||
| Records through "Underscored" Naming of Attribute Leaves", | Records through "Underscored" Naming of Attribute Leaves", | |||
| BCP 222, RFC 8552, DOI 10.17487/RFC8552, March 2019, | BCP 222, RFC 8552, DOI 10.17487/RFC8552, March 2019, | |||
| <https://www.rfc-editor.org/rfc/rfc8552>. | <https://www.rfc-editor.org/info/rfc8552>. | |||
| [DoH] Hoffman, P. and P. McManus, "DNS Queries over HTTPS | [DoH] Hoffman, P. and P. McManus, "DNS Queries over HTTPS | |||
| (DoH)", RFC 8484, DOI 10.17487/RFC8484, October 2018, | (DoH)", RFC 8484, DOI 10.17487/RFC8484, October 2018, | |||
| <https://www.rfc-editor.org/rfc/rfc8484>. | <https://www.rfc-editor.org/info/rfc8484>. | |||
| [DoT] Hu, Z., Zhu, L., Heidemann, J., Mankin, A., Wessels, D., | [DoT] Hu, Z., Zhu, L., Heidemann, J., Mankin, A., Wessels, D., | |||
| and P. Hoffman, "Specification for DNS over Transport | and P. Hoffman, "Specification for DNS over Transport | |||
| Layer Security (TLS)", RFC 7858, DOI 10.17487/RFC7858, May | Layer Security (TLS)", RFC 7858, DOI 10.17487/RFC7858, May | |||
| 2016, <https://www.rfc-editor.org/rfc/rfc7858>. | 2016, <https://www.rfc-editor.org/info/rfc7858>. | |||
| [HappyEyeballsV2] | [HappyEyeballsV2] | |||
| Schinazi, D. and T. Pauly, "Happy Eyeballs Version 2: | Schinazi, D. and T. Pauly, "Happy Eyeballs Version 2: | |||
| Better Connectivity Using Concurrency", RFC 8305, | Better Connectivity Using Concurrency", RFC 8305, | |||
| DOI 10.17487/RFC8305, December 2017, | DOI 10.17487/RFC8305, December 2017, | |||
| <https://www.rfc-editor.org/rfc/rfc8305>. | <https://www.rfc-editor.org/info/rfc8305>. | |||
| [HTTP] Fielding, R. T., Nottingham, M., and J. Reschke, "HTTP | [HTTP] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | |||
| Semantics", Work in Progress, Internet-Draft, draft-ietf- | Ed., "HTTP Semantics", STD 97, RFC 9110, | |||
| httpbis-semantics-19, 12 September 2021, | DOI 10.17487/RFC9110, June 2022, | |||
| <https://datatracker.ietf.org/doc/html/draft-ietf-httpbis- | <https://www.rfc-editor.org/info/rfc9110>. | |||
| semantics-19>. | ||||
| [RFC1034] Mockapetris, P., "Domain names - concepts and facilities", | [RFC1034] Mockapetris, P., "Domain names - concepts and facilities", | |||
| STD 13, RFC 1034, DOI 10.17487/RFC1034, November 1987, | STD 13, RFC 1034, DOI 10.17487/RFC1034, November 1987, | |||
| <https://www.rfc-editor.org/rfc/rfc1034>. | <https://www.rfc-editor.org/info/rfc1034>. | |||
| [RFC1035] Mockapetris, P., "Domain names - implementation and | [RFC1035] Mockapetris, P., "Domain names - implementation and | |||
| specification", STD 13, RFC 1035, DOI 10.17487/RFC1035, | specification", STD 13, RFC 1035, DOI 10.17487/RFC1035, | |||
| November 1987, <https://www.rfc-editor.org/rfc/rfc1035>. | November 1987, <https://www.rfc-editor.org/info/rfc1035>. | |||
| [RFC1928] Leech, M., Ganis, M., Lee, Y., Kuris, R., Koblas, D., and | [RFC1928] Leech, M., Ganis, M., Lee, Y., Kuris, R., Koblas, D., and | |||
| L. Jones, "SOCKS Protocol Version 5", RFC 1928, | L. Jones, "SOCKS Protocol Version 5", RFC 1928, | |||
| DOI 10.17487/RFC1928, March 1996, | DOI 10.17487/RFC1928, March 1996, | |||
| <https://www.rfc-editor.org/rfc/rfc1928>. | <https://www.rfc-editor.org/info/rfc1928>. | |||
| [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
| Requirement Levels", BCP 14, RFC 2119, | Requirement Levels", BCP 14, RFC 2119, | |||
| DOI 10.17487/RFC2119, March 1997, | DOI 10.17487/RFC2119, March 1997, | |||
| <https://www.rfc-editor.org/rfc/rfc2119>. | <https://www.rfc-editor.org/info/rfc2119>. | |||
| [RFC2181] Elz, R. and R. Bush, "Clarifications to the DNS | [RFC2181] Elz, R. and R. Bush, "Clarifications to the DNS | |||
| Specification", RFC 2181, DOI 10.17487/RFC2181, July 1997, | Specification", RFC 2181, DOI 10.17487/RFC2181, July 1997, | |||
| <https://www.rfc-editor.org/rfc/rfc2181>. | <https://www.rfc-editor.org/info/rfc2181>. | |||
| [RFC3225] Conrad, D., "Indicating Resolver Support of DNSSEC", | [RFC3225] Conrad, D., "Indicating Resolver Support of DNSSEC", | |||
| RFC 3225, DOI 10.17487/RFC3225, December 2001, | RFC 3225, DOI 10.17487/RFC3225, December 2001, | |||
| <https://www.rfc-editor.org/rfc/rfc3225>. | <https://www.rfc-editor.org/info/rfc3225>. | |||
| [RFC3597] Gustafsson, A., "Handling of Unknown DNS Resource Record | [RFC3597] Gustafsson, A., "Handling of Unknown DNS Resource Record | |||
| (RR) Types", RFC 3597, DOI 10.17487/RFC3597, September | (RR) Types", RFC 3597, DOI 10.17487/RFC3597, September | |||
| 2003, <https://www.rfc-editor.org/rfc/rfc3597>. | 2003, <https://www.rfc-editor.org/info/rfc3597>. | |||
| [RFC4001] Daniele, M., Haberman, B., Routhier, S., and J. | [RFC4001] Daniele, M., Haberman, B., Routhier, S., and J. | |||
| Schoenwaelder, "Textual Conventions for Internet Network | Schoenwaelder, "Textual Conventions for Internet Network | |||
| Addresses", RFC 4001, DOI 10.17487/RFC4001, February 2005, | Addresses", RFC 4001, DOI 10.17487/RFC4001, February 2005, | |||
| <https://www.rfc-editor.org/rfc/rfc4001>. | <https://www.rfc-editor.org/info/rfc4001>. | |||
| [RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax | [RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax | |||
| Specifications: ABNF", STD 68, RFC 5234, | Specifications: ABNF", STD 68, RFC 5234, | |||
| DOI 10.17487/RFC5234, January 2008, | DOI 10.17487/RFC5234, January 2008, | |||
| <https://www.rfc-editor.org/rfc/rfc5234>. | <https://www.rfc-editor.org/info/rfc5234>. | |||
| [RFC5952] Kawamura, S. and M. Kawashima, "A Recommendation for IPv6 | [RFC5952] Kawamura, S. and M. Kawashima, "A Recommendation for IPv6 | |||
| Address Text Representation", RFC 5952, | Address Text Representation", RFC 5952, | |||
| DOI 10.17487/RFC5952, August 2010, | DOI 10.17487/RFC5952, August 2010, | |||
| <https://www.rfc-editor.org/rfc/rfc5952>. | <https://www.rfc-editor.org/info/rfc5952>. | |||
| [RFC6066] Eastlake 3rd, D., "Transport Layer Security (TLS) | [RFC6066] Eastlake 3rd, D., "Transport Layer Security (TLS) | |||
| Extensions: Extension Definitions", RFC 6066, | Extensions: Extension Definitions", RFC 6066, | |||
| DOI 10.17487/RFC6066, January 2011, | DOI 10.17487/RFC6066, January 2011, | |||
| <https://www.rfc-editor.org/rfc/rfc6066>. | <https://www.rfc-editor.org/info/rfc6066>. | |||
| [RFC6147] Bagnulo, M., Sullivan, A., Matthews, P., and I. van | [RFC6147] Bagnulo, M., Sullivan, A., Matthews, P., and I. van | |||
| Beijnum, "DNS64: DNS Extensions for Network Address | Beijnum, "DNS64: DNS Extensions for Network Address | |||
| Translation from IPv6 Clients to IPv4 Servers", RFC 6147, | Translation from IPv6 Clients to IPv4 Servers", RFC 6147, | |||
| DOI 10.17487/RFC6147, April 2011, | DOI 10.17487/RFC6147, April 2011, | |||
| <https://www.rfc-editor.org/rfc/rfc6147>. | <https://www.rfc-editor.org/info/rfc6147>. | |||
| [RFC7050] Savolainen, T., Korhonen, J., and D. Wing, "Discovery of | [RFC7050] Savolainen, T., Korhonen, J., and D. Wing, "Discovery of | |||
| the IPv6 Prefix Used for IPv6 Address Synthesis", | the IPv6 Prefix Used for IPv6 Address Synthesis", | |||
| RFC 7050, DOI 10.17487/RFC7050, November 2013, | RFC 7050, DOI 10.17487/RFC7050, November 2013, | |||
| <https://www.rfc-editor.org/rfc/rfc7050>. | <https://www.rfc-editor.org/info/rfc7050>. | |||
| [RFC7231] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | [RFC7231] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | |||
| Protocol (HTTP/1.1): Semantics and Content", RFC 7231, | Protocol (HTTP/1.1): Semantics and Content", RFC 7231, | |||
| DOI 10.17487/RFC7231, June 2014, | DOI 10.17487/RFC7231, June 2014, | |||
| <https://www.rfc-editor.org/rfc/rfc7231>. | <https://www.rfc-editor.org/info/rfc7231>. | |||
| [RFC7595] Thaler, D., Ed., Hansen, T., and T. Hardie, "Guidelines | [RFC7595] Thaler, D., Ed., Hansen, T., and T. Hardie, "Guidelines | |||
| and Registration Procedures for URI Schemes", BCP 35, | and Registration Procedures for URI Schemes", BCP 35, | |||
| RFC 7595, DOI 10.17487/RFC7595, June 2015, | RFC 7595, DOI 10.17487/RFC7595, June 2015, | |||
| <https://www.rfc-editor.org/rfc/rfc7595>. | <https://www.rfc-editor.org/info/rfc7595>. | |||
| [RFC7871] Contavalli, C., van der Gaast, W., Lawrence, D., and W. | [RFC7871] Contavalli, C., van der Gaast, W., Lawrence, D., and W. | |||
| Kumari, "Client Subnet in DNS Queries", RFC 7871, | Kumari, "Client Subnet in DNS Queries", RFC 7871, | |||
| DOI 10.17487/RFC7871, May 2016, | DOI 10.17487/RFC7871, May 2016, | |||
| <https://www.rfc-editor.org/rfc/rfc7871>. | <https://www.rfc-editor.org/info/rfc7871>. | |||
| [RFC8126] Cotton, M., Leiba, B., and T. Narten, "Guidelines for | [RFC8126] Cotton, M., Leiba, B., and T. Narten, "Guidelines for | |||
| Writing an IANA Considerations Section in RFCs", BCP 26, | Writing an IANA Considerations Section in RFCs", BCP 26, | |||
| RFC 8126, DOI 10.17487/RFC8126, June 2017, | RFC 8126, DOI 10.17487/RFC8126, June 2017, | |||
| <https://www.rfc-editor.org/rfc/rfc8126>. | <https://www.rfc-editor.org/info/rfc8126>. | |||
| [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | |||
| 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | |||
| May 2017, <https://www.rfc-editor.org/rfc/rfc8174>. | May 2017, <https://www.rfc-editor.org/info/rfc8174>. | |||
| [RFC8446] Rescorla, E., "The Transport Layer Security (TLS) Protocol | [RFC8446] Rescorla, E., "The Transport Layer Security (TLS) Protocol | |||
| Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, | Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, | |||
| <https://www.rfc-editor.org/rfc/rfc8446>. | <https://www.rfc-editor.org/info/rfc8446>. | |||
| [WebSocket] | [WebSocket] | |||
| Fette, I. and A. Melnikov, "The WebSocket Protocol", | Fette, I. and A. Melnikov, "The WebSocket Protocol", | |||
| RFC 6455, DOI 10.17487/RFC6455, December 2011, | RFC 6455, DOI 10.17487/RFC6455, December 2011, | |||
| <https://www.rfc-editor.org/rfc/rfc6455>. | <https://www.rfc-editor.org/info/rfc6455>. | |||
| 16.2. Informative References | 15.2. Informative References | |||
| [AltSvc] Nottingham, M., McManus, P., and J. Reschke, "HTTP | [AltSvc] Nottingham, M., McManus, P., and J. Reschke, "HTTP | |||
| Alternative Services", RFC 7838, DOI 10.17487/RFC7838, | Alternative Services", RFC 7838, DOI 10.17487/RFC7838, | |||
| April 2016, <https://www.rfc-editor.org/rfc/rfc7838>. | April 2016, <https://www.rfc-editor.org/info/rfc7838>. | |||
| [ANAME-DNS-RR] | ||||
| Finch, T., Hunt, E., van Dijk, P., Eden, A., and W. | ||||
| Mekking, "Address-specific DNS aliases (ANAME)", Work in | ||||
| Progress, Internet-Draft, draft-ietf-dnsop-aname-04, 8 | ||||
| July 2019, <https://datatracker.ietf.org/doc/html/draft- | ||||
| ietf-dnsop-aname-04>. | ||||
| [BIND-CHECK-NAMES] | ||||
| Internet Systems Consortium, "BIND v9.19.11 Configuration | ||||
| Reference: "check-names"", September 2023, | ||||
| <https://bind9.readthedocs.io/en/v9.19.11/ | ||||
| reference.html#namedconf-statement-check-names>. | ||||
| [DNAME] Rose, S. and W. Wijngaards, "DNAME Redirection in the | [DNAME] Rose, S. and W. Wijngaards, "DNAME Redirection in the | |||
| DNS", RFC 6672, DOI 10.17487/RFC6672, June 2012, | DNS", RFC 6672, DOI 10.17487/RFC6672, June 2012, | |||
| <https://www.rfc-editor.org/rfc/rfc6672>. | <https://www.rfc-editor.org/info/rfc6672>. | |||
| [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/rfc/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-15, 3 October 2022, | 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-15>. | esni-17>. | |||
| [FETCH] "Fetch Living Standard", May 2020, | [FETCH] WHATWG, "Fetch Living Standard", October 2023, | |||
| <https://fetch.spec.whatwg.org/>. | <https://fetch.spec.whatwg.org/>. | |||
| [FETCH-WEBSOCKETS] | ||||
| WHATWG, "WebSockets Living Standard", September 2023, | ||||
| <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/rfc/rfc6797>. | <https://www.rfc-editor.org/info/rfc6797>. | |||
| [HTTP3] Bishop, M., "HTTP/3", Work in Progress, Internet-Draft, | ||||
| draft-ietf-quic-http-34, 2 February 2021, | ||||
| <https://datatracker.ietf.org/doc/html/draft-ietf-quic- | ||||
| http-34>. | ||||
| [I-D.bellis-dnsop-http-record] | [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- | |||
| 00, 3 November 2018, | 00, 3 November 2018, | |||
| <https://datatracker.ietf.org/doc/html/draft-bellis-dnsop- | <https://datatracker.ietf.org/doc/html/draft-bellis-dnsop- | |||
| http-record-00>. | http-record-00>. | |||
| [I-D.ietf-dnsop-aname] | [HTTP/3] Bishop, M., Ed., "HTTP/3", RFC 9114, DOI 10.17487/RFC9114, | |||
| Finch, T., Hunt, E., van Dijk, P., Eden, A., and W. M. | June 2022, <https://www.rfc-editor.org/info/rfc9114>. | |||
| Mekking, "Address-specific DNS aliases (ANAME)", Work in | ||||
| Progress, Internet-Draft, draft-ietf-dnsop-aname-04, 8 | ||||
| July 2019, <https://datatracker.ietf.org/doc/html/draft- | ||||
| ietf-dnsop-aname-04>. | ||||
| [RFC1912] Barr, D., "Common DNS Operational and Configuration | [RFC1912] Barr, D., "Common DNS Operational and Configuration | |||
| Errors", RFC 1912, DOI 10.17487/RFC1912, February 1996, | Errors", RFC 1912, DOI 10.17487/RFC1912, February 1996, | |||
| <https://www.rfc-editor.org/rfc/rfc1912>. | <https://www.rfc-editor.org/info/rfc1912>. | |||
| [RFC6454] Barth, A., "The Web Origin Concept", RFC 6454, | [RFC6454] Barth, A., "The Web Origin Concept", RFC 6454, | |||
| DOI 10.17487/RFC6454, December 2011, | DOI 10.17487/RFC6454, December 2011, | |||
| <https://www.rfc-editor.org/rfc/rfc6454>. | <https://www.rfc-editor.org/info/rfc6454>. | |||
| [SRV] Gulbrandsen, A., Vixie, P., and L. Esibov, "A DNS RR for | [SRV] Gulbrandsen, A., Vixie, P., and L. Esibov, "A DNS RR for | |||
| specifying the location of services (DNS SRV)", RFC 2782, | specifying the location of services (DNS SRV)", RFC 2782, | |||
| DOI 10.17487/RFC2782, February 2000, | DOI 10.17487/RFC2782, February 2000, | |||
| <https://www.rfc-editor.org/rfc/rfc2782>. | <https://www.rfc-editor.org/info/rfc2782>. | |||
| [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/rfc/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. The | in basic ASCII text, using various delimiters and encodings, | |||
| algorithm for decoding these character-strings is defined in | according to an algorithm defined in Section 5.1 of [RFC1035]. The | |||
| Section 5.1 of [RFC1035]. Here we summarize the allowed input to | following summarizes some allowed inputs to that algorithm, using | |||
| that algorithm, using ABNF: | 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 ) | |||
| quoted = DQUOTE *( contiguous / ( ["\"] WSP ) ) DQUOTE | quoted = DQUOTE *( contiguous / ( ["\"] WSP ) ) DQUOTE | |||
| char-string = contiguous / quoted | char-string = contiguous / quoted | |||
| The decoding algorithm allows char-string to represent any *OCTET, | The decoding algorithm allows char-string to represent any *OCTET, | |||
| using quoting to group values (e.g., those with internal whitespace), | using quoting to group values (e.g., those with internal whitespace), | |||
| and escaping to represent each non-printable octet as a single | and escaping to represent each non-printable octet as a single | |||
| escaped sequence. In this document, this algorithm is referred to as | escaped sequence. In this document, this algorithm is referred to as | |||
| "character-string decoding". The algorithm is the same as used by | "character-string decoding", because Section 5.1 of [RFC1035] uses | |||
| <character-string> in RFC 1035, although the output length in this | this algorithm to produce a <character-string>. Note that while the | |||
| document is not limited to 255 octets. | length of a <character-string> is limited to 255 octets, the | |||
| character-string decoding algorithm can produce output of any length. | ||||
| A.1. Decoding a comma-separated list | A.1. Decoding a Comma-Separated List | |||
| In order to represent lists of items in zone files, this | In order to represent lists of items in zone files, this | |||
| specification uses comma-separated lists. When the allowed items in | specification uses comma-separated lists. When the allowed items in | |||
| the list cannot contain "," or "\", this is trivial. (For | the list cannot contain "," or "\", this is trivial. (For | |||
| simplicity, empty items are not allowed.) A value-list parser that | simplicity, empty items are not allowed.) A value-list parser that | |||
| splits on "," and prohibits items containing "\" is sufficient to | splits on "," and prohibits items containing "\" is sufficient to | |||
| comply with all requirements in this document. This corresponds to | comply with all requirements in this document. This corresponds to | |||
| the simple-comma-separated syntax: | the simple-comma-separated syntax: | |||
| ; item-allowed is OCTET minus "," and "\". | ; item-allowed is OCTET minus "," and "\". | |||
| skipping to change at page 47, line 4 ¶ | skipping to change at line 2092 ¶ | |||
| item = 1*OCTET | item = 1*OCTET | |||
| escaped-item = 1*(item-allowed / "\," / "\\") | escaped-item = 1*(item-allowed / "\," / "\\") | |||
| comma-separated = [escaped-item *("," escaped-item)] | comma-separated = [escaped-item *("," escaped-item)] | |||
| Decoding of value-lists happens after character-string decoding. For | Decoding of value-lists happens after character-string decoding. For | |||
| example, consider these char-string SvcParamValues: | example, consider these char-string SvcParamValues: | |||
| "part1,part2,part3\\,part4\\\\" | "part1,part2,part3\\,part4\\\\" | |||
| part1\,\p\a\r\t2\044part3\092,part4\092\\ | part1\,\p\a\r\t2\044part3\092,part4\092\\ | |||
| These inputs are equivalent: character-string decoding either of them | These inputs are equivalent: character-string decoding either of them | |||
| would produce the same value: | would produce the same value: | |||
| part1,part2,part3\,part4\\ | part1,part2,part3\,part4\\ | |||
| Applying comma-separated list decoding to this value would produce a | Applying comma-separated list decoding to this value would produce a | |||
| list of three items: | list of three items: | |||
| part1 | part1 | |||
| part2 | part2 | |||
| part3,part4\ | part3,part4\ | |||
| Appendix B. HTTP Mapping Summary | Appendix B. HTTP Mapping Summary | |||
| This table serves as a non-normative summary of the HTTP mapping for | This table serves as a non-normative summary of the HTTP mapping for | |||
| SVCB (Section 9). Future protocol mappings may provide a similar | SVCB (Section 9). Future protocol mappings may provide a similar | |||
| summary table. | summary table. | |||
| +==========================+======================+ | +--------------------------+----------------------+ | |||
| +==========================+======================+ | ||||
| | *Mapped scheme* | "https" | | | *Mapped scheme* | "https" | | |||
| +--------------------------+----------------------+ | +--------------------------+----------------------+ | |||
| | *Other affected schemes* | "http", "wss", "ws", | | | *Other affected schemes* | "http", "wss", "ws", | | |||
| | | (other HTTP-based) | | | | (other HTTP-based) | | |||
| +--------------------------+----------------------+ | +--------------------------+----------------------+ | |||
| | *RR type* | HTTPS (65) | | | *RR type* | HTTPS (65) | | |||
| +--------------------------+----------------------+ | +--------------------------+----------------------+ | |||
| | *Name prefix* | None for port 443, | | | *Name prefix* | None for port 443, | | |||
| | | else _$PORT._https | | | | else _$PORT._https | | |||
| +--------------------------+----------------------+ | +--------------------------+----------------------+ | |||
| | *Automatically Mandatory | port, no-default- | | | *Automatically mandatory | port, no-default- | | |||
| | Keys* | alpn | | | keys* | alpn | | |||
| +--------------------------+----------------------+ | +--------------------------+----------------------+ | |||
| | *SvcParam defaults* | alpn: ["http/1.1"] | | | *SvcParam defaults* | alpn: ["http/1.1"] | | |||
| +--------------------------+----------------------+ | +--------------------------+----------------------+ | |||
| | *Special behaviors* | HTTP to HTTPS | | | *Special behaviors* | Upgrade from HTTP to | | |||
| | | upgrade | | | | HTTPS | | |||
| +--------------------------+----------------------+ | +--------------------------+----------------------+ | |||
| | *Keys that records must | None | | | *Keys that records must | None | | |||
| | 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. A complaint with all of | some existing record types and proposals. One complaint regarding | |||
| the alternatives is that web clients have seemed unenthusiastic about | all of the alternatives is that web clients have seemed | |||
| implementing them. The hope here is that by providing an extensible | unenthusiastic about implementing them. The hope here is that an | |||
| solution that solves multiple problems we will overcome the inertia | extensible solution that solves multiple problems will overcome this | |||
| and have a path to achieve client implementation. | inertia and have a path to achieve client implementation. | |||
| C.1. Differences from the SRV RR type | C.1. Differences from the SRV RR Type | |||
| An SRV record [SRV] can perform a similar function to the SVCB | An SRV record [SRV] can perform a function similar to that of the | |||
| 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. | |||
| * SRV records cannot instruct the client to switch or upgrade | * SRV records cannot instruct the client to switch or upgrade | |||
| protocols, whereas SVCB can signal such an upgrade (e.g. to | protocols, whereas SVCB can signal such an upgrade (e.g., to | |||
| HTTP/2). | HTTP/2). | |||
| * SRV records are not extensible, whereas SVCB and HTTPS RRs can be | * SRV records are not extensible, whereas SVCB and HTTPS RRs can be | |||
| extended with new parameters. | extended with new parameters. | |||
| * SRV records specify a "weight" for unbalanced randomized load- | * SRV records specify a "weight" for unbalanced randomized load | |||
| balancing. SVCB only supports balanced randomized load-balancing, | balancing. SVCB only supports balanced randomized load balancing, | |||
| although weights could be added via a future SvcParam. | although weights could be added via a future SvcParam. | |||
| C.2. Differences from the proposed HTTP record | C.2. Differences from the Proposed HTTP Record | |||
| Unlike [I-D.bellis-dnsop-http-record], this approach is extensible to | Unlike [HTTP-DNS-RR], this approach is extensible to cover Alt-Svc | |||
| cover Alt-Svc and Encrypted ClientHello use-cases. Like that | and Encrypted ClientHello use cases. Like that proposal, this | |||
| proposal, this addresses the zone apex CNAME challenge. | addresses the zone-apex CNAME challenge. | |||
| Like that proposal, it remains necessary to continue to include | Like that proposal, it remains necessary to continue to include | |||
| address records at the zone apex for legacy clients. | address records at the zone apex for legacy clients. | |||
| C.3. Differences from the proposed ANAME record | C.3. Differences from the Proposed ANAME Record | |||
| Unlike [I-D.ietf-dnsop-aname], this approach is extensible to cover | Unlike [ANAME-DNS-RR], this approach is extensible to cover Alt-Svc | |||
| Alt-Svc and ECH use-cases. This approach also does not require any | and Encrypted ClientHello use cases. This approach also does not | |||
| changes or special handling on either authoritative or primary | require any changes or special handling on either authoritative or | |||
| servers, beyond optionally returning in-bailiwick additional records. | primary servers, beyond optionally returning in-bailiwick additional | |||
| records. | ||||
| Like that proposal, this addresses the zone apex CNAME challenge for | Like that proposal, this addresses the zone-apex CNAME challenge for | |||
| clients that implement this. | clients that implement this. | |||
| However, with this SVCB proposal, it remains necessary to continue to | However, with this SVCB proposal, it remains necessary to continue to | |||
| include address records at the zone apex for legacy clients. If | include address records at the zone apex for legacy clients. If | |||
| deployment of this standard is successful, the number of legacy | deployment of this standard is successful, the number of legacy | |||
| clients will fall over time. As the number of legacy clients | clients will fall over time. As the number of legacy clients | |||
| declines, the operational effort required to serve these users | declines, the operational effort required to serve these users | |||
| without the benefit of SVCB indirection should fall. Server | without the benefit of SVCB indirection should fall. Server | |||
| operators can easily observe how much traffic reaches this legacy | operators can easily observe how much traffic reaches this legacy | |||
| endpoint, and may remove the apex's address records if the observed | endpoint and may remove the apex's address records if the observed | |||
| legacy traffic has fallen to negligible levels. | legacy traffic has fallen to negligible levels. | |||
| C.4. Comparison with separate RR types for AliasMode and ServiceMode | C.4. Comparison with Separate RR Types for AliasMode and ServiceMode | |||
| Abstractly, functions of AliasMode and ServiceMode are independent, | Abstractly, functions of AliasMode and ServiceMode are independent, | |||
| so it might be tempting to specify them as separate RR types. | so it might be tempting to specify them as separate RR types. | |||
| However, this would result in a serious performance impairment, | However, this would result in serious performance impairment, because | |||
| because clients cannot rely on their recursive resolver to follow | clients cannot rely on their recursive resolver to follow SVCB | |||
| SVCB aliases (unlike CNAME). Thus, clients would have to issue | aliases (unlike CNAME). Thus, clients would have to issue queries | |||
| queries for both RR types in parallel, potentially at each step of | for both RR types in parallel, potentially at each step of the alias | |||
| the alias chain. Recursive resolvers that implement the | chain. Recursive resolvers that implement the specification would, | |||
| specification would, upon receipt of a ServiceMode query, emit both a | upon receipt of a ServiceMode query, emit both a ServiceMode query | |||
| ServiceMode and an AliasMode query to the authoritative. Thus, | and an AliasMode query to the authoritative DNS server. Thus, | |||
| splitting the RR type would double, or in some cases triple, the load | splitting the RR type would double, or in some cases triple, the load | |||
| on clients and servers, and would not reduce implementation | on clients and servers, and would not reduce implementation | |||
| complexity. | complexity. | |||
| Appendix D. Test vectors | Appendix D. Test Vectors | |||
| These test vectors only contain the RDATA portion of SVCB/HTTPS | These test vectors only contain the RDATA portion of SVCB/HTTPS | |||
| records in presentation format, generic format ([RFC3597]) and wire | records in presentation format, generic format [RFC3597], and wire | |||
| format. The wire format uses hexadecimal (\xNN) for each non-ascii | format. The wire format uses hexadecimal (\xNN) for each non-ASCII | |||
| byte. As the wireformat is long, it is broken into several lines. | byte. As the wire format is long, it is broken into several lines. | |||
| D.1. AliasMode | D.1. AliasMode | |||
| example.com. HTTPS 0 foo.example.com. | example.com. HTTPS 0 foo.example.com. | |||
| \# 19 ( | \# 19 ( | |||
| 00 00 ; priority | 00 00 ; priority | |||
| 03 66 6f 6f 07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 ; target | 03 66 6f 6f 07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 ; target | |||
| ) | ) | |||
| skipping to change at page 50, line 4 ¶ | skipping to change at line 2232 ¶ | |||
| 00 00 ; priority | 00 00 ; priority | |||
| 03 66 6f 6f 07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 ; target | 03 66 6f 6f 07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 ; target | |||
| ) | ) | |||
| \x00\x00 # priority | \x00\x00 # priority | |||
| \x03foo\x07example\x03com\x00 # target | \x03foo\x07example\x03com\x00 # target | |||
| Figure 2: AliasMode | Figure 2: AliasMode | |||
| D.2. ServiceMode | D.2. ServiceMode | |||
| example.com. SVCB 1 . | example.com. SVCB 1 . | |||
| \# 3 ( | \# 3 ( | |||
| 00 01 ; priority | 00 01 ; priority | |||
| 00 ; target (root label) | 00 ; target (root label) | |||
| ) | ) | |||
| \x00\x01 # priority | \x00\x01 # priority | |||
| \x00 # target, root label | \x00 # target (root label) | |||
| Figure 3: TargetName is "." | Figure 3: TargetName Is "." | |||
| example.com. SVCB 16 foo.example.com. port=53 | example.com. SVCB 16 foo.example.com. port=53 | |||
| \# 25 ( | \# 25 ( | |||
| 00 10 ; priority | 00 10 ; priority | |||
| 03 66 6f 6f 07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 ; target | 03 66 6f 6f 07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 ; target | |||
| 00 03 ; key 3 | 00 03 ; key 3 | |||
| 00 02 ; length 2 | 00 02 ; length 2 | |||
| 00 35 ; value | 00 35 ; value | |||
| ) | ) | |||
| \x00\x10 # priority | \x00\x10 # priority | |||
| \x03foo\x07example\x03com\x00 # target | \x03foo\x07example\x03com\x00 # target | |||
| \x00\x03 # key 3 | \x00\x03 # key 3 | |||
| \x00\x02 # length: 2 bytes | \x00\x02 # length 2 | |||
| \x00\x35 # value | \x00\x35 # value | |||
| Figure 4: Specifies a port | Figure 4: Specifies a Port | |||
| example.com. SVCB 1 foo.example.com. key667=hello | example.com. SVCB 1 foo.example.com. key667=hello | |||
| \# 28 ( | \# 28 ( | |||
| 00 01 ; priority | 00 01 ; priority | |||
| 03 66 6f 6f 07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 ; target | 03 66 6f 6f 07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 ; target | |||
| 02 9b ; key 667 | 02 9b ; key 667 | |||
| 00 05 ; length 5 | 00 05 ; length 5 | |||
| 68 65 6c 6c 6f ; value | 68 65 6c 6c 6f ; value | |||
| ) | ) | |||
| \x00\x01 # priority | \x00\x01 # priority | |||
| \x03foo\x07example\x03com\x00 # target | \x03foo\x07example\x03com\x00 # target | |||
| \x02\x9b # key 667 | \x02\x9b # key 667 | |||
| \x00\x05 # length 5 | \x00\x05 # length 5 | |||
| hello # value | hello # value | |||
| Figure 5: A generic key and unquoted value | Figure 5: A Generic Key and Unquoted Value | |||
| example.com. SVCB 1 foo.example.com. key667="hello\210qoo" | example.com. SVCB 1 foo.example.com. key667="hello\210qoo" | |||
| \# 32 ( | \# 32 ( | |||
| 00 01 ; priority | 00 01 ; priority | |||
| 03 66 6f 6f 07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 ; target | 03 66 6f 6f 07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 ; target | |||
| 02 9b ; key 667 | 02 9b ; key 667 | |||
| 00 09 ; length 9 | 00 09 ; length 9 | |||
| 68 65 6c 6c 6f d2 71 6f 6f ; value | 68 65 6c 6c 6f d2 71 6f 6f ; value | |||
| ) | ) | |||
| \x00\x01 # priority | \x00\x01 # priority | |||
| \x03foo\x07example\x03com\x00 # target | \x03foo\x07example\x03com\x00 # target | |||
| \x02\x9b # key 667 | \x02\x9b # key 667 | |||
| \x00\x09 # length 9 | \x00\x09 # length 9 | |||
| hello\xd2qoo # value | hello\xd2qoo # value | |||
| Figure 6: A generic key and quoted value with a decimal escape | Figure 6: A Generic Key and Quoted Value with a Decimal Escape | |||
| example.com. SVCB 1 foo.example.com. ( | example.com. SVCB 1 foo.example.com. ( | |||
| ipv6hint="2001:db8::1,2001:db8::53:1" | ipv6hint="2001:db8::1,2001:db8::53:1" | |||
| ) | ) | |||
| \# 55 ( | \# 55 ( | |||
| 00 01 ; priority | 00 01 ; priority | |||
| 03 66 6f 6f 07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 ; target | 03 66 6f 6f 07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 ; target | |||
| 00 06 ; key 6 | 00 06 ; key 6 | |||
| 00 20 ; length 32 | 00 20 ; length 32 | |||
| skipping to change at page 51, line 45 ¶ | skipping to change at line 2321 ¶ | |||
| \x00\x01 # priority | \x00\x01 # priority | |||
| \x03foo\x07example\x03com\x00 # target | \x03foo\x07example\x03com\x00 # target | |||
| \x00\x06 # key 6 | \x00\x06 # key 6 | |||
| \x00\x20 # length 32 | \x00\x20 # length 32 | |||
| \x20\x01\x0d\xb8\x00\x00\x00\x00 | \x20\x01\x0d\xb8\x00\x00\x00\x00 | |||
| \x00\x00\x00\x00\x00\x00\x00\x01 # first address | \x00\x00\x00\x00\x00\x00\x00\x01 # first address | |||
| \x20\x01\x0d\xb8\x00\x00\x00\x00 | \x20\x01\x0d\xb8\x00\x00\x00\x00 | |||
| \x00\x00\x00\x00\x00\x53\x00\x01 # second address | \x00\x00\x00\x00\x00\x53\x00\x01 # second address | |||
| Figure 7: Two quoted IPv6 hints | Figure 7: Two Quoted IPv6 Hints | |||
| example.com. SVCB 1 example.com. ipv6hint="2001:db8:122:344::192.0.2.33" | ||||
| \# 35 ( | example.com. SVCB 1 example.com. ( | |||
| 00 01 ; priority | ipv6hint="2001:db8:122:344::192.0.2.33" | |||
| 07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 ; target | ) | |||
| 00 06 ; key 6 | \# 35 ( | |||
| 00 10 ; length 16 | 00 01 ; priority | |||
| 20 01 0d b8 01 22 03 44 00 00 00 00 c0 00 02 21 ; address | 07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 ; target | |||
| ) | 00 06 ; key 6 | |||
| 00 10 ; length 16 | ||||
| 20 01 0d b8 01 22 03 44 00 00 00 00 c0 00 02 21 ; address | ||||
| ) | ||||
| \x00\x01 # priority | \x00\x01 # priority | |||
| \x07example\x03com\x00 # target | \x07example\x03com\x00 # target | |||
| \x00\x06 # key 6 | \x00\x06 # key 6 | |||
| \x00\x10 # length 16 | \x00\x10 # length 16 | |||
| \x20\x01\x0d\xb8\x01\x22\x03\x44 | \x20\x01\x0d\xb8\x01\x22\x03\x44 | |||
| \x00\x00\x00\x00\xc0\x00\x02\x21 # address | \x00\x00\x00\x00\xc0\x00\x02\x21 # address | |||
| Figure 8: An IPv6 hint using the embedded IPv4 syntax | Figure 8: An IPv6 Hint Using the Embedded IPv4 Syntax | |||
| example.com. SVCB 16 foo.example.org. ( | example.com. SVCB 16 foo.example.org. ( | |||
| alpn=h2,h3-19 mandatory=ipv4hint,alpn | alpn=h2,h3-19 mandatory=ipv4hint,alpn | |||
| ipv4hint=192.0.2.1 | ipv4hint=192.0.2.1 | |||
| ) | ) | |||
| \# 48 ( | \# 48 ( | |||
| 00 10 ; priority | 00 10 ; priority | |||
| 03 66 6f 6f 07 65 78 61 6d 70 6c 65 03 6f 72 67 00 ; target | 03 66 6f 6f 07 65 78 61 6d 70 6c 65 03 6f 72 67 00 ; target | |||
| 00 00 ; key 0 | 00 00 ; key 0 | |||
| skipping to change at page 53, line 44 ¶ | skipping to change at line 2382 ¶ | |||
| \x00\x01 # key 1 | \x00\x01 # key 1 | |||
| \x00\x09 # param length 9 | \x00\x09 # param length 9 | |||
| \x02 # alpn length 2 | \x02 # alpn length 2 | |||
| h2 # alpn value | h2 # alpn value | |||
| \x05 # alpn length 5 | \x05 # alpn length 5 | |||
| h3-19 # alpn value | h3-19 # alpn value | |||
| \x00\x04 # key 4 | \x00\x04 # key 4 | |||
| \x00\x04 # param length 4 | \x00\x04 # param length 4 | |||
| \xc0\x00\x02\x01 # param value | \xc0\x00\x02\x01 # param value | |||
| Figure 9: SvcParamKey ordering is arbitrary in presentation | Figure 9: SvcParamKey Ordering Is Arbitrary in Presentation | |||
| format but sorted in wire format | Format but Sorted in Wire Format | |||
| example.com. SVCB 16 foo.example.org. alpn="f\\\\oo\\,bar,h2" | example.com. SVCB 16 foo.example.org. alpn="f\\\\oo\\,bar,h2" | |||
| example.com. SVCB 16 foo.example.org. alpn=f\\\092oo\092,bar,h2 | example.com. SVCB 16 foo.example.org. alpn=f\\\092oo\092,bar,h2 | |||
| \# 35 ( | \# 35 ( | |||
| 00 10 ; priority | 00 10 ; priority | |||
| 03 66 6f 6f 07 65 78 61 6d 70 6c 65 03 6f 72 67 00 ; target | 03 66 6f 6f 07 65 78 61 6d 70 6c 65 03 6f 72 67 00 ; target | |||
| 00 01 ; key 1 | 00 01 ; key 1 | |||
| 00 0c ; param length 12 | 00 0c ; param length 12 | |||
| 08 ; alpn length 8 | 08 ; alpn length 8 | |||
| skipping to change at page 54, line 28 ¶ | 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 which 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 | |||
| ) | ) | |||
| Figure 11: Multiple instances of the same SvcParamKey | Figure 11: Multiple Instances of the Same SvcParamKey | |||
| example.com. SVCB 1 foo.example.com. mandatory | example.com. SVCB 1 foo.example.com. mandatory | |||
| example.com. SVCB 1 foo.example.com. alpn | example.com. SVCB 1 foo.example.com. alpn | |||
| example.com. SVCB 1 foo.example.com. port | example.com. SVCB 1 foo.example.com. port | |||
| example.com. SVCB 1 foo.example.com. ipv4hint | example.com. SVCB 1 foo.example.com. ipv4hint | |||
| example.com. SVCB 1 foo.example.com. ipv6hint | example.com. SVCB 1 foo.example.com. ipv6hint | |||
| Figure 12: Missing SvcParamValues that must be nonempty | Figure 12: Missing SvcParamValues That Must Be Non-Empty | |||
| example.com. SVCB 1 foo.example.com. no-default-alpn=abc | example.com. SVCB 1 foo.example.com. no-default-alpn=abc | |||
| Figure 13: The "no-default-alpn" SvcParamKey value must be empty | ||||
| Figure 13: The "no-default-alpn" SvcParamKey Value Must Be Empty | ||||
| example.com. SVCB 1 foo.example.com. mandatory=key123 | example.com. SVCB 1 foo.example.com. mandatory=key123 | |||
| Figure 14: A mandatory SvcParam is missing | Figure 14: A Mandatory SvcParam Is Missing | |||
| example.com. SVCB 1 foo.example.com. mandatory=mandatory | example.com. SVCB 1 foo.example.com. mandatory=mandatory | |||
| Figure 15: The "mandatory" SvcParamKey must not be included in | Figure 15: The "mandatory" SvcParamKey Must Not Be Included in | |||
| the mandatory list | the Mandatory List | |||
| example.com. SVCB 1 foo.example.com. ( | example.com. SVCB 1 foo.example.com. ( | |||
| mandatory=key123,key123 key123=abc | mandatory=key123,key123 key123=abc | |||
| ) | ) | |||
| Figure 16: Multiple instances of the same SvcParamKey in the | Figure 16: Multiple Instances of the Same SvcParamKey in the | |||
| mandatory list | Mandatory List | |||
| Appendix E. Change history | ||||
| (This section to be removed by the RFC editor.) | ||||
| * draft-ietf-dnsop-svcb-https-12 | ||||
| - Split out Encrypted Client Hello (ECH) to a separate draft and | ||||
| convert all remaining references to informative. | ||||
| * draft-ietf-dnsop-svcb-https-11 | ||||
| - Narrow set of post-IESG clarifications: | ||||
| o Clarify that that the fallback addition of the QNAME was for | ||||
| the AliasMode case | ||||
| o Note that some implementations may not allow A/AAAA records | ||||
| on names starting with an underscore | ||||
| * draft-ietf-dnsop-svcb-https-10 | ||||
| - Clarify rationale for two recommendations | ||||
| * draft-ietf-dnsop-svcb-https-09 | ||||
| - Extensive adjustments based on IESG reviews, including: | ||||
| o IANA registry changed to Expert Review policy | ||||
| o Adjustments to the use of normative language | ||||
| o Revised and expanded description of HSTS behavior | ||||
| o Expanded discussion of CNAME handling | ||||
| o Discussion of SvcParams in AliasMode records | ||||
| o Restructured ABNF for comma-separated lists | ||||
| o Additional references and many other minor clarifications | ||||
| - Other changes include: | ||||
| o New section on interaction with DNS64 | ||||
| o New text on the interpretation of wildcard owner names | ||||
| o Adjusted guidance on default ALPN enforcement | ||||
| o Removed mention of IPv4-mapped IPv6 | ||||
| * draft-ietf-dnsop-svcb-https-08 | ||||
| - Extensive structural and editorial adjustments based on area | ||||
| reviews, including: | ||||
| o A new section on SVCB-compatible record types | ||||
| o Reorganized description of client behavior | ||||
| o Test vectors are now in titled figures | ||||
| o Adjusted mapping summary | ||||
| o Improve description of rules for resolver handling of | ||||
| invalid SvcParamValues. | ||||
| - New text on cross-transport fallback (e.g. QUIC vs. TCP) | ||||
| - Improved explanation of use with domain-oriented transport | ||||
| proxies | ||||
| - HTTP terminology adjusted to match draft-ietf-httpbis-semantics | ||||
| - Improved and corrected IANA instructions | ||||
| * draft-ietf-dnsop-svcb-https-07 | ||||
| - Editorial improvements following AD review. | ||||
| * draft-ietf-dnsop-svcb-https-06 | ||||
| - Add requirements for HTTPS origins that also use Alt-Svc | ||||
| - Remove requirement for comma-escaping related to unusual ALPN | ||||
| values | ||||
| - Allow resolvers to reject invalid SvcParamValues, with | ||||
| additional guidance | ||||
| * draft-ietf-dnsop-svcb-https-05 | ||||
| - Specify interaction with EDNS Client Subnet and Additional | ||||
| section caching | ||||
| - Rename "echconfig" to "ech" | ||||
| - Add a suite of test vectors (both valid and invalid) and more | ||||
| examples | ||||
| - Clarify requirements for resolvers' (non-)use of SvcParams | ||||
| - Clarify guidance regarding default ALPN values | ||||
| * draft-ietf-dnsop-svcb-https-04 | ||||
| - Simplify the IANA instructions (pure First Come First Served) | ||||
| - Recommend against publishing chains of >8 aliases | ||||
| - Clarify requirements for using SVCB with a transport proxy | ||||
| - Adjust guidance for Port Prefix Naming | ||||
| - Minor editorial updates | ||||
| * draft-ietf-dnsop-svcb-https-03 | ||||
| - Simplified escaping of comma-separated values | ||||
| - Reorganized client requirements | ||||
| - Added a warning about port filtering for cross-protocol attacks | ||||
| - Clarified self-consistency rules for SvcParams | ||||
| - Added a non-normative mapping summary table for HTTPS | ||||
| * draft-ietf-dnsop-svcb-https-02 | ||||
| - Added a Privacy Considerations section | ||||
| - Adjusted resolution fallback description | ||||
| - Clarified status of SvcParams in AliasMode | ||||
| - Improved advice on zone structuring and use with Alt-Svc | ||||
| - Improved examples, including a new Multi-CDN example | ||||
| - Reorganized text on value-list parsing and SvcPriority | ||||
| - Improved phrasing and other editorial improvements throughout | ||||
| * draft-ietf-dnsop-svcb-https-01 | ||||
| - Added a "mandatory" SvcParamKey | ||||
| - Added the ability to indicate that a service does not exist | ||||
| - Adjusted resolution and ALPN algorithms | ||||
| - Major terminology revisions for "origin" and CamelCase names | ||||
| - Revised ABNF | ||||
| - Include allocated RR type numbers | ||||
| - Various corrections, explanations, and recommendations | ||||
| * draft-ietf-dnsop-svcb-https-00 | ||||
| - Rename HTTPSSVC RR to HTTPS RR | ||||
| - Rename "an SVCB" to "a SVCB" | ||||
| - Removed "design considerations and open issues" section and | ||||
| some other "to be removed" text | ||||
| * draft-ietf-dnsop-svcb-httpssvc-03 | ||||
| - Revised chain length limit requirements | ||||
| - Revised IANA registry rules for SvcParamKeys | ||||
| - Require HTTPS clients to implement SNI | ||||
| - Update terminology for Encrypted ClientHello | ||||
| - Clarifications: non-default ports, transport proxies, HSTS | ||||
| procedure, WebSocket behavior, wire format, IP hints, inner/ | ||||
| outer ClientHello with ECH | ||||
| - Various textual and ABNF corrections | ||||
| * draft-ietf-dnsop-svcb-httpssvc-02 | ||||
| - All changes to Alt-Svc have been removed | ||||
| - Expanded and reorganized examples | ||||
| - Priority zero is now the definition of AliasForm | ||||
| - Repeated SvcParamKeys are no longer allowed | ||||
| - The "=" sign may be omitted in a key=value pair if the value is | ||||
| also empty | ||||
| - In the wire format, SvcParamKeys must be in sorted order | ||||
| - New text regarding how to handle resolution timeouts | ||||
| - Expanded description of recursive resolver behavior | ||||
| - Much more precise description of the intended ALPN behavior | ||||
| - Match the HSTS specification's language on HTTPS enforcement | ||||
| - Removed 'esniconfig=""' mechanism and simplified ESNI | ||||
| connection logic | ||||
| * draft-ietf-dnsop-svcb-httpssvc-01 | ||||
| - Reduce the emphasis on conversion between HTTPSSVC and Alt-Svc | ||||
| - Make the "untrusted channel" concept more precise. | ||||
| - Make SvcFieldPriority = 0 the definition of AliasForm, instead | ||||
| of a requirement. | ||||
| * draft-ietf-dnsop-svcb-httpssvc-00 | ||||
| - Document an optimization for optimistic pre-connection. (Chris | ||||
| Wood) | ||||
| - Relax IP hint handling requirements. (Eric Rescorla) | ||||
| * draft-nygren-dnsop-svcb-httpssvc-00 | ||||
| - Generalize to an SVCB record, with special-case handling for | ||||
| Alt-Svc and HTTPS separated out to dedicated sections. | ||||
| - Split out a separate HTTPSSVC record for the HTTPS use-case. | ||||
| - Remove the explicit SvcRecordType=0/1 and instead make the | ||||
| AliasForm vs ServiceForm be implicit. This was based on | ||||
| feedback recommending against subtyping RR type. | ||||
| - Remove one optimization. | ||||
| * draft-nygren-httpbis-httpssvc-03 | ||||
| - Change redirect type for HSTS-style behavior from 302 to 307 to | ||||
| reduce ambiguities. | ||||
| * draft-nygren-httpbis-httpssvc-02 | ||||
| - Remove the redundant length fields from the wire format. | ||||
| - Define a SvcDomainName of "." for SvcRecordType=1 as being the | ||||
| HTTPSSVC RRNAME. | ||||
| - Replace "hq" with "h3". | ||||
| * draft-nygren-httpbis-httpssvc-01 | ||||
| - Fixes of record name. Replace references to "HTTPSVC" with | Acknowledgments and Related Proposals | |||
| "HTTPSSVC". | ||||
| * draft-nygren-httpbis-httpssvc-00 | Over the years, IETF participants have proposed a wide range of | |||
| solutions to the "CNAME at the zone apex" challenge, including | ||||
| [HTTP-DNS-RR], [ANAME-DNS-RR], and others. The authors are grateful | ||||
| for their work to elucidate the problem and identify promising | ||||
| strategies to address it, some of which are reflected in this | ||||
| document. | ||||
| - Initial version | Thank you to Ian Swett, Ralf Weber, Jon Reed, Martin Thomson, Lucas | |||
| Pardue, Ilari Liusvaara, Tim Wicinski, Tommy Pauly, Chris Wood, David | ||||
| Benjamin, Mark Andrews, Emily Stark, Eric Orth, Kyle Rose, Craig | ||||
| Taylor, Dan McArdle, Brian Dickson, Willem Toorop, Pieter Lexis, | ||||
| Puneet Sood, Olivier Poitrey, Mashooq Muhaimen, Tom Carpay, and many | ||||
| others for their feedback and suggestions on this document. | ||||
| Authors' Addresses | Authors' Addresses | |||
| Ben Schwartz | Ben Schwartz | |||
| Meta Platforms, Inc. | ||||
| Email: ietf@bemasc.net | Email: ietf@bemasc.net | |||
| Mike Bishop | Mike Bishop | |||
| Akamai Technologies | Akamai Technologies | |||
| Email: mbishop@evequefou.be | Email: mbishop@evequefou.be | |||
| Erik Nygren | Erik Nygren | |||
| Akamai Technologies | Akamai Technologies | |||
| Email: erik+ietf@nygren.org | Email: erik+ietf@nygren.org | |||
| End of changes. 326 change blocks. | ||||
| 1055 lines changed or deleted | 794 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. | ||||