| rfc9484.original | rfc9484.txt | |||
|---|---|---|---|---|
| MASQUE T. Pauly, Ed. | Internet Engineering Task Force (IETF) T. Pauly, Ed. | |||
| Internet-Draft Apple Inc. | Request for Comments: 9484 Apple Inc. | |||
| Updates: 9298 (if approved) D. Schinazi | Updates: 9298 D. Schinazi | |||
| Intended status: Standards Track A. Chernyakhovsky | Category: Standards Track A. Chernyakhovsky | |||
| Expires: 30 October 2023 Google LLC | ISSN: 2070-1721 Google LLC | |||
| M. Kuehlewind | M. Kühlewind | |||
| M. Westerlund | M. Westerlund | |||
| Ericsson | Ericsson | |||
| 28 April 2023 | October 2023 | |||
| Proxying IP in HTTP | Proxying IP in HTTP | |||
| draft-ietf-masque-connect-ip-13 | ||||
| Abstract | Abstract | |||
| This document describes how to proxy IP packets in HTTP. This | This document describes how to proxy IP packets in HTTP. This | |||
| protocol is similar to UDP proxying in HTTP, but allows transmitting | protocol is similar to UDP proxying in HTTP but allows transmitting | |||
| arbitrary IP packets. More specifically, this document defines a | arbitrary IP packets. More specifically, this document defines a | |||
| protocol that allows an HTTP client to create an IP tunnel through an | protocol that allows an HTTP client to create an IP tunnel through an | |||
| HTTP server that acts as an IP proxy. This document updates RFC | HTTP server that acts as an IP proxy. This document updates RFC | |||
| 9298. | 9298. | |||
| About This Document | ||||
| This note is to be removed before publishing as an RFC. | ||||
| The latest revision of this draft can be found at https://ietf-wg- | ||||
| masque.github.io/draft-ietf-masque-connect-ip/draft-ietf-masque- | ||||
| connect-ip.html. Status information for this document may be found | ||||
| at https://datatracker.ietf.org/doc/draft-ietf-masque-connect-ip/. | ||||
| Discussion of this document takes place on the MASQUE Working Group | ||||
| mailing list (mailto:masque@ietf.org), which is archived at | ||||
| https://mailarchive.ietf.org/arch/browse/masque/. Subscribe at | ||||
| https://www.ietf.org/mailman/listinfo/masque/. | ||||
| Source for this draft and an issue tracker can be found at | ||||
| https://github.com/ietf-wg-masque/draft-ietf-masque-connect-ip. | ||||
| 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 | ||||
| Task Force (IETF). Note that other groups may also distribute | ||||
| working documents as Internet-Drafts. The list of current Internet- | ||||
| Drafts is at https://datatracker.ietf.org/drafts/current/. | ||||
| Internet-Drafts are draft documents valid for a maximum of six months | This document is a product of the Internet Engineering Task Force | |||
| and may be updated, replaced, or obsoleted by other documents at any | (IETF). It represents the consensus of the IETF community. It has | |||
| time. It is inappropriate to use Internet-Drafts as reference | received public review and has been approved for publication by the | |||
| material or to cite them other than as "work in progress." | Internet Engineering Steering Group (IESG). Further information on | |||
| Internet Standards is available in Section 2 of RFC 7841. | ||||
| This Internet-Draft will expire on 30 October 2023. | Information about the current status of this document, any errata, | |||
| and how to provide feedback on it may be obtained at | ||||
| https://www.rfc-editor.org/info/rfc9484. | ||||
| 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 . . . . . . . . . . . . . . . . . . . . . . . . 3 | 1. Introduction | |||
| 2. Conventions and Definitions . . . . . . . . . . . . . . . . . 4 | 2. Conventions and Definitions | |||
| 3. Configuration of Clients . . . . . . . . . . . . . . . . . . 4 | 3. Configuration of Clients | |||
| 4. Tunnelling IP over HTTP . . . . . . . . . . . . . . . . . . . 6 | 4. Tunnelling IP over HTTP | |||
| 4.1. IP Proxy Handling . . . . . . . . . . . . . . . . . . . . 6 | 4.1. IP Proxy Handling | |||
| 4.2. HTTP/1.1 Request . . . . . . . . . . . . . . . . . . . . 7 | 4.2. HTTP/1.1 Request | |||
| 4.3. HTTP/1.1 Response . . . . . . . . . . . . . . . . . . . . 8 | 4.3. HTTP/1.1 Response | |||
| 4.4. HTTP/2 and HTTP/3 Requests . . . . . . . . . . . . . . . 8 | 4.4. HTTP/2 and HTTP/3 Requests | |||
| 4.5. HTTP/2 and HTTP/3 Responses . . . . . . . . . . . . . . . 9 | 4.5. HTTP/2 and HTTP/3 Responses | |||
| 4.6. Limiting Request Scope . . . . . . . . . . . . . . . . . 10 | 4.6. Limiting Request Scope | |||
| 4.7. Capsules . . . . . . . . . . . . . . . . . . . . . . . . 12 | 4.7. Capsules | |||
| 4.7.1. ADDRESS_ASSIGN Capsule . . . . . . . . . . . . . . . 12 | 4.7.1. ADDRESS_ASSIGN Capsule | |||
| 4.7.2. ADDRESS_REQUEST Capsule . . . . . . . . . . . . . . . 13 | 4.7.2. ADDRESS_REQUEST Capsule | |||
| 4.7.3. ROUTE_ADVERTISEMENT Capsule . . . . . . . . . . . . . 15 | 4.7.3. ROUTE_ADVERTISEMENT Capsule | |||
| 4.8. IPv6 Extension Headers . . . . . . . . . . . . . . . . . 17 | 4.8. IPv6 Extension Headers | |||
| 5. Context Identifiers . . . . . . . . . . . . . . . . . . . . . 18 | 5. Context Identifiers | |||
| 6. HTTP Datagram Payload Format . . . . . . . . . . . . . . . . 18 | 6. HTTP Datagram Payload Format | |||
| 7. IP Packet Handling . . . . . . . . . . . . . . . . . . . . . 19 | 7. IP Packet Handling | |||
| 7.1. Link Operation . . . . . . . . . . . . . . . . . . . . . 19 | 7.1. Link Operation | |||
| 7.2. Routing Operation . . . . . . . . . . . . . . . . . . . . 20 | 7.2. Routing Operation | |||
| 7.2.1. Error Signalling . . . . . . . . . . . . . . . . . . 21 | 7.2.1. Error Signalling | |||
| 8. Examples . . . . . . . . . . . . . . . . . . . . . . . . . . 22 | 8. Examples | |||
| 8.1. Remote Access VPN . . . . . . . . . . . . . . . . . . . . 22 | 8.1. Remote Access VPN | |||
| 8.2. Site-to-Site VPN . . . . . . . . . . . . . . . . . . . . 24 | 8.2. Site-to-Site VPN | |||
| 8.3. IP Flow Forwarding . . . . . . . . . . . . . . . . . . . 26 | 8.3. IP Flow Forwarding | |||
| 8.4. Proxied Connection Racing . . . . . . . . . . . . . . . . 29 | 8.4. Proxied Connection Racing | |||
| 9. Extensibility Considerations . . . . . . . . . . . . . . . . 30 | 9. Extensibility Considerations | |||
| 10. Performance Considerations . . . . . . . . . . . . . . . . . 31 | 10. Performance Considerations | |||
| 10.1. MTU Considerations . . . . . . . . . . . . . . . . . . . 31 | 10.1. MTU Considerations | |||
| 10.2. ECN Considerations . . . . . . . . . . . . . . . . . . . 32 | 10.2. ECN Considerations | |||
| 10.3. Differentiated Services Considerations . . . . . . . . . 32 | 10.3. Differentiated Services Considerations | |||
| 11. Security Considerations . . . . . . . . . . . . . . . . . . . 33 | 11. Security Considerations | |||
| 12. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 34 | 12. IANA Considerations | |||
| 12.1. HTTP Upgrade Token . . . . . . . . . . . . . . . . . . . 34 | 12.1. HTTP Upgrade Token Registration | |||
| 12.2. Creation of the MASQUE URI Suffixes Registry . . . . . . 34 | 12.2. MASQUE URI Suffixes Registry Creation | |||
| 12.3. Updates to masque Well-Known URI . . . . . . . . . . . . 35 | 12.3. Updates to masque Well-Known URI Registration | |||
| 12.4. Capsule Type Registrations . . . . . . . . . . . . . . . 35 | 12.4. HTTP Capsule Types Registrations | |||
| 13. References . . . . . . . . . . . . . . . . . . . . . . . . . 36 | 13. References | |||
| 13.1. Normative References . . . . . . . . . . . . . . . . . . 36 | 13.1. Normative References | |||
| 13.2. Informative References . . . . . . . . . . . . . . . . . 39 | 13.2. Informative References | |||
| Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 40 | Acknowledgments | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 40 | Authors' Addresses | |||
| 1. Introduction | 1. Introduction | |||
| HTTP provides the CONNECT method (see Section 9.3.6 of [HTTP]) for | HTTP provides the CONNECT method (see Section 9.3.6 of [HTTP]) for | |||
| creating a TCP [TCP] tunnel to a destination and a similar mechanism | creating a TCP [TCP] tunnel to a destination and a similar mechanism | |||
| for UDP [CONNECT-UDP]. However, these mechanisms cannot tunnel other | for UDP [CONNECT-UDP]. However, these mechanisms cannot tunnel other | |||
| IP protocols [IANA-PN] nor convey fields of the IP header. | IP protocols [IANA-PN] nor convey fields of the IP header. | |||
| This document describes a protocol for tunnelling IP through an HTTP | This document describes a protocol for tunnelling IP through an HTTP | |||
| server acting as an IP-specific proxy over HTTP. This can be used | server acting as an IP-specific proxy over HTTP. This can be used | |||
| for various use cases such as remote access VPN, site-to-site VPN, | for various use cases, such as remote access VPN, site-to-site VPN, | |||
| secure point-to-point communication, or general-purpose packet | secure point-to-point communication, or general-purpose packet | |||
| tunnelling. | tunnelling. | |||
| IP proxying operates similarly to UDP proxying [CONNECT-UDP], whereby | IP proxying operates similarly to UDP proxying [CONNECT-UDP], whereby | |||
| the proxy itself is identified with an absolute URL, optionally | the proxy itself is identified with an absolute URL, optionally | |||
| containing the traffic's destination. Clients generate these URLs | containing the traffic's destination. Clients generate these URLs | |||
| using a URI Template [TEMPLATE], as described in Section 3. | using a URI Template [TEMPLATE], as described in Section 3. | |||
| This protocol supports all existing versions of HTTP by using HTTP | This protocol supports all existing versions of HTTP by using HTTP | |||
| Datagrams [HTTP-DGRAM]. When using HTTP/2 [HTTP/2] or HTTP/3 | Datagrams [HTTP-DGRAM]. When using HTTP/2 [HTTP/2] or HTTP/3 | |||
| [HTTP/3], it uses HTTP Extended CONNECT as described in | [HTTP/3], it uses HTTP Extended CONNECT, as described in | |||
| [EXT-CONNECT2] and [EXT-CONNECT3]. When using HTTP/1.x [HTTP/1.1], | [EXT-CONNECT2] and [EXT-CONNECT3]. When using HTTP/1.x [HTTP/1.1], | |||
| it uses HTTP Upgrade as defined in Section 7.8 of [HTTP]. | it uses HTTP Upgrade, as defined in Section 7.8 of [HTTP]. | |||
| This document updates [CONNECT-UDP] to change the "masque" well-known | This document updates [CONNECT-UDP] to change the "masque" well-known | |||
| URI, see Section 12.3. | URI; see Section 12.3. | |||
| 2. Conventions and Definitions | 2. Conventions and Definitions | |||
| 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 | "OPTIONAL" in this document are to be interpreted as described in | |||
| BCP 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. | |||
| In this document, we use the term "IP proxy" to refer to the HTTP | In this document, we use the term "IP proxy" to refer to the HTTP | |||
| skipping to change at page 4, line 41 ¶ | skipping to change at line 157 ¶ | |||
| Note that, when the HTTP version in use does not support multiplexing | Note that, when the HTTP version in use does not support multiplexing | |||
| streams (such as HTTP/1.1), any reference to "stream" in this | streams (such as HTTP/1.1), any reference to "stream" in this | |||
| document represents the entire connection. | document represents the entire connection. | |||
| 3. Configuration of Clients | 3. Configuration of Clients | |||
| Clients are configured to use IP proxying over HTTP via a URI | Clients are configured to use IP proxying over HTTP via a URI | |||
| Template [TEMPLATE]. The URI Template MAY contain two variables: | Template [TEMPLATE]. The URI Template MAY contain two variables: | |||
| "target" and "ipproto"; see Section 4.6. The optionality of the | "target" and "ipproto"; see Section 4.6. The optionality of the | |||
| variables needs to be considered when defining the template so that | variables needs to be considered when defining the template so that | |||
| either the variable is self-identifying or it is possible to exclude | the variable is either self-identifying or possible to exclude in the | |||
| it in the syntax. | syntax. | |||
| Examples are shown below: | Examples are shown below: | |||
| https://example.org/.well-known/masque/ip/{target}/{ipproto}/ | https://example.org/.well-known/masque/ip/{target}/{ipproto}/ | |||
| https://proxy.example.org:4443/masque/ip?t={target}&i={ipproto} | https://proxy.example.org:4443/masque/ip?t={target}&i={ipproto} | |||
| https://proxy.example.org:4443/masque/ip{?target,ipproto} | https://proxy.example.org:4443/masque/ip{?target,ipproto} | |||
| https://masque.example.org/?user=bob | https://masque.example.org/?user=bob | |||
| Figure 1: URI Template Examples | Figure 1: URI Template Examples | |||
| The following requirements apply to the URI Template: | The following requirements apply to the URI Template: | |||
| * The URI Template MUST be a level 3 template or lower. | * The URI Template MUST be a level 3 template or lower. | |||
| * The URI Template MUST be in absolute form, and MUST include non- | * The URI Template MUST be in absolute form and MUST include non- | |||
| empty scheme, authority and path components. | empty scheme, authority, and path components. | |||
| * The path component of the URI Template MUST start with a slash | * The path component of the URI Template MUST start with a slash | |||
| "/". | "/". | |||
| * All template variables MUST be within the path or query components | * All template variables MUST be within the path or query components | |||
| of the URI. | of the URI. | |||
| * The URI Template MAY contain the two variables "target" and | * The URI Template MAY contain the two variables "target" and | |||
| "ipproto" and MAY contain other variables. If the "target" or | "ipproto" and MAY contain other variables. If the "target" or | |||
| "ipproto" variables are included, their values MUST NOT be empty. | "ipproto" variables are included, their values MUST NOT be empty. | |||
| Clients can instead use "*" to indicate wildcard or no-preference | Clients can instead use "*" to indicate wildcard or no-preference | |||
| values; see Section 4.6. | values; see Section 4.6. | |||
| * The URI Template MUST NOT contain any non-ASCII unicode characters | * The URI Template MUST NOT contain any non-ASCII Unicode characters | |||
| and MUST only contain ASCII characters in the range 0x21-0x7E | and MUST only contain ASCII characters in the range 0x21-0x7E | |||
| inclusive (note that percent-encoding is allowed; see Section 2.1 | inclusive (note that percent-encoding is allowed; see Section 2.1 | |||
| of [URI]). | of [URI]). | |||
| * The URI Template MUST NOT use Reserved Expansion ("+" operator), | * The URI Template MUST NOT use Reserved Expansion ("+" operator), | |||
| Fragment Expansion ("#" operator), Label Expansion with Dot- | Fragment Expansion ("#" operator), Label Expansion with Dot- | |||
| Prefix, Path Segment Expansion with Slash-Prefix, nor Path-Style | Prefix, Path Segment Expansion with Slash-Prefix, nor Path-Style | |||
| Parameter Expansion with Semicolon-Prefix. | Parameter Expansion with Semicolon-Prefix. | |||
| Clients SHOULD validate the requirements above; however, clients MAY | Clients SHOULD validate the requirements above; however, clients MAY | |||
| skipping to change at page 6, line 16 ¶ | skipping to change at line 226 ¶ | |||
| To allow negotiation of a tunnel for IP over HTTP, this document | To allow negotiation of a tunnel for IP over HTTP, this document | |||
| defines the "connect-ip" HTTP upgrade token. The resulting IP | defines the "connect-ip" HTTP upgrade token. The resulting IP | |||
| tunnels use the Capsule Protocol (see Section 3.2 of [HTTP-DGRAM]) | tunnels use the Capsule Protocol (see Section 3.2 of [HTTP-DGRAM]) | |||
| with HTTP Datagrams in the format defined in Section 6. | with HTTP Datagrams in the format defined in Section 6. | |||
| To initiate an IP tunnel associated with a single HTTP stream, a | To initiate an IP tunnel associated with a single HTTP stream, a | |||
| client issues a request containing the "connect-ip" upgrade token. | client issues a request containing the "connect-ip" upgrade token. | |||
| When sending its IP proxying request, the client SHALL perform URI | When sending its IP proxying request, the client SHALL perform URI | |||
| Template expansion to determine the path and query of its request, | Template expansion to determine the path and query of its request; | |||
| see Section 3. | see Section 3. | |||
| By virtue of the definition of the Capsule Protocol (see Section 3.2 | By virtue of the definition of the Capsule Protocol (see Section 3.2 | |||
| of [HTTP-DGRAM]), IP proxying requests do not carry any message | of [HTTP-DGRAM]), IP proxying requests do not carry any message | |||
| content. Similarly, successful IP proxying responses also do not | content. Similarly, successful IP proxying responses also do not | |||
| carry any message content. | carry any message content. | |||
| IP proxying over HTTP MUST be operated over TLS or QUIC encryption, | IP proxying over HTTP MUST be operated over TLS or QUIC encryption, | |||
| or another equivalent encryption protocol, to provide | or another equivalent encryption protocol, to provide | |||
| confidentiality, integrity, and authentication. | confidentiality, integrity, and authentication. | |||
| 4.1. IP Proxy Handling | 4.1. IP Proxy Handling | |||
| Upon receiving an IP proxying request: | Upon receiving an IP proxying request: | |||
| * if the recipient is configured to use another HTTP proxy, it will | * If the recipient is configured to use another HTTP server, it will | |||
| act as an intermediary by forwarding the request to another HTTP | act as an intermediary by forwarding the request to the other HTTP | |||
| server. Note that such intermediaries may need to re-encode the | server. Note that such intermediaries may need to re-encode the | |||
| request if they forward it using a version of HTTP that is | request if they forward it using a version of HTTP that is | |||
| different from the one used to receive it, as the request encoding | different from the one used to receive it, as the request encoding | |||
| differs by version (see below). | differs by version (see below). | |||
| * otherwise, the recipient will act as an IP proxy. The IP proxy | * Otherwise, the recipient will act as an IP proxy. The IP proxy | |||
| can choose to reject the IP proxying request. Otherwise, it | can choose to reject the IP proxying request. Otherwise, it | |||
| extracts the optional "target" and "ipproto" variables from the | extracts the optional "target" and "ipproto" variables from the | |||
| URI it has reconstructed from the request headers, decodes their | URI it has reconstructed from the request headers, decodes their | |||
| percent-encoding, and establishes an IP tunnel. | percent-encoding, and establishes an IP tunnel. | |||
| IP proxies MUST validate whether the decoded "target" and "ipproto" | IP proxies MUST validate whether the decoded "target" and "ipproto" | |||
| variables meet the requirements in Section 4.6. If they do not, the | variables meet the requirements in Section 4.6. If they do not, the | |||
| IP proxy MUST treat the request as malformed; see Section 8.1.1 of | IP proxy MUST treat the request as malformed; see Section 8.1.1 of | |||
| [HTTP/2] and Section 4.1.2 of [HTTP/3]. If the "target" variable is | [HTTP/2] and Section 4.1.2 of [HTTP/3]. If the "target" variable is | |||
| a DNS name, the IP proxy MUST perform DNS resolution (to obtain the | a DNS name, the IP proxy MUST perform DNS resolution (to obtain the | |||
| corresponding IPv4 and/or IPv6 addresses via A and/or AAAA records) | corresponding IPv4 and/or IPv6 addresses via A and/or AAAA records) | |||
| before replying to the HTTP request. If errors occur during this | before replying to the HTTP request. If errors occur during this | |||
| process, the IP proxy MUST reject the request and SHOULD send details | process, the IP proxy MUST reject the request and SHOULD send details | |||
| using an appropriate Proxy-Status header field [PROXY-STATUS]. For | using an appropriate Proxy-Status header field [PROXY-STATUS]. For | |||
| example, if DNS resolution returns an error, the proxy can use the | example, if DNS resolution returns an error, the proxy can use the | |||
| dns_error Proxy Error Type from Section 2.3.2 of [PROXY-STATUS]. | dns_error proxy error type from Section 2.3.2 of [PROXY-STATUS]. | |||
| The lifetime of the IP forwarding tunnel is tied to the IP proxying | The lifetime of the IP forwarding tunnel is tied to the IP proxying | |||
| request stream. The IP proxy MUST maintain all IP address and route | request stream. The IP proxy MUST maintain all IP address and route | |||
| assignments associated with the IP forwarding tunnel while the | assignments associated with the IP forwarding tunnel while the | |||
| request stream is open. IP proxies MAY choose to tear down the | request stream is open. IP proxies MAY choose to tear down the | |||
| tunnel due to a period of inactivity, but they MUST close the request | tunnel due to a period of inactivity, but they MUST close the request | |||
| stream when doing so. | stream when doing so. | |||
| A successful response (as defined in Sections 4.3 and 4.5) indicates | A successful IP proxying response (as defined in Sections 4.3 and | |||
| that the IP proxy has established an IP tunnel and is willing to | 4.5) indicates that the IP proxy has established an IP tunnel and is | |||
| proxy IP payloads. Any response other than a successful response | willing to proxy IP payloads. Any response other than a successful | |||
| indicates that the request has failed; thus, the client MUST abort | IP proxying response indicates that the request has failed; thus, the | |||
| the request. | client MUST abort the request. | |||
| Along with a successful response, the IP proxy can send capsules to | Along with a successful IP proxying response, the IP proxy can send | |||
| assign addresses and advertise routes to the client (Section 4.7). | capsules to assign addresses and advertise routes to the client | |||
| The client can also assign addresses and advertise routes to the IP | (Section 4.7). The client can also assign addresses and advertise | |||
| proxy for network-to-network routing. | routes to the IP proxy for network-to-network routing. | |||
| 4.2. HTTP/1.1 Request | 4.2. HTTP/1.1 Request | |||
| When using HTTP/1.1 [HTTP/1.1], an IP proxying request will meet the | When using HTTP/1.1 [HTTP/1.1], an IP proxying request will meet the | |||
| following requirements: | following requirements: | |||
| * the method SHALL be "GET". | * The method SHALL be "GET". | |||
| * the request SHALL include a single Host header field containing | * The request SHALL include a single Host header field containing | |||
| the host and optional port of the IP proxy. | the host and optional port of the IP proxy. | |||
| * the request SHALL include a Connection header field with value | * The request SHALL include a Connection header field with value | |||
| "Upgrade" (note that this requirement is case-insensitive as per | "Upgrade" (note that this requirement is case-insensitive, as per | |||
| Section 7.6.1 of [HTTP]). | Section 7.6.1 of [HTTP]). | |||
| * the request SHALL include an Upgrade header field with value | * The request SHALL include an Upgrade header field with value | |||
| "connect-ip". | "connect-ip". | |||
| An IP proxying request that does not conform to these restrictions is | An IP proxying request that does not conform to these restrictions is | |||
| malformed. The recipient of such a malformed request MUST respond | malformed. The recipient of such a malformed request MUST respond | |||
| with an error and SHOULD use the 400 (Bad Request) status code. | with an error and SHOULD use the 400 (Bad Request) status code. | |||
| For example, if the client is configured with URI Template | For example, if the client is configured with URI Template | |||
| "https://example.org/.well-known/masque/ip/{target}/{ipproto}/" and | "https://example.org/.well-known/masque/ip/{target}/{ipproto}/" and | |||
| wishes to open an IP forwarding tunnel with no target or protocol | wishes to open an IP forwarding tunnel with no target or protocol | |||
| limitations, it could send the following request: | limitations, it could send the following request: | |||
| skipping to change at page 8, line 15 ¶ | skipping to change at line 321 ¶ | |||
| GET https://example.org/.well-known/masque/ip/*/*/ HTTP/1.1 | GET https://example.org/.well-known/masque/ip/*/*/ HTTP/1.1 | |||
| Host: example.org | Host: example.org | |||
| Connection: Upgrade | Connection: Upgrade | |||
| Upgrade: connect-ip | Upgrade: connect-ip | |||
| Capsule-Protocol: ?1 | Capsule-Protocol: ?1 | |||
| Figure 2: Example HTTP/1.1 Request | Figure 2: Example HTTP/1.1 Request | |||
| 4.3. HTTP/1.1 Response | 4.3. HTTP/1.1 Response | |||
| The server indicates a successful response by replying with the | The server indicates a successful IP proxying response by replying | |||
| following requirements: | with the following requirements: | |||
| * the HTTP status code on the response SHALL be 101 (Switching | * The HTTP status code on the response SHALL be 101 (Switching | |||
| Protocols). | Protocols). | |||
| * the response SHALL include a Connection header field with value | * The response SHALL include a Connection header field with value | |||
| "Upgrade" (note that this requirement is case-insensitive as per | "Upgrade" (note that this requirement is case-insensitive, as per | |||
| Section 7.6.1 of [HTTP]). | Section 7.6.1 of [HTTP]). | |||
| * the response SHALL include a single Upgrade header field with | * The response SHALL include a single Upgrade header field with | |||
| value "connect-ip". | value "connect-ip". | |||
| * the response SHALL meet the requirements of HTTP responses that | * The response SHALL meet the requirements of HTTP responses that | |||
| start the Capsule Protocol; see Section 3.2 of [HTTP-DGRAM]. | start the Capsule Protocol; see Section 3.2 of [HTTP-DGRAM]. | |||
| If any of these requirements are not met, the client MUST treat this | If any of these requirements are not met, the client MUST treat this | |||
| proxying attempt as failed and close the connection. | proxying attempt as failed and close the connection. | |||
| For example, the server could respond with: | For example, the server could respond with: | |||
| HTTP/1.1 101 Switching Protocols | HTTP/1.1 101 Switching Protocols | |||
| Connection: Upgrade | Connection: Upgrade | |||
| Upgrade: connect-ip | Upgrade: connect-ip | |||
| Capsule-Protocol: ?1 | Capsule-Protocol: ?1 | |||
| Figure 3: Example HTTP/1.1 Response | Figure 3: Example HTTP/1.1 Response | |||
| 4.4. HTTP/2 and HTTP/3 Requests | 4.4. HTTP/2 and HTTP/3 Requests | |||
| When using HTTP/2 [HTTP/2] or HTTP/3 [HTTP/3], IP proxying requests | When using HTTP/2 [HTTP/2] or HTTP/3 [HTTP/3], IP proxying requests | |||
| use HTTP Extended CONNECT. This requires that servers send an HTTP | use HTTP Extended CONNECT. This requires that servers send an HTTP | |||
| Setting as specified in [EXT-CONNECT2] and [EXT-CONNECT3] and that | Setting, as specified in [EXT-CONNECT2] and [EXT-CONNECT3], and that | |||
| requests use HTTP pseudo-header fields with the following | requests use HTTP pseudo-header fields with the following | |||
| requirements: | requirements: | |||
| * The :method pseudo-header field SHALL be "CONNECT". | * The :method pseudo-header field SHALL be "CONNECT". | |||
| * The :protocol pseudo-header field SHALL be "connect-ip". | * The :protocol pseudo-header field SHALL be "connect-ip". | |||
| * The :authority pseudo-header field SHALL contain the authority of | * The :authority pseudo-header field SHALL contain the authority of | |||
| the IP proxy. | the IP proxy. | |||
| skipping to change at page 9, line 38 ¶ | skipping to change at line 392 ¶ | |||
| :protocol = connect-ip | :protocol = connect-ip | |||
| :scheme = https | :scheme = https | |||
| :path = /.well-known/masque/ip/*/*/ | :path = /.well-known/masque/ip/*/*/ | |||
| :authority = example.org | :authority = example.org | |||
| capsule-protocol = ?1 | capsule-protocol = ?1 | |||
| Figure 4: Example HTTP/2 or HTTP/3 Request | Figure 4: Example HTTP/2 or HTTP/3 Request | |||
| 4.5. HTTP/2 and HTTP/3 Responses | 4.5. HTTP/2 and HTTP/3 Responses | |||
| The server indicates a successful response by replying with the | The server indicates a successful IP proxying response by replying | |||
| following requirements: | with the following requirements: | |||
| * the HTTP status code on the response SHALL be in the 2xx | * The HTTP status code on the response SHALL be in the 2xx | |||
| (Successful) range. | (Successful) range. | |||
| * the response SHALL meet the requirements of HTTP responses that | * The response SHALL meet the requirements of HTTP responses that | |||
| start the Capsule Protocol; see Section 3.2 of [HTTP-DGRAM]. | start the Capsule Protocol; see Section 3.2 of [HTTP-DGRAM]. | |||
| If any of these requirements are not met, the client MUST treat this | If any of these requirements are not met, the client MUST treat this | |||
| proxying attempt as failed and abort the request. As an example, any | proxying attempt as failed and abort the request. As an example, any | |||
| status code in the 3xx range will be treated as a failure and cause | status code in the 3xx range will be treated as a failure and cause | |||
| the client to abort the request. | the client to abort the request. | |||
| For example, the server could respond with: | For example, the server could respond with: | |||
| HEADERS | HEADERS | |||
| skipping to change at page 10, line 29 ¶ | skipping to change at line 432 ¶ | |||
| optimize its resource allocation; for example, the IP proxy can | optimize its resource allocation; for example, the IP proxy can | |||
| assign the same public IP address to two IP proxying requests that | assign the same public IP address to two IP proxying requests that | |||
| are scoped to different prefixes and/or different protocols. | are scoped to different prefixes and/or different protocols. | |||
| The scope of the request is indicated by the client to the IP proxy | The scope of the request is indicated by the client to the IP proxy | |||
| via the "target" and "ipproto" variables of the URI Template; see | via the "target" and "ipproto" variables of the URI Template; see | |||
| Section 3. Both the "target" and "ipproto" variables are optional; | Section 3. Both the "target" and "ipproto" variables are optional; | |||
| if they are not included, they are considered to carry the wildcard | if they are not included, they are considered to carry the wildcard | |||
| value "*". | value "*". | |||
| target: The variable "target" contains a hostname or IP prefix of a | target: | |||
| The variable "target" contains a hostname or IP prefix of a | ||||
| specific host to which the client wants to proxy packets. If the | specific host to which the client wants to proxy packets. If the | |||
| "target" variable is not specified or its value is "*", the client | "target" variable is not specified or its value is "*", the client | |||
| is requesting to communicate with any allowable host. "target" | is requesting to communicate with any allowable host. "target" | |||
| supports using DNS names, IPv6 prefixes and IPv4 prefixes. Note | supports using DNS names, IPv6 prefixes, and IPv4 prefixes. Note | |||
| that IPv6 scoped addressing zone identifiers ([RFC6874]) are not | that IPv6 scoped addressing zone identifiers [IPv6-ZONE-ID] are | |||
| supported. If the target is an IP prefix (IP address optionally | not supported. If the target is an IP prefix (IP address | |||
| followed by a percent-encoded slash followed by the prefix length | optionally followed by a percent-encoded slash followed by the | |||
| in bits), the request will only support a single IP version. If | prefix length in bits), the request will only support a single IP | |||
| the target is a hostname, the IP proxy is expected to perform DNS | version. If the target is a hostname, the IP proxy is expected to | |||
| resolution to determine which route(s) to advertise to the client. | perform DNS resolution to determine which route(s) to advertise to | |||
| The IP proxy SHOULD send a ROUTE_ADVERTISEMENT capsule that | the client. The IP proxy SHOULD send a ROUTE_ADVERTISEMENT | |||
| includes routes for all addresses that were resolved for the | capsule that includes routes for all addresses that were resolved | |||
| requested hostname, that are accessible to the IP proxy, and | for the requested hostname, that are accessible to the IP proxy, | |||
| belong to an address family for which the IP proxy also sends an | and belong to an address family for which the IP proxy also sends | |||
| Assigned Address. | an Assigned Address. | |||
| ipproto: The variable "ipproto" contains an IP protocol number, as | ||||
| defined in the "Assigned Internet Protocol Numbers" IANA registry | ipproto: | |||
| [IANA-PN]. If present, it specifies that a client only wants to | The variable "ipproto" contains an Internet Protocol Number; see | |||
| proxy a specific IP protocol for this request. If the value is | the defined list in the "Assigned Internet Protocol Numbers" IANA | |||
| "*", or the variable is not included, the client is requesting to | registry [IANA-PN]. If present, it specifies that a client only | |||
| use any IP protocol. The IP protocol indicated in the "ipproto" | wants to proxy a specific IP protocol for this request. If the | |||
| variable represents an allowable next header value carried in IP | value is "*", or the variable is not included, the client is | |||
| headers that are directly sent in HTTP datagrams (the outermost IP | requesting to use any IP protocol. The IP protocol indicated in | |||
| headers). ICMP traffic is always allowed, regardless of the value | the "ipproto" variable represents an allowable next header value | |||
| of this field. | carried in IP headers that are directly sent in HTTP Datagrams | |||
| (the outermost IP headers). ICMP traffic is always allowed, | ||||
| regardless of the value of this field. | ||||
| Using the terms IPv6address, IPv4address, and reg-name from [URI], | Using the terms IPv6address, IPv4address, and reg-name from [URI], | |||
| the "target" and "ipproto" variables MUST adhere to the format in | the "target" and "ipproto" variables MUST adhere to the format in | |||
| Figure 6, using notation from [ABNF]. Additionally: | Figure 6, using notation from [ABNF]. Additionally: | |||
| * if "target" contains an IPv6 literal or prefix, the colons (":") | * If "target" contains an IPv6 literal or prefix, the colons (":") | |||
| MUST be percent-encoded. For example, if the target host is | MUST be percent-encoded. For example, if the target host is | |||
| "2001:db8::42", it will be encoded in the URI as | "2001:db8::42", it will be encoded in the URI as | |||
| "2001%3Adb8%3A%3A42". | "2001%3Adb8%3A%3A42". | |||
| * If present, the IP prefix length in "target" SHALL be preceded by | * If present, the IP prefix length in "target" SHALL be preceded by | |||
| a percent-encoded slash ("/"): "%2F". The IP prefix length MUST | a percent-encoded slash ("/"): "%2F". The IP prefix length MUST | |||
| represent a decimal integer between 0 and the length of the IP | represent a decimal integer between 0 and the length of the IP | |||
| address in bits, inclusive. | address in bits, inclusive. | |||
| * If "target" contains an IP prefix and the prefix length is | * If "target" contains an IP prefix and the prefix length is | |||
| strictly less than the length of the IP address in bits, the lower | strictly less than the length of the IP address in bits, the lower | |||
| bits of the IP address that are not covered by the prefix length | bits of the IP address that are not covered by the prefix length | |||
| MUST all be set to 0. | MUST all be set to 0. | |||
| * "ipproto" MUST represent a decimal integer between 0 and 255 | * "ipproto" MUST represent a decimal integer between 0 and 255 | |||
| inclusive, or the wildcard value "*". | inclusive or the wildcard value "*". | |||
| target = IPv6prefix / IPv4prefix / reg-name / "*" | target = IPv6prefix / IPv4prefix / reg-name / "*" | |||
| IPv6prefix = IPv6address ["%2F" 1*3DIGIT] | IPv6prefix = IPv6address ["%2F" 1*3DIGIT] | |||
| IPv4prefix = IPv4address ["%2F" 1*2DIGIT] | IPv4prefix = IPv4address ["%2F" 1*2DIGIT] | |||
| ipproto = 1*3DIGIT / "*" | ipproto = 1*3DIGIT / "*" | |||
| Figure 6: URI Template Variable Format | Figure 6: URI Template Variable Format | |||
| IP proxies MAY perform access control using the scoping information | IP proxies MAY perform access control using the scoping information | |||
| provided by the client: if the client is not authorized to access any | provided by the client, i.e., if the client is not authorized to | |||
| of the destinations included in the scope, then the IP proxy can | access any of the destinations included in the scope, then the IP | |||
| immediately fail the request. | proxy can immediately reject the request. | |||
| 4.7. Capsules | 4.7. Capsules | |||
| This document defines multiple new capsule types that allow endpoints | This document defines multiple new capsule types that allow endpoints | |||
| to exchange IP configuration information. Both endpoints MAY send | to exchange IP configuration information. Both endpoints MAY send | |||
| any number of these new capsules. | any number of these new capsules. | |||
| 4.7.1. ADDRESS_ASSIGN Capsule | 4.7.1. ADDRESS_ASSIGN Capsule | |||
| The ADDRESS_ASSIGN capsule (see Section 12.4 for the value of the | The ADDRESS_ASSIGN capsule (capsule type 0x01) allows an endpoint to | |||
| capsule type) allows an endpoint to inform its peer of the list of IP | assign its peer a list of IP addresses or prefixes. Every capsule | |||
| addresses or prefixes it has assigned to it. Every capsule contains | contains the full list of IP prefixes currently assigned to the | |||
| the full list of IP prefixes currently assigned to the receiver. Any | receiver. Any of these addresses can be used as the source address | |||
| of these addresses can be used as the source address on IP packets | on IP packets originated by the receiver of this capsule. | |||
| originated by the receiver of this capsule. | ||||
| ADDRESS_ASSIGN Capsule { | ADDRESS_ASSIGN Capsule { | |||
| Type (i) = ADDRESS_ASSIGN, | Type (i) = 0x01, | |||
| Length (i), | Length (i), | |||
| Assigned Address (..) ..., | Assigned Address (..) ..., | |||
| } | } | |||
| Figure 7: ADDRESS_ASSIGN Capsule Format | Figure 7: ADDRESS_ASSIGN Capsule Format | |||
| The ADDRESS_ASSIGN capsule contains a sequence of zero or more | The ADDRESS_ASSIGN capsule contains a sequence of zero or more | |||
| Assigned Addresses. | Assigned Addresses. | |||
| Assigned Address { | Assigned Address { | |||
| Request ID (i), | Request ID (i), | |||
| IP Version (8), | IP Version (8), | |||
| IP Address (32..128), | IP Address (32..128), | |||
| IP Prefix Length (8), | IP Prefix Length (8), | |||
| } | } | |||
| Figure 8: Assigned Address Format | Figure 8: Assigned Address Format | |||
| Each Assigned Address contains the following fields: | Each Assigned Address contains the following fields: | |||
| Request ID: Request identifier, encoded as a variable-length | Request ID: | |||
| integer. If this address assignment is in response to an Address | Request identifier, encoded as a variable-length integer. If this | |||
| Request (see Section 4.7.2), then this field SHALL contain the | address assignment is in response to an Address Request (see | |||
| value of the corresponding field in the request. Otherwise, this | Section 4.7.2), then this field SHALL contain the value of the | |||
| field SHALL be zero. | corresponding field in the request. Otherwise, this field SHALL | |||
| IP Version: IP Version of this address assignment, encoded as an | be zero. | |||
| unsigned 8-bit integer. MUST be either 4 or 6. | ||||
| IP Address: Assigned IP address. If the IP Version field has value | ||||
| 4, the IP Address field SHALL have a length of 32 bits. If the IP | ||||
| Version field has value 6, the IP Address field SHALL have a | ||||
| length of 128 bits. | ||||
| IP Prefix Length: The number of bits in the IP address that are used | IP Version: | |||
| to define the prefix that is being assigned, encoded as an | IP Version of this address assignment, encoded as an unsigned | |||
| unsigned 8-bit integer. This MUST be less than or equal to the | 8-bit integer. It MUST be either 4 or 6. | |||
| length of the IP Address field, in bits. If the prefix length is | ||||
| equal to the length of the IP address, the receiver of this | IP Address: | |||
| capsule is allowed to send packets from a single source address. | Assigned IP address. If the IP Version field has value 4, the IP | |||
| If the prefix length is less than the length of the IP address, | Address field SHALL have a length of 32 bits. If the IP Version | |||
| the receiver of this capsule is allowed to send packets from any | field has value 6, the IP Address field SHALL have a length of 128 | |||
| source address that falls within the prefix. If the prefix length | bits. | |||
| is strictly less than the length of the IP address in bits, the | ||||
| lower bits of the IP Address field that are not covered by the | IP Prefix Length: | |||
| prefix length MUST all be set to 0. | The number of bits in the IP address that are used to define the | |||
| prefix that is being assigned, encoded as an unsigned 8-bit | ||||
| integer. This MUST be less than or equal to the length of the IP | ||||
| Address field in bits. If the prefix length is equal to the | ||||
| length of the IP address, the receiver of this capsule is allowed | ||||
| to send packets from a single source address. If the prefix | ||||
| length is less than the length of the IP address, the receiver of | ||||
| this capsule is allowed to send packets from any source address | ||||
| that falls within the prefix. If the prefix length is strictly | ||||
| less than the length of the IP address in bits, the lower bits of | ||||
| the IP Address field that are not covered by the prefix length | ||||
| MUST all be set to 0. | ||||
| If any of the capsule fields are malformed upon reception, the | If any of the capsule fields are malformed upon reception, the | |||
| receiver of the capsule MUST follow the error handling procedure | receiver of the capsule MUST follow the error-handling procedure | |||
| defined in Section 3.3 of [HTTP-DGRAM]. | defined in Section 3.3 of [HTTP-DGRAM]. | |||
| If an ADDRESS_ASSIGN capsule does not contain an address that was | If an ADDRESS_ASSIGN capsule does not contain an address that was | |||
| previously transmitted in another ADDRESS_ASSIGN capsule, that | previously transmitted in another ADDRESS_ASSIGN capsule, it | |||
| indicates that the address has been removed. An ADDRESS_ASSIGN | indicates that the address has been removed. An ADDRESS_ASSIGN | |||
| capsule can also be empty, indicating that all addresses have been | capsule can also be empty, indicating that all addresses have been | |||
| removed. | removed. | |||
| In some deployments of IP proxying in HTTP, an endpoint needs to be | In some deployments of IP proxying in HTTP, an endpoint needs to be | |||
| assigned an address by its peer before it knows what source address | assigned an address by its peer before it knows what source address | |||
| to set on its own packets. For example, in the Remote Access VPN | to set on its own packets. For example, in the remote access VPN | |||
| case (Section 8.1) the client cannot send IP packets until it knows | case (Section 8.1), the client cannot send IP packets until it knows | |||
| what address to use. In these deployments, the endpoint that is | what address to use. In these deployments, the endpoint that is | |||
| expecting an address assignment MUST send an ADDRESS_REQUEST capsule. | expecting an address assignment MUST send an ADDRESS_REQUEST capsule. | |||
| This isn't required if the endpoint does not need any address | This isn't required if the endpoint does not need any address | |||
| assignment, for example when it is configured out-of-band with static | assignment, for example, when it is configured out-of-band with | |||
| addresses. | static addresses. | |||
| While ADDRESS_ASSIGN capsules are commonly sent in response to | While ADDRESS_ASSIGN capsules are commonly sent in response to | |||
| ADDRESS_REQUEST capsules, endpoints MAY send ADDRESS_ASSIGN capsules | ADDRESS_REQUEST capsules, endpoints MAY send ADDRESS_ASSIGN capsules | |||
| unprompted. | unprompted. | |||
| 4.7.2. ADDRESS_REQUEST Capsule | 4.7.2. ADDRESS_REQUEST Capsule | |||
| The ADDRESS_REQUEST capsule (see Section 12.4 for the value of the | The ADDRESS_REQUEST capsule (capsule type 0x02) allows an endpoint to | |||
| capsule type) allows an endpoint to request assignment of IP | request assignment of IP addresses from its peer. The capsule allows | |||
| addresses from its peer. The capsule allows the endpoint to | the endpoint to optionally indicate a preference for which address it | |||
| optionally indicate a preference for which address it would get | would get assigned. | |||
| assigned. | ||||
| ADDRESS_REQUEST Capsule { | ADDRESS_REQUEST Capsule { | |||
| Type (i) = ADDRESS_REQUEST, | Type (i) = 0x02, | |||
| Length (i), | Length (i), | |||
| Requested Address (..) ..., | Requested Address (..) ..., | |||
| } | } | |||
| Figure 9: ADDRESS_REQUEST Capsule Format | Figure 9: ADDRESS_REQUEST Capsule Format | |||
| The ADDRESS_REQUEST capsule contains a sequence of one or more | The ADDRESS_REQUEST capsule contains a sequence of one or more | |||
| Requested Addresses. | Requested Addresses. | |||
| Requested Address { | Requested Address { | |||
| Request ID (i), | Request ID (i), | |||
| IP Version (8), | IP Version (8), | |||
| IP Address (32..128), | IP Address (32..128), | |||
| IP Prefix Length (8), | IP Prefix Length (8), | |||
| } | } | |||
| Figure 10: Requested Address Format | Figure 10: Requested Address Format | |||
| Each Requested Address contains the following fields: | Each Requested Address contains the following fields: | |||
| Request ID: Request identifier, encoded as a variable-length | Request ID: | |||
| integer. This is the identifier of this specific address request. | Request identifier, encoded as a variable-length integer. This is | |||
| Each request from a given endpoint carries a different identifier. | the identifier of this specific address request. Each request | |||
| Request IDs MUST NOT be reused by an endpoint, and MUST NOT be | from a given endpoint carries a different identifier. Request IDs | |||
| zero. | MUST NOT be reused by an endpoint and MUST NOT be zero. | |||
| IP Version: IP Version of this address request, encoded as an | ||||
| unsigned 8-bit integer. MUST be either 4 or 6. | IP Version: | |||
| IP Address: Requested IP address. If the IP Version field has value | IP Version of this address request, encoded as an unsigned 8-bit | |||
| 4, the IP Address field SHALL have a length of 32 bits. If the IP | integer. It MUST be either 4 or 6. | |||
| Version field has value 6, the IP Address field SHALL have a | ||||
| length of 128 bits. | IP Address: | |||
| IP Prefix Length: Length of the IP Prefix requested, in bits, | Requested IP address. If the IP Version field has value 4, the IP | |||
| encoded as an unsigned 8-bit integer. MUST be less than or equal | Address field SHALL have a length of 32 bits. If the IP Version | |||
| to the length of the IP Address field, in bits. If the prefix | field has value 6, the IP Address field SHALL have a length of 128 | |||
| length is strictly less than the length of the IP address in bits, | bits. | |||
| the lower bits of the IP Address field that are not covered by the | ||||
| prefix length MUST all be set to 0. | IP Prefix Length: | |||
| Length of the IP Prefix requested in bits, encoded as an unsigned | ||||
| 8-bit integer. It MUST be less than or equal to the length of the | ||||
| IP Address field in bits. If the prefix length is strictly less | ||||
| than the length of the IP address in bits, the lower bits of the | ||||
| IP Address field that are not covered by the prefix length MUST | ||||
| all be set to 0. | ||||
| If the IP address is all-zero (0.0.0.0 or ::), this indicates that | If the IP address is all-zero (0.0.0.0 or ::), this indicates that | |||
| the sender is requesting an address of that address family but does | the sender is requesting an address of that address family but does | |||
| not have a preference for a specific address. In that scenario, the | not have a preference for a specific address. In that scenario, the | |||
| prefix length still indicates the sender's preference for the prefix | prefix length still indicates the sender's preference for the prefix | |||
| length it is requesting. | length it is requesting. | |||
| If any of the capsule fields are malformed upon reception, the | If any of the capsule fields are malformed upon reception, the | |||
| receiver of the capsule MUST follow the error handling procedure | receiver of the capsule MUST follow the error-handling procedure | |||
| defined in Section 3.3 of [HTTP-DGRAM]. | defined in Section 3.3 of [HTTP-DGRAM]. | |||
| Upon receiving the ADDRESS_REQUEST capsule, an endpoint SHOULD assign | Upon receiving the ADDRESS_REQUEST capsule, an endpoint SHOULD assign | |||
| one or more IP addresses to its peer, and then respond with an | one or more IP addresses to its peer and then respond with an | |||
| ADDRESS_ASSIGN capsule to inform the peer of the assignment. For | ADDRESS_ASSIGN capsule to inform the peer of the assignment. For | |||
| each Requested Address, the receiver of the ADDRESS_REQUEST capsule | each Requested Address, the receiver of the ADDRESS_REQUEST capsule | |||
| SHALL respond with an Assigned Address with a matching Request ID. | SHALL respond with an Assigned Address with a matching Request ID. | |||
| If the requested address was assigned, the IP Address and IP Prefix | If the requested address was assigned, the IP Address and IP Prefix | |||
| Length fields in the Assigned Address response SHALL be set to the | Length fields in the Assigned Address response SHALL be set to the | |||
| assigned values. If the requested address was not assigned, the IP | assigned values. If the requested address was not assigned, the IP | |||
| address SHALL be all-zero and the IP Prefix Length SHALL be the | address SHALL be all-zero, and the IP Prefix Length SHALL be the | |||
| maximum length (0.0.0.0/32 or ::/128) to indicate that no address was | maximum length (0.0.0.0/32 or ::/128) to indicate that no address was | |||
| assigned. These address rejections SHOULD NOT be included in | assigned. These address rejections SHOULD NOT be included in | |||
| subsequent ADDRESS_ASSIGN capsules. Note that other Assigned Address | subsequent ADDRESS_ASSIGN capsules. Note that other Assigned Address | |||
| entries that do not correspond to any Request ID can also be | entries that do not correspond to any Request ID can also be | |||
| contained in the same ADDRESS_ASSIGN response. | contained in the same ADDRESS_ASSIGN response. | |||
| If an endpoint receives an ADDRESS_REQUEST capsule that contains zero | If an endpoint receives an ADDRESS_REQUEST capsule that contains zero | |||
| Requested Addresses, it MUST abort the IP proxying request stream. | Requested Addresses, it MUST abort the IP proxying request stream. | |||
| Note that the ordering of Requested Addresses does not carry any | Note that the ordering of Requested Addresses does not carry any | |||
| semantics. Similarly, the Request ID is only meant as a unique | semantics. Similarly, the Request ID is only meant as a unique | |||
| identifier, it does not convey any priority or importance. | identifier; it does not convey any priority or importance. | |||
| 4.7.3. ROUTE_ADVERTISEMENT Capsule | 4.7.3. ROUTE_ADVERTISEMENT Capsule | |||
| The ROUTE_ADVERTISEMENT capsule (see Section 12.4 for the value of | The ROUTE_ADVERTISEMENT capsule (capsule type 0x03) allows an | |||
| the capsule type) allows an endpoint to communicate to its peer that | endpoint to communicate to its peer that it is willing to route | |||
| it is willing to route traffic to a set of IP address ranges. This | traffic to a set of IP address ranges. This indicates that the | |||
| indicates that the sender has an existing route to each address | sender has an existing route to each address range and notifies its | |||
| range, and notifies its peer that if the receiver of the | peer that, if the receiver of the ROUTE_ADVERTISEMENT capsule sends | |||
| ROUTE_ADVERTISEMENT capsule sends IP packets for one of these ranges | IP packets for one of these ranges in HTTP Datagrams, the sender of | |||
| in HTTP Datagrams, the sender of the capsule will forward them along | the capsule will forward them along its preexisting route. Any | |||
| its preexisting route. Any address which is in one of the address | address that is in one of the address ranges can be used as the | |||
| ranges can be used as the destination address on IP packets | destination address on IP packets originated by the receiver of this | |||
| originated by the receiver of this capsule. | capsule. | |||
| ROUTE_ADVERTISEMENT Capsule { | ROUTE_ADVERTISEMENT Capsule { | |||
| Type (i) = ROUTE_ADVERTISEMENT, | Type (i) = 0x03, | |||
| Length (i), | Length (i), | |||
| IP Address Range (..) ..., | IP Address Range (..) ..., | |||
| } | } | |||
| Figure 11: ROUTE_ADVERTISEMENT Capsule Format | Figure 11: ROUTE_ADVERTISEMENT Capsule Format | |||
| The ROUTE_ADVERTISEMENT capsule contains a sequence of zero or more | The ROUTE_ADVERTISEMENT capsule contains a sequence of zero or more | |||
| IP Address Ranges. | IP Address Ranges. | |||
| IP Address Range { | IP Address Range { | |||
| IP Version (8), | IP Version (8), | |||
| Start IP Address (32..128), | Start IP Address (32..128), | |||
| End IP Address (32..128), | End IP Address (32..128), | |||
| IP Protocol (8), | IP Protocol (8), | |||
| } | } | |||
| Figure 12: IP Address Range Format | Figure 12: IP Address Range Format | |||
| Each IP Address Range contains the following fields: | Each IP Address Range contains the following fields: | |||
| IP Version: IP Version of this range, encoded as an unsigned 8-bit | IP Version: | |||
| integer. MUST be either 4 or 6. | IP Version of this range, encoded as an unsigned 8-bit integer. | |||
| Start IP Address and End IP Address: Inclusive start and end IP | It MUST be either 4 or 6. | |||
| address of the advertised range. If the IP Version field has | ||||
| value 4, these fields SHALL have a length of 32 bits. If the IP | Start IP Address and End IP Address: | |||
| Version field has value 6, these fields SHALL have a length of 128 | Inclusive start and end IP address of the advertised range. If | |||
| bits. The Start IP Address MUST be less than or equal to the End | the IP Version field has value 4, these fields SHALL have a length | |||
| IP Address. | of 32 bits. If the IP Version field has value 6, these fields | |||
| IP Protocol: The Internet Protocol Number for traffic that can be | SHALL have a length of 128 bits. The Start IP Address MUST be | |||
| sent to this range, encoded as an unsigned 8-bit integer. If the | less than or equal to the End IP Address. | |||
| value is 0, all protocols are allowed. If the value is not 0, it | ||||
| represents an allowable next header value carried in IP headers | IP Protocol: | |||
| that are directly sent in HTTP datagrams (the outermost IP | The Internet Protocol Number for traffic that can be sent to this | |||
| headers). ICMP traffic is always allowed, regardless of the value | range, encoded as an unsigned 8-bit integer. If the value is 0, | |||
| of this field. | all protocols are allowed. If the value is not 0, it represents | |||
| an allowable next header value carried in IP headers that are sent | ||||
| directly in HTTP Datagrams (the outermost IP headers). ICMP | ||||
| traffic is always allowed, regardless of the value of this field. | ||||
| If any of the capsule fields are malformed upon reception, the | If any of the capsule fields are malformed upon reception, the | |||
| receiver of the capsule MUST follow the error handling procedure | receiver of the capsule MUST follow the error-handling procedure | |||
| defined in Section 3.3 of [HTTP-DGRAM]. | defined in Section 3.3 of [HTTP-DGRAM]. | |||
| Upon receiving the ROUTE_ADVERTISEMENT capsule, an endpoint MAY | Upon receiving the ROUTE_ADVERTISEMENT capsule, an endpoint MAY | |||
| update its local state regarding what its peer is willing to route | update its local state regarding what its peer is willing to route | |||
| (subject to local policy), such as by installing entries in a routing | (subject to local policy), such as by installing entries in a routing | |||
| table. | table. | |||
| Each ROUTE_ADVERTISEMENT contains the full list of address ranges. | Each ROUTE_ADVERTISEMENT contains the full list of address ranges. | |||
| If multiple ROUTE_ADVERTISEMENT capsules are sent in one direction, | If multiple ROUTE_ADVERTISEMENT capsules are sent in one direction, | |||
| each ROUTE_ADVERTISEMENT capsule supersedes prior ones. In other | each ROUTE_ADVERTISEMENT capsule supersedes prior ones. In other | |||
| skipping to change at page 17, line 12 ¶ | skipping to change at line 749 ¶ | |||
| the most recently received ROUTE_ADVERTISEMENT capsule does not | the most recently received ROUTE_ADVERTISEMENT capsule does not | |||
| contain it, the receiver will consider that range withdrawn. | contain it, the receiver will consider that range withdrawn. | |||
| If multiple ranges using the same IP protocol were to overlap, some | If multiple ranges using the same IP protocol were to overlap, some | |||
| routing table implementations might reject them. To prevent overlap, | routing table implementations might reject them. To prevent overlap, | |||
| the ranges are ordered; this places the burden on the sender and | the ranges are ordered; this places the burden on the sender and | |||
| makes verification by the receiver much simpler. If an IP Address | makes verification by the receiver much simpler. If an IP Address | |||
| Range A precedes an IP Address Range B in the same | Range A precedes an IP Address Range B in the same | |||
| ROUTE_ADVERTISEMENT capsule, they MUST follow these requirements: | ROUTE_ADVERTISEMENT capsule, they MUST follow these requirements: | |||
| * IP Version of A MUST be less than or equal to IP Version of B | * The IP Version of A MUST be less than or equal to the IP Version | |||
| of B. | ||||
| * If the IP Version of A and B are equal, the IP Protocol of A MUST | * If the IP Version of A and B are equal, the IP Protocol of A MUST | |||
| be less than or equal to IP Protocol of B. | be less than or equal to the IP Protocol of B. | |||
| * If the IP Version and IP Protocol of A and B are both equal, the | * If the IP Version and IP Protocol of A and B are both equal, the | |||
| End IP Address of A MUST be strictly less than the Start IP | End IP Address of A MUST be strictly less than the Start IP | |||
| Address of B. | Address of B. | |||
| If an endpoint receives a ROUTE_ADVERTISEMENT capsule that does not | If an endpoint receives a ROUTE_ADVERTISEMENT capsule that does not | |||
| meet these requirements, it MUST abort the IP proxying request | meet these requirements, it MUST abort the IP proxying request | |||
| stream. | stream. | |||
| Since setting the IP protocol to zero indicates all protocols are | Since setting the IP protocol to zero indicates all protocols are | |||
| allowed, the requirements above make it possible for two routes to | allowed, the requirements above make it possible for two routes to | |||
| overlap when one has IP protocol set to zero and the other set to | overlap when one has its IP protocol set to zero and the other has it | |||
| non-zero. Endpoints MUST NOT send a ROUTE_ADVERTISEMENT capsule with | set to non-zero. Endpoints MUST NOT send a ROUTE_ADVERTISEMENT | |||
| routes that overlap in such a way. Validating this requirement is | capsule with routes that overlap in such a way. Validating this | |||
| OPTIONAL, but if an endpoint detects the violation, it MUST abort the | requirement is OPTIONAL, but if an endpoint detects the violation, it | |||
| IP proxying request stream. | MUST abort the IP proxying request stream. | |||
| 4.8. IPv6 Extension Headers | 4.8. IPv6 Extension Headers | |||
| Both request scoping (see Section 4.6) and the ROUTE_ADVERTISEMENT | Both request scoping (see Section 4.6) and the ROUTE_ADVERTISEMENT | |||
| capsule (see Section 4.7.3) use IP protocol numbers. These numbers | capsule (see Section 4.7.3) use Internet Protocol Numbers. These | |||
| represent both upper layers (as defined in Section 2 of [IPv6], | numbers represent both upper layers (as defined in Section 2 of | |||
| examples include TCP and UDP) and IPv6 extension headers (as defined | [IPv6], with examples that include TCP and UDP) and IPv6 extension | |||
| in Section 4 of [IPv6], examples include Fragment and Options | headers (as defined in Section 4 of [IPv6], with examples that | |||
| headers). IP proxies MAY reject requests to scope to protocol | include Fragment and Options headers). IP proxies MAY reject | |||
| numbers that are used for extension headers. Upon receiving packets, | requests to scope to protocol numbers that are used for extension | |||
| implementations that support scoping or routing by IP protocol number | headers. Upon receiving packets, implementations that support | |||
| MUST walk the chain of extensions to find outermost non-extension IP | scoping or routing by Internet Protocol Number MUST walk the chain of | |||
| protocol number to match against the scoping rule. Note that the | extensions to find the outermost non-extension Internet Protocol | |||
| ROUTE_ADVERTISEMENT capsule uses IP protocol number 0 to indicate | Number to match against the scoping rule. Note that the | |||
| that all protocols are allowed, it does not restrict the route to the | ROUTE_ADVERTISEMENT capsule uses Internet Protocol Number 0 to | |||
| IPv6 Hop-by-Hop Options Header (Section 4.3 of [IPv6]). | indicate that all protocols are allowed; it does not restrict the | |||
| route to the IPv6 Hop-by-Hop Options header (Section 4.3 of [IPv6]). | ||||
| 5. Context Identifiers | 5. Context Identifiers | |||
| The mechanism for proxying IP in HTTP defined in this document allows | The mechanism for proxying IP in HTTP defined in this document allows | |||
| future extensions to exchange HTTP Datagrams that carry different | future extensions to exchange HTTP Datagrams that carry different | |||
| semantics from IP payloads. Some of these extensions can augment IP | semantics from IP payloads. Some of these extensions can augment IP | |||
| payloads with additional data or compress IP header fields, while | payloads with additional data or compress IP header fields, while | |||
| others can exchange data that is completely separate from IP | others can exchange data that is completely separate from IP | |||
| payloads. In order to accomplish this, all HTTP Datagrams associated | payloads. In order to accomplish this, all HTTP Datagrams associated | |||
| with IP proxying request streams start with a Context ID field; see | with IP proxying request streams start with a Context ID field; see | |||
| skipping to change at page 18, line 46 ¶ | skipping to change at line 829 ¶ | |||
| header fields or capsules to register Context IDs. Depending on the | header fields or capsules to register Context IDs. Depending on the | |||
| method being used, it is possible for datagrams to be received with | method being used, it is possible for datagrams to be received with | |||
| Context IDs that have not yet been registered. For instance, this | Context IDs that have not yet been registered. For instance, this | |||
| can be due to reordering of the packet containing the datagram and | can be due to reordering of the packet containing the datagram and | |||
| the packet containing the registration message during transmission. | the packet containing the registration message during transmission. | |||
| 6. HTTP Datagram Payload Format | 6. HTTP Datagram Payload Format | |||
| When associated with IP proxying request streams, the HTTP Datagram | When associated with IP proxying request streams, the HTTP Datagram | |||
| Payload field of HTTP Datagrams (see [HTTP-DGRAM]) has the format | Payload field of HTTP Datagrams (see [HTTP-DGRAM]) has the format | |||
| defined in Figure 13. Note that when HTTP Datagrams are encoded | defined in Figure 13. Note that, when HTTP Datagrams are encoded | |||
| using QUIC DATAGRAM frames, the Context ID field defined below | using QUIC DATAGRAM frames, the Context ID field defined below | |||
| directly follows the Quarter Stream ID field which is at the start of | directly follows the Quarter Stream ID field that is at the start of | |||
| the QUIC DATAGRAM frame payload: | the QUIC DATAGRAM frame payload: | |||
| IP Proxying HTTP Datagram Payload { | IP Proxying HTTP Datagram Payload { | |||
| Context ID (i), | Context ID (i), | |||
| Payload (..), | Payload (..), | |||
| } | } | |||
| Figure 13: IP Proxying HTTP Datagram Format | Figure 13: IP Proxying HTTP Datagram Format | |||
| The IP Proxying HTTP Datagram Payload contains the following fields: | The IP Proxying HTTP Datagram Payload contains the following fields: | |||
| Context ID: A variable-length integer that contains the value of the | Context ID: | |||
| Context ID. If an HTTP/3 datagram which carries an unknown | A variable-length integer that contains the value of the Context | |||
| Context ID is received, the receiver SHALL either drop that | ID. If an HTTP/3 datagram that carries an unknown Context ID is | |||
| datagram silently or buffer it temporarily (on the order of a | received, the receiver SHALL either drop that datagram silently or | |||
| round trip) while awaiting the registration of the corresponding | buffer it temporarily (on the order of a round trip) while | |||
| Context ID. | awaiting the registration of the corresponding Context ID. | |||
| Payload: The payload of the datagram, whose semantics depend on | ||||
| value of the previous field. Note that this field can be empty. | Payload: | |||
| The payload of the datagram, whose semantics depend on value of | ||||
| the previous field. Note that this field can be empty. | ||||
| IP packets are encoded using HTTP Datagrams with the Context ID set | IP packets are encoded using HTTP Datagrams with the Context ID set | |||
| to zero. When the Context ID is set to zero, the Payload field | to zero. When the Context ID is set to zero, the Payload field | |||
| contains a full IP packet (from the IP Version field until the last | contains a full IP packet (from the IP Version field until the last | |||
| byte of the IP Payload). | byte of the IP payload). | |||
| 7. IP Packet Handling | 7. IP Packet Handling | |||
| This document defines a tunneling mechanism that is conceptually an | This document defines a tunneling mechanism that is conceptually an | |||
| IP link. However, because links are attached to IP routers, | IP link. However, because links are attached to IP routers, | |||
| implementations might need to handle some of the responsibilities of | implementations might need to handle some of the responsibilities of | |||
| IP routers if they do not delegate them to another implementation | IP routers if they do not delegate them to another implementation, | |||
| such as a kernel. | such as a kernel. | |||
| 7.1. Link Operation | 7.1. Link Operation | |||
| The IP forwarding tunnels described in this document are not fully | The IP forwarding tunnels described in this document are not fully | |||
| featured "interfaces" in the IPv6 addressing architecture sense | featured "interfaces" in the IPv6 addressing architecture sense | |||
| [IPv6-ADDR]. In particular, they do not necessarily have IPv6 link- | [IPv6-ADDR]. In particular, they do not necessarily have IPv6 link- | |||
| local addresses. Additionally, IPv6 stateless autoconfiguration or | local addresses. Additionally, IPv6 stateless autoconfiguration or | |||
| router advertisement messages are not used in such interfaces, and | router advertisement messages are not used in such interfaces, and | |||
| neither is neighbor discovery. | neither is neighbor discovery. | |||
| Clients MAY optimistically start sending proxied IP packets before | When using HTTP/2 or HTTP/3, a client MAY optimistically start | |||
| receiving the response to its IP proxying request, noting however | sending proxied IP packets before receiving the response to its IP | |||
| that those may not be processed by the IP proxy if it responds to the | proxying request, noting however that those may not be processed by | |||
| request with a failure, or if the datagrams are received by the IP | the IP proxy if it responds to the request with a failure or if the | |||
| proxy before the request. Since receiving addresses and routes is | datagrams are received by the IP proxy before the request. Since | |||
| required in order to know that a packet can be sent through the | receiving addresses and routes is required in order to know that a | |||
| tunnel, such optimistic packets might be dropped by the IP proxy if | packet can be sent through the tunnel, such optimistic packets might | |||
| it chooses to provide different addressing or routing information | be dropped by the IP proxy if it chooses to provide different | |||
| than what the client assumed. | addressing or routing information than what the client assumed. | |||
| Note that it is possible for multiple proxied IP packets to be | Note that it is possible for multiple proxied IP packets to be | |||
| encapsulated in the same outer packet, for example because a QUIC | encapsulated in the same outer packet, for example, because a QUIC | |||
| packet can carry two QUIC DATAGRAM frames. It is also possible for a | packet can carry more than one QUIC DATAGRAM frame. It is also | |||
| proxied IP packet to span multiple outer packets, because a DATAGRAM | possible for a proxied IP packet to span multiple outer packets, | |||
| capsule can be split across multiple QUIC or TCP packets. | because a DATAGRAM capsule can be split across multiple QUIC or TCP | |||
| packets. | ||||
| 7.2. Routing Operation | 7.2. Routing Operation | |||
| The requirements in this section are a repetition of requirements | The requirements in this section are a repetition of requirements | |||
| that apply to IP routers in general, and might not apply to | that apply to IP routers in general and might not apply to | |||
| implementations of IP proxying that rely on external software for | implementations of IP proxying that rely on external software for | |||
| routing. | routing. | |||
| When an endpoint receives an HTTP Datagram containing an IP packet, | When an endpoint receives an HTTP Datagram containing an IP packet, | |||
| it will parse the packet's IP header, perform any local policy checks | it will parse the packet's IP header, perform any local policy checks | |||
| (e.g., source address validation), check their routing table to pick | (e.g., source address validation), check their routing table to pick | |||
| an outbound interface, and then send the IP packet on that interface | an outbound interface, and then send the IP packet on that interface | |||
| or pass it to a local application. The endpoint can also choose to | or pass it to a local application. The endpoint can also choose to | |||
| drop any received packets instead of forwarding them. If a received | drop any received packets instead of forwarding them. If a received | |||
| IP packet fails any correctness or policy checks, that is a | IP packet fails any correctness or policy checks, that is a | |||
| forwarding error, not a protocol violation as far as IP proxying is | forwarding error, not a protocol violation, as far as IP proxying is | |||
| concerned; see Section 7.2.1. IP proxying endpoints MAY implement | concerned; see Section 7.2.1. IP proxying endpoints MAY implement | |||
| additional filtering policies on the IP packets they forward. | additional filtering policies on the IP packets they forward. | |||
| In the other direction, when an endpoint receives an IP packet, it | In the other direction, when an endpoint receives an IP packet, it | |||
| checks to see if the packet matches the routes mapped for an IP | checks to see if the packet matches the routes mapped for an IP | |||
| tunnel, and performs the same forwarding checks as above before | tunnel and performs the same forwarding checks as above before | |||
| transmitting the packet over HTTP Datagrams. | transmitting the packet over HTTP Datagrams. | |||
| When IP proxying endpoints forward IP packets between different | When IP proxying endpoints forward IP packets between different | |||
| links, they will decrement the IP Hop Count (or TTL) upon | links, they will decrement the IP Hop Count (or TTL) upon | |||
| encapsulation, but not upon decapsulation. In other words, the Hop | encapsulation but not upon decapsulation. In other words, the Hop | |||
| Count is decremented right before an IP packet is transmitted in an | Count is decremented right before an IP packet is transmitted in an | |||
| HTTP Datagram. This prevents infinite loops in the presence of | HTTP Datagram. This prevents infinite loops in the presence of | |||
| routing loops, and matches the choices in IPsec [IPSEC]. This does | routing loops and matches the choices in IPsec [IPSEC]. This does | |||
| not apply to IP packets generated by the IP proxying endpoint itself. | not apply to IP packets generated by the IP proxying endpoint itself. | |||
| Implementers need to ensure that they do not forward any link-local | Implementers need to ensure that they do not forward any link-local | |||
| traffic beyond the IP proxying interface that it was received on. IP | traffic beyond the IP proxying interface that it was received on. IP | |||
| proxying endpoints also need to properly reply to packets destined to | proxying endpoints also need to properly reply to packets destined to | |||
| link-local multicast addresses. | link-local multicast addresses. | |||
| IPv6 requires that every link have an MTU of at least 1280 bytes | IPv6 requires that every link have an MTU of at least 1280 bytes | |||
| [IPv6]. Since IP proxying in HTTP conveys IP packets in HTTP | [IPv6]. Since IP proxying in HTTP conveys IP packets in HTTP | |||
| Datagrams and those can in turn be sent in QUIC DATAGRAM frames which | Datagrams and those can in turn be sent in QUIC DATAGRAM frames that | |||
| cannot be fragmented [DGRAM], the MTU of an IP tunnel can be limited | cannot be fragmented [DGRAM], the MTU of an IP tunnel can be limited | |||
| by the MTU of the QUIC connection that IP proxying is operating over. | by the MTU of the QUIC connection that IP proxying is operating over. | |||
| This can lead to situations where the IPv6 minimum link MTU is | This can lead to situations where the IPv6 minimum link MTU is | |||
| violated. IP proxying endpoints that operate as routers and support | violated. IP proxying endpoints that operate as routers and support | |||
| IPv6 MUST ensure that the IP tunnel link MTU is at least 1280 (i.e., | IPv6 MUST ensure that the IP tunnel link MTU is at least 1280 bytes | |||
| that they can send HTTP Datagrams with payloads of at least 1280 | (i.e., that they can send HTTP Datagrams with payloads of at least | |||
| bytes). This can be accomplished using various techniques: | 1280 bytes). This can be accomplished using various techniques: | |||
| * if both IP proxying endpoints know for certain that HTTP | * If both IP proxying endpoints know for certain that HTTP | |||
| intermediaries are not in use, the endpoints can pad the QUIC | intermediaries are not in use, the endpoints can pad the QUIC | |||
| INITIAL packets of the outer QUIC connection that IP proxying is | INITIAL packets of the outer QUIC connection that IP proxying is | |||
| running over. (Assuming QUIC version 1 is in use, the overhead is | running over. (Assuming QUIC version 1 is in use, the overhead is | |||
| 1 byte type, 20 bytes maximal connection ID length, 4 bytes | 1 byte for the type, 20 bytes for the maximal connection ID | |||
| maximal packet number length, 1 byte DATAGRAM frame type, 8 bytes | length, 4 bytes for the maximal packet number length, 1 byte for | |||
| maximal quarter stream ID, one byte for the zero Context ID, and | the DATAGRAM frame type, 8 bytes for the maximal Quarter Stream | |||
| 16 bytes for the AEAD authentication tag, for a total of 51 bytes | ID, 1 byte for the zero Context ID, and 16 bytes for the | |||
| of overhead which corresponds to padding QUIC INITIAL packets to | Authenticated Encryption with Associated Data (AEAD) | |||
| 1331 bytes or more.) | authentication tag, for a total of 51 bytes of overhead, which | |||
| corresponds to padding QUIC INITIAL packets to 1331 bytes or | ||||
| more.) | ||||
| * IP proxying endpoints can also send ICMPv6 echo requests with 1232 | * IP proxying endpoints can also send ICMPv6 echo requests with 1232 | |||
| bytes of data to ascertain the link MTU and tear down the tunnel | bytes of data to ascertain the link MTU and tear down the tunnel | |||
| if they do not receive a response. Unless endpoints have an out- | if they do not receive a response. Unless endpoints have an out- | |||
| of-band means of guaranteeing that the previous techniques is | of-band means of guaranteeing that the previous techniques are | |||
| sufficient, they MUST use this method. If an endpoint does not | sufficient, they MUST use this method. If an endpoint does not | |||
| know an IPv6 address of its peer, it can send the ICMPv6 echo | know an IPv6 address of its peer, it can send the ICMPv6 echo | |||
| request to the link local all nodes multicast address (ff02::1). | request to the link-local all nodes multicast address (ff02::1). | |||
| If an endpoint is using QUIC DATAGRAM frames to convey IPv6 packets, | If an endpoint is using QUIC DATAGRAM frames to convey IPv6 packets | |||
| and it detects that the QUIC MTU is too low to allow sending 1280 | and it detects that the QUIC MTU is too low to allow sending 1280 | |||
| bytes, it MUST abort the IP proxying request stream. | bytes, it MUST abort the IP proxying request stream. | |||
| 7.2.1. Error Signalling | 7.2.1. Error Signalling | |||
| Since IP proxying endpoints often forward IP packets onwards to other | Since IP proxying endpoints often forward IP packets onwards to other | |||
| network interfaces, they need to handle errors in the forwarding | network interfaces, they need to handle errors in the forwarding | |||
| process. For example, forwarding can fail if the endpoint does not | process. For example, forwarding can fail if the endpoint does not | |||
| have a route for the destination address, or if it is configured to | have a route for the destination address, if it is configured to | |||
| reject a destination prefix by policy, or if the MTU of the outgoing | reject a destination prefix by policy, or if the MTU of the outgoing | |||
| link is lower than the size of the packet to be forwarded. In such | link is lower than the size of the packet to be forwarded. In such | |||
| scenarios, IP proxying endpoints SHOULD use ICMP [ICMP] [ICMPv6] to | scenarios, IP proxying endpoints SHOULD use ICMP [ICMP] [ICMPv6] to | |||
| signal the forwarding error to its peer by generating ICMP packets | signal the forwarding error to its peer by generating ICMP packets | |||
| and sending them using HTTP Datagrams. | and sending them using HTTP Datagrams. | |||
| Endpoints are free to select the most appropriate ICMP errors to | Endpoints are free to select the most appropriate ICMP errors to | |||
| send. Some examples that are relevant for IP proxying include: | send. Some examples that are relevant for IP proxying include the | |||
| following: | ||||
| * For invalid source addresses, send Destination Unreachable | * For invalid source addresses, send Destination Unreachable | |||
| (Section 3.1 of [ICMPv6]) with code 5, "Source address failed | (Section 3.1 of [ICMPv6]) with code 5, "Source address failed | |||
| ingress/egress policy". | ingress/egress policy". | |||
| * For unroutable destination addresses, send Destination Unreachable | * For unroutable destination addresses, send Destination Unreachable | |||
| (Section 3.1 of [ICMPv6]) with a code 0, "No route to | (Section 3.1 of [ICMPv6]) with code 0, "No route to destination", | |||
| destination", or code 1, "Communication with destination | or code 1, "Communication with destination administratively | |||
| administratively prohibited". | prohibited". | |||
| * For packets that cannot fit within the MTU of the outgoing link, | * For packets that cannot fit within the MTU of the outgoing link, | |||
| send Packet Too Big (Section 3.2 of [ICMPv6]). | send Packet Too Big (Section 3.2 of [ICMPv6]). | |||
| In order to receive these errors, endpoints need to be prepared to | In order to receive these errors, endpoints need to be prepared to | |||
| receive ICMP packets. If an endpoint does not send | receive ICMP packets. If an endpoint does not send | |||
| ROUTE_ADVERTISEMENT capsules, such as a client opening an IP flow | ROUTE_ADVERTISEMENT capsules, such as a client opening an IP flow | |||
| through an IP proxy, it SHOULD process proxied ICMP packets from its | through an IP proxy, it SHOULD process proxied ICMP packets from its | |||
| peer in order to receive these errors. Note that ICMP messages can | peer in order to receive these errors. Note that ICMP messages can | |||
| originate from a source address different from that of the IP | originate from a source address different from that of the IP | |||
| proxying peer, and also from outside the target if scoping is in use | proxying peer and also from outside the target if scoping is in use | |||
| (see Section 4.6). | (see Section 4.6). | |||
| 8. Examples | 8. Examples | |||
| IP proxying in HTTP enables many different use cases that can benefit | IP proxying in HTTP enables many different use cases that can benefit | |||
| from IP packet proxying and tunnelling. These examples are provided | from IP packet proxying and tunnelling. These examples are provided | |||
| to help illustrate some of the ways in which IP proxying in HTTP can | to help illustrate some of the ways in which IP proxying in HTTP can | |||
| be used. | be used. | |||
| 8.1. Remote Access VPN | 8.1. Remote Access VPN | |||
| The following example shows a point-to-network VPN setup, where a | The following example shows a point-to-network VPN setup, where a | |||
| client receives a set of local addresses, and can send to any remote | client receives a set of local addresses and can send to any remote | |||
| host through the IP proxy. Such VPN setups can be either full-tunnel | host through the IP proxy. Such VPN setups can be either full-tunnel | |||
| or split-tunnel. | or split-tunnel. | |||
| +--------+ IP A IP B +--------+ +---> IP D | +--------+ IP A IP B +--------+ +---> IP D | |||
| | +--------------------+ IP | IP C | | | +--------------------+ IP | IP C | | |||
| | Client | IP Subnet C <--> ? | Proxy +-----------+---> IP E | | Client | IP Subnet C <--> ? | Proxy +-----------+---> IP E | |||
| | +--------------------+ | | | | +--------------------+ | | | |||
| +--------+ +--------+ +---> IP ... | +--------+ +--------+ +---> IP ... | |||
| Figure 14: VPN Tunnel Setup | Figure 14: VPN Tunnel Setup | |||
| skipping to change at page 24, line 52 ¶ | skipping to change at line 1119 ¶ | |||
| Figure 16: VPN Split-Tunnel Example | Figure 16: VPN Split-Tunnel Example | |||
| 8.2. Site-to-Site VPN | 8.2. Site-to-Site VPN | |||
| The following example shows how to connect a branch office network to | The following example shows how to connect a branch office network to | |||
| a corporate network such that all machines on those networks can | a corporate network such that all machines on those networks can | |||
| communicate. In this example, the IP proxying client is attached to | communicate. In this example, the IP proxying client is attached to | |||
| the branch office network 192.0.2.0/24, and the IP proxy is attached | the branch office network 192.0.2.0/24, and the IP proxy is attached | |||
| to the corporate network 203.0.113.0/24. There are legacy clients on | to the corporate network 203.0.113.0/24. There are legacy clients on | |||
| the branch office network that only allow maintenance requests from | the branch office network that only allow maintenance requests from | |||
| machines on their subnet, so the IP Proxy is provisioned with an IP | machines on their subnet, so the IP proxy is provisioned with an IP | |||
| address from that subnet. | address from that subnet. | |||
| 192.0.2.1 <--+ +--------+ +-------+ +---> 203.0.113.9 | 192.0.2.1 <--+ +--------+ +-------+ +---> 203.0.113.9 | |||
| | | +-------------+ IP | | | | | +-------------+ IP | | | |||
| 192.0.2.2 <--+---+ Client | IP Proxying | Proxy +---+---> 203.0.113.8 | 192.0.2.2 <--+---+ Client | IP Proxying | Proxy +---+---> 203.0.113.8 | |||
| | | +-------------+ | | | | | +-------------+ | | | |||
| 192.0.2.3 <--+ +--------+ +-------+ +---> 203.0.113.7 | 192.0.2.3 <--+ +--------+ +-------+ +---> 203.0.113.7 | |||
| Figure 17: Site-to-site VPN Example | Figure 17: Site-to-Site VPN Example | |||
| In this case, the client does not specify any scope in its request. | In this case, the client does not specify any scope in its request. | |||
| The IP proxy assigns the client an IPv4 address (203.0.113.100) and a | The IP proxy assigns the client an IPv4 address (203.0.113.100) and a | |||
| split-tunnel route to the corporate network (203.0.113.0/24). The | split-tunnel route to the corporate network (203.0.113.0/24). The | |||
| client assigns the IP proxy an IPv4 address (192.0.2.200) and a | client assigns the IP proxy an IPv4 address (192.0.2.200) and a | |||
| split-tunnel route to the branch office network (192.0.2.0/24). This | split-tunnel route to the branch office network (192.0.2.0/24). This | |||
| allows hosts on both networks to communicate with each other, and | allows hosts on both networks to communicate with each other and | |||
| allows the IP proxy to perform maintenance on legacy hosts in the | allows the IP proxy to perform maintenance on legacy hosts in the | |||
| branch office. Note that IP proxying endpoints will decrement the IP | branch office. Note that IP proxying endpoints will decrement the IP | |||
| Hop Count (or TTL) when encapsulating forwarded packets, so protocols | Hop Count (or TTL) when encapsulating forwarded packets, so protocols | |||
| that require that field be set to 255 will not function. | that require that field be set to 255 will not function. | |||
| [[ From Client ]] [[ From IP Proxy ]] | [[ From Client ]] [[ From IP Proxy ]] | |||
| SETTINGS | SETTINGS | |||
| H3_DATAGRAM = 1 | H3_DATAGRAM = 1 | |||
| skipping to change at page 26, line 35 ¶ | skipping to change at line 1200 ¶ | |||
| DATAGRAM | DATAGRAM | |||
| Quarter Stream ID = 11 | Quarter Stream ID = 11 | |||
| Context ID = 0 | Context ID = 0 | |||
| Payload = Encapsulated IP Packet | Payload = Encapsulated IP Packet | |||
| DATAGRAM | DATAGRAM | |||
| Quarter Stream ID = 11 | Quarter Stream ID = 11 | |||
| Context ID = 0 | Context ID = 0 | |||
| Payload = Encapsulated IP Packet | Payload = Encapsulated IP Packet | |||
| Figure 18: Site-to-site VPN Capsule Example | Figure 18: Site-to-Site VPN Capsule Example | |||
| 8.3. IP Flow Forwarding | 8.3. IP Flow Forwarding | |||
| The following example shows an IP flow forwarding setup, where a | The following example shows an IP flow forwarding setup, where a | |||
| client requests to establish a forwarding tunnel to | client requests to establish a forwarding tunnel to | |||
| target.example.com using SCTP (IP protocol 132), and receives a | target.example.com using the Stream Control Transmission Protocol | |||
| single local address and remote address it can use for transmitting | (SCTP) (IP protocol 132) and receives a single local address and | |||
| packets. A similar approach could be used for any other IP protocol | remote address it can use for transmitting packets. A similar | |||
| that isn't easily proxied with existing HTTP methods, such as ICMP, | approach could be used for any other IP protocol that isn't easily | |||
| ESP, etc. | proxied with existing HTTP methods, such as ICMP, Encapsulating | |||
| Security Payload (ESP), etc. | ||||
| +--------+ IP A IP B +--------+ | +--------+ IP A IP B +--------+ | |||
| | +-------------------+ IP | IP C | | +-------------------+ IP | IP C | |||
| | Client | IP C <--> D | Proxy +---------> IP D | | Client | IP C <--> D | Proxy +---------> IP D | |||
| | +-------------------+ | | | +-------------------+ | | |||
| +--------+ +--------+ | +--------+ +--------+ | |||
| Figure 19: Proxied Flow Setup | Figure 19: Proxied Flow Setup | |||
| In this case, the client specfies both a target hostname and an IP | In this case, the client specifies both a target hostname and an | |||
| protocol number in the scope of its request, indicating that it only | Internet Protocol Number in the scope of its request, indicating that | |||
| needs to communicate with a single host. The IP proxy is able to | it only needs to communicate with a single host. The IP proxy is | |||
| perform DNS resolution on behalf of the client and allocate a | able to perform DNS resolution on behalf of the client and allocate a | |||
| specific outbound socket for the client instead of allocating an | specific outbound socket for the client instead of allocating an | |||
| entire IP address to the client. In this regard, the request is | entire IP address to the client. In this regard, the request is | |||
| similar to a regular CONNECT proxy request. | similar to a regular CONNECT proxy request. | |||
| The IP proxy assigns a single IPv6 address to the client | The IP proxy assigns a single IPv6 address to the client | |||
| (2001:db8:1234::a) and a route to a single IPv6 host | (2001:db8:1234::a) and a route to a single IPv6 host | |||
| (2001:db8:3456::b), scoped to SCTP. The client can send and receive | (2001:db8:3456::b) scoped to SCTP. The client can send and receive | |||
| SCTP IP packets to the remote host. | SCTP IP packets to the remote host. | |||
| [[ From Client ]] [[ From IP Proxy ]] | [[ From Client ]] [[ From IP Proxy ]] | |||
| SETTINGS | SETTINGS | |||
| H3_DATAGRAM = 1 | H3_DATAGRAM = 1 | |||
| SETTINGS | SETTINGS | |||
| ENABLE_CONNECT_PROTOCOL = 1 | ENABLE_CONNECT_PROTOCOL = 1 | |||
| H3_DATAGRAM = 1 | H3_DATAGRAM = 1 | |||
| skipping to change at page 29, line 10 ¶ | skipping to change at line 1286 ¶ | |||
| Context ID = 0 | Context ID = 0 | |||
| Payload = Encapsulated SCTP/IP Packet | Payload = Encapsulated SCTP/IP Packet | |||
| Figure 20: Proxied SCTP Flow Example | Figure 20: Proxied SCTP Flow Example | |||
| 8.4. Proxied Connection Racing | 8.4. Proxied Connection Racing | |||
| The following example shows a setup where a client is proxying UDP | The following example shows a setup where a client is proxying UDP | |||
| packets through an IP proxy in order to control connection | packets through an IP proxy in order to control connection | |||
| establishment racing through an IP proxy, as defined in Happy | establishment racing through an IP proxy, as defined in Happy | |||
| Eyeballs [HEv2]. This example is a variant of the proxied flow, but | Eyeballs [HEv2]. This example is a variant of the proxied flow but | |||
| highlights how IP-level proxying can enable new capabilities even for | highlights how IP-level proxying can enable new capabilities, even | |||
| TCP and UDP. | for TCP and UDP. | |||
| +--------+ IP A IP B +--------+ IP C | +--------+ IP A IP B +--------+ IP C | |||
| | +-------------------+ |<------------> IP E | | +-------------------+ |<------------> IP E | |||
| | Client | IP C <--> E | IP | | | Client | IP C <--> E | IP | | |||
| | | D <--> F | Proxy | | | | D <--> F | Proxy | | |||
| | +-------------------+ |<------------> IP F | | +-------------------+ |<------------> IP F | |||
| +--------+ +--------+ IP D | +--------+ +--------+ IP D | |||
| Figure 21: Proxied Connection Racing Setup | Figure 21: Proxied Connection Racing Setup | |||
| As with proxied flows, the client specifies both a target hostname | As with proxied flows, the client specifies both a target hostname | |||
| and an IP protocol number in the scope of its request. When the IP | and an Internet Protocol Number in the scope of its request. When | |||
| proxy performs DNS resolution on behalf of the client, it can send | the IP proxy performs DNS resolution on behalf of the client, it can | |||
| the various remote address options to the client as separate routes. | send the various remote address options to the client as separate | |||
| It can also ensure that the client has both IPv4 and IPv6 addresses | routes. It can also ensure that the client has both IPv4 and IPv6 | |||
| assigned. | addresses assigned. | |||
| The IP proxy assigns both an IPv4 address (192.0.2.3) and an IPv6 | The IP proxy assigns both an IPv4 address (192.0.2.3) and an IPv6 | |||
| address (2001:db8:1234::a) to the client, as well as an IPv4 route | address (2001:db8:1234::a) to the client, as well as an IPv4 route | |||
| (198.51.100.2) and an IPv6 route (2001:db8:3456::b), which represent | (198.51.100.2) and an IPv6 route (2001:db8:3456::b), which represent | |||
| the resolved addresses of the target hostname, scoped to UDP. The | the resolved addresses of the target hostname, scoped to UDP. The | |||
| client can send and receive UDP IP packets to either one of the IP | client can send and receive UDP IP packets to either one of the IP | |||
| proxy addresses to enable Happy Eyeballs through the IP proxy. | proxy addresses to enable Happy Eyeballs through the IP proxy. | |||
| [[ From Client ]] [[ From IP Proxy ]] | [[ From Client ]] [[ From IP Proxy ]] | |||
| skipping to change at page 31, line 4 ¶ | skipping to change at line 1378 ¶ | |||
| 9. Extensibility Considerations | 9. Extensibility Considerations | |||
| Extensions to IP proxying in HTTP can define behavior changes to this | Extensions to IP proxying in HTTP can define behavior changes to this | |||
| mechanism. Such extensions SHOULD define new capsule types to | mechanism. Such extensions SHOULD define new capsule types to | |||
| exchange configuration information if needed. It is RECOMMENDED for | exchange configuration information if needed. It is RECOMMENDED for | |||
| extensions that modify addressing to specify that their extension | extensions that modify addressing to specify that their extension | |||
| capsules be sent before the ADDRESS_ASSIGN capsule and that they do | capsules be sent before the ADDRESS_ASSIGN capsule and that they do | |||
| not take effect until the ADDRESS_ASSIGN capsule is parsed. This | not take effect until the ADDRESS_ASSIGN capsule is parsed. This | |||
| allows modifications to address assignment to operate atomically. | allows modifications to address assignment to operate atomically. | |||
| Similarly, extensions that modify routing SHOULD behave similarly | Similarly, extensions that modify routing SHOULD behave similarly | |||
| with regard to the ROUTE_ADVERTISEMENT capsule. | with regard to the ROUTE_ADVERTISEMENT capsule. | |||
| 10. Performance Considerations | 10. Performance Considerations | |||
| Bursty traffic can often lead to temporally-correlated packet losses; | Bursty traffic can often lead to temporally correlated packet losses; | |||
| in turn, this can lead to suboptimal responses from congestion | in turn, this can lead to suboptimal responses from congestion | |||
| controllers in protocols running inside the tunnel. To avoid this, | controllers in protocols running inside the tunnel. To avoid this, | |||
| IP proxying endpoints SHOULD strive to avoid increasing burstiness of | IP proxying endpoints SHOULD strive to avoid increasing burstiness of | |||
| IP traffic; they SHOULD NOT queue packets in order to increase | IP traffic; they SHOULD NOT queue packets in order to increase | |||
| batching beyond the minimal amount required to take advantage of | batching beyond the minimal amount required to take advantage of | |||
| hardware offloads. | hardware offloads. | |||
| When the protocol running inside the tunnel uses congestion control | When the protocol running inside the tunnel uses congestion control | |||
| (e.g., [TCP] or [QUIC]), the proxied traffic will incur at least two | (e.g., [TCP] or [QUIC]), the proxied traffic will incur at least two | |||
| nested congestion controllers. When tunneled packets are sent using | nested congestion controllers. When tunneled packets are sent using | |||
| QUIC DATAGRAM frames, the outer HTTP connection MAY disable | QUIC DATAGRAM frames, the outer HTTP connection MAY disable | |||
| congestion control for those packets that contain only QUIC DATAGRAM | congestion control for those packets that contain only QUIC DATAGRAM | |||
| frames encapsulating IP packets. Implementers will benefit from | frames encapsulating IP packets. Implementers will benefit from | |||
| reading the guidance in Section 3.1.11 of [UDP-USAGE]. | reading the guidance in Section 3.1.11 of [UDP-USAGE]. | |||
| When the protocol running inside the tunnel uses loss recovery (e.g., | When the protocol running inside the tunnel uses loss recovery (e.g., | |||
| [TCP] or [QUIC]), and the outer HTTP connection runs over TCP, the | [TCP] or [QUIC]) and the outer HTTP connection runs over TCP, the | |||
| proxied traffic will incur at least two nested loss recovery | proxied traffic will incur at least two nested loss recovery | |||
| mechanisms. This can reduce performance as both can sometimes | mechanisms. This can reduce performance, as both can sometimes | |||
| independently retransmit the same data. To avoid this, IP proxying | independently retransmit the same data. To avoid this, IP proxying | |||
| SHOULD be performed over HTTP/3 to allow leveraging the QUIC DATAGRAM | SHOULD be performed over HTTP/3 to allow leveraging the QUIC DATAGRAM | |||
| frame. | frame. | |||
| 10.1. MTU Considerations | 10.1. MTU Considerations | |||
| When using HTTP/3 with the QUIC Datagram extension [DGRAM], IP | When using HTTP/3 with the QUIC Datagram extension [DGRAM], IP | |||
| packets are transmitted in QUIC DATAGRAM frames. Since these frames | packets are transmitted in QUIC DATAGRAM frames. Since these frames | |||
| cannot be fragmented, they can only carry packets up to a given | cannot be fragmented, they can only carry packets up to a given | |||
| length determined by the QUIC connection configuration and the Path | length determined by the QUIC connection configuration and the Path | |||
| skipping to change at page 32, line 8 ¶ | skipping to change at line 1426 ¶ | |||
| packet in a DATAGRAM capsule, as that defeats the end-to-end | packet in a DATAGRAM capsule, as that defeats the end-to-end | |||
| unreliability characteristic that methods such as Datagram | unreliability characteristic that methods such as Datagram | |||
| Packetization Layer PMTU Discovery (DPLPMTUD) depend on [DPLPMTUD]. | Packetization Layer PMTU Discovery (DPLPMTUD) depend on [DPLPMTUD]. | |||
| In this scenario, the endpoint SHOULD drop the IP packet and send an | In this scenario, the endpoint SHOULD drop the IP packet and send an | |||
| ICMP Packet Too Big message to the sender of the dropped packet; see | ICMP Packet Too Big message to the sender of the dropped packet; see | |||
| Section 3.2 of [ICMPv6]. | Section 3.2 of [ICMPv6]. | |||
| 10.2. ECN Considerations | 10.2. ECN Considerations | |||
| If an IP proxying endpoint with a connection containing an IP | If an IP proxying endpoint with a connection containing an IP | |||
| Proxying request stream disables congestion control, it cannot signal | proxying request stream disables congestion control, it cannot signal | |||
| Explicit Congestion Notification (ECN) [ECN] support on that outer | Explicit Congestion Notification (ECN) [ECN] support on that outer | |||
| connection. That is, the QUIC sender MUST mark all IP headers with | connection. That is, the QUIC sender MUST mark all IP headers with | |||
| the Not-ECT codepoint for QUIC packets which are outside of | the Not ECN-Capable Transport (Not-ECT) codepoint for QUIC packets | |||
| congestion control. The endpoint can still report ECN feedback via | that are outside of congestion control. The endpoint can still | |||
| QUIC ACK_ECN frames or the TCP ECE bit, as the peer might not have | report ECN feedback via QUIC ACK_ECN frames or the TCP ECN-Echo (ECE) | |||
| disabled congestion control. | bit, as the peer might not have disabled congestion control. | |||
| Conversely, if congestion control is not disabled on the outer | Conversely, if congestion control is not disabled on the outer | |||
| congestion, the guidance in [ECN-TUNNEL] about transferring ECN marks | congestion, the guidance in [ECN-TUNNEL] about transferring ECN marks | |||
| between inner and outer IP headers does not apply because the outer | between inner and outer IP headers does not apply because the outer | |||
| connection will react correctly to congestion notifications if it | connection will react correctly to congestion notifications if it | |||
| uses ECN. The inner traffic can also use ECN, independently of | uses ECN. The inner traffic can also use ECN, independently of | |||
| whether it is in use on the outer connection. | whether it is in use on the outer connection. | |||
| 10.3. Differentiated Services Considerations | 10.3. Differentiated Services Considerations | |||
| Tunneled IP packets can have Differentiated Services Code Points | Tunneled IP packets can have Differentiated Services Code Points | |||
| (DSCP) [DSCP] set in the traffic class IP header field to request a | (DSCPs) [DSCP] set in the traffic class IP header field to request a | |||
| particular per-hop behavior. If an IP proxying endpoint is | particular per-hop behavior. If an IP proxying endpoint is | |||
| configured as part of a Differentiated Services domain, it MAY | configured as part of a Differentiated Services domain, it MAY | |||
| implement traffic differentiation based on these markings. However, | implement traffic differentiation based on these markings. However, | |||
| the use of HTTP can limit the possibilities for differentiated | the use of HTTP can limit the possibilities for differentiated | |||
| treatment of the tunneled IP packets on the path between the IP | treatment of the tunneled IP packets on the path between the IP | |||
| proxying endpoints. | proxying endpoints. | |||
| When an HTTP connection is congestion-controlled, marking packets | When an HTTP connection is congestion-controlled, marking packets | |||
| with different DSCP can lead to reordering between them, and that can | with different DSCPs can lead to reordering between them, and that | |||
| in turn lead the underlying transport connection's congestion | can in turn lead the underlying transport connection's congestion | |||
| controller to perform poorly. If tunneled packets are subject to | controller to perform poorly. If tunneled packets are subject to | |||
| congestion control by the outer connection, they need to avoid | congestion control by the outer connection, they need to avoid | |||
| carrying DSCP markings that are not equivalent in forwarding behavior | carrying DSCP markings that are not equivalent in forwarding behavior | |||
| to prevent this situation. In this scenario, the IP proxying | to prevent this situation. In this scenario, the IP proxying | |||
| endpoint MUST NOT copy the DSCP field from the inner IP header to the | endpoint MUST NOT copy the DSCP field from the inner IP header to the | |||
| outer IP header of the packet carrying this packet. Instead, an | outer IP header of the packet carrying this packet. Instead, an | |||
| application would need to use separate connections to the proxy, one | application would need to use separate connections to the proxy, one | |||
| for each DSCP. Note that this document does not define a way for | for each DSCP. Note that this document does not define a way for | |||
| requests to scope to particular DSCP values; such support is left to | requests to scope to particular DSCP values; such support is left to | |||
| future extensions. | future extensions. | |||
| If tunneled packets use QUIC datagrams and are not subject to | If tunneled packets use QUIC datagrams and are not subject to | |||
| congestion control by the outer connection, the IP proxying endpoints | congestion control by the outer connection, the IP proxying endpoints | |||
| MAY translate the DSCP field value from the tunneled traffic to the | MAY translate the DSCP field value from the tunneled traffic to the | |||
| outer IP header. IP proxying endpoints MUST NOT coalesce multiple | outer IP header. IP proxying endpoints MUST NOT coalesce multiple | |||
| inner packets into the same outer packet unless they have the same | inner packets into the same outer packet unless they have the same | |||
| DSCP marking or an equivalent traffic class. Note that the ability | DSCP marking or an equivalent traffic class. Note that the ability | |||
| to translate DSCP values is dependent on the tunnel ingress and | to translate DSCP values is dependent on the tunnel ingress and | |||
| egress belonging to the same differentiated service domain or not. | egress belonging to the same Differentiated Service domain or not. | |||
| 11. Security Considerations | 11. Security Considerations | |||
| There are significant risks in allowing arbitrary clients to | There are significant risks in allowing arbitrary clients to | |||
| establish a tunnel that permits sending to arbitrary hosts, | establish a tunnel that permits sending to arbitrary hosts, | |||
| regardless of whether tunnels are scoped to specific hosts or not. | regardless of whether tunnels are scoped to specific hosts or not. | |||
| Bad actors could abuse this capability to send traffic and have it | Bad actors could abuse this capability to send traffic and have it | |||
| attributed to the IP proxy. HTTP servers that support IP proxying | attributed to the IP proxy. HTTP servers that support IP proxying | |||
| SHOULD restrict its use to authenticated users. Depending on the | SHOULD restrict its use to authenticated users. Depending on the | |||
| deployment, possible authentication mechanisms include mutual TLS | deployment, possible authentication mechanisms include mutual TLS | |||
| between IP proxying endpoints, HTTP-based authentication via the HTTP | between IP proxying endpoints, HTTP-based authentication via the HTTP | |||
| Authorization header [HTTP], or even bearer tokens. Proxies can | Authorization header [HTTP], or even bearer tokens. Proxies can | |||
| enforce policies for authenticated users to further constrain client | enforce policies for authenticated users to further constrain client | |||
| behavior or deal with possible abuse. For example, proxies can rate | behavior or deal with possible abuse. For example, proxies can rate | |||
| limit individual clients that send an excessively large amount of | limit individual clients that send an excessively large amount of | |||
| traffic through the proxy. As another example, proxies can restrict | traffic through the proxy. As another example, proxies can restrict | |||
| address (prefix) assignment to clients based on certain client | address (prefix) assignment to clients based on certain client | |||
| attributes such as geographic location. | attributes, such as geographic location. | |||
| Address assignment can have privacy implications for endpoints. For | Address assignment can have privacy implications for endpoints. For | |||
| example, if a proxy partitions its address space by the number of | example, if a proxy partitions its address space by the number of | |||
| authenticated clients and then assigns distinct address ranges to | authenticated clients and then assigns distinct address ranges to | |||
| each client, target hosts could use this information to determine | each client, target hosts could use this information to determine | |||
| when IP packets correspond to the same client. Avoiding such | when IP packets correspond to the same client. Avoiding such | |||
| tracking vectors may be important for certain proxy deployments. | tracking vectors may be important for certain proxy deployments. | |||
| Proxies SHOULD avoid persistent per-client address (prefix) | Proxies SHOULD avoid persistent per-client address (prefix) | |||
| assignment when possible. | assignment when possible. | |||
| Falsifying IP source addresses in sent traffic has been common for | Falsifying IP source addresses in sent traffic has been common for | |||
| denial of service attacks. Implementations of this mechanism need to | denial-of-service attacks. Implementations of this mechanism need to | |||
| ensure that they do not facilitate such attacks. In particular, | ensure that they do not facilitate such attacks. In particular, | |||
| there are scenarios where an endpoint knows that its peer is only | there are scenarios where an endpoint knows that its peer is only | |||
| allowed to send IP packets from a given prefix. For example, that | allowed to send IP packets from a given prefix. For example, that | |||
| can happen through out-of-band configuration information, or when | can happen through out-of-band configuration information or when | |||
| allowed prefixes are shared via ADDRESS_ASSIGN capsules. In such | allowed prefixes are shared via ADDRESS_ASSIGN capsules. In such | |||
| scenarios, endpoints MUST follow the recommendations from [BCP38] to | scenarios, endpoints MUST follow the recommendations from [BCP38] to | |||
| prevent source address spoofing. | prevent source address spoofing. | |||
| Limiting request scope (see Section 4.6) allows two clients to share | Limiting request scope (see Section 4.6) allows two clients to share | |||
| one of the proxy's external IP addresses if their requests are scoped | one of the proxy's external IP addresses if their requests are scoped | |||
| to different IP protocol numbers. If the proxy receives an ICMP | to different Internet Protocol Numbers. If the proxy receives an | |||
| packet destined for that external IP address, it has the option to | ICMP packet destined for that external IP address, it has the option | |||
| forward it back to the clients. However, some of these ICMP packets | to forward it back to the clients. However, some of these ICMP | |||
| carry part of the original IP packet that triggered the ICMP | packets carry part of the original IP packet that triggered the ICMP | |||
| response. Forwarding such packets can accidentally divulge | response. Forwarding such packets can accidentally divulge | |||
| information about one client's traffic to another client. To avoid | information about one client's traffic to another client. To avoid | |||
| this, proxies that forward ICMP on shared external IP addresses MUST | this, proxies that forward ICMP on shared external IP addresses MUST | |||
| inspect the invoking packet included in the ICMP packet and only | inspect the invoking packet included in the ICMP packet and only | |||
| forward the ICMP packet to the client whose scoping matches the | forward the ICMP packet to the client whose scoping matches the | |||
| invoking packet. | invoking packet. | |||
| Implementers will benefit from reading the guidance in | Implementers will benefit from reading the guidance in | |||
| [TUNNEL-SECURITY]. Since there are known risks with some IPv6 | [TUNNEL-SECURITY]. Since there are known risks with some IPv6 | |||
| extension headers (e.g., [ROUTING-HDR]), implementers need to follow | extension headers (e.g., [ROUTING-HDR]), implementers need to follow | |||
| the latest guidance regarding handling of IPv6 extension headers. | the latest guidance regarding handling of IPv6 extension headers. | |||
| Transferring DSCP markings from inner to outer packets (see | Transferring DSCP markings from inner to outer packets (see | |||
| Section 10.3) exposes end-to-end flow level information to an on-path | Section 10.3) exposes end-to-end flow level information to an on-path | |||
| observer between the IP proxying endpoints. This can potentially | observer between the IP proxying endpoints. This can potentially | |||
| expose a single end-to-end flow. Because of this, such use of DSCP | expose a single end-to-end flow. Because of this, such use of DSCPs | |||
| in privacy-sensitive contexts is NOT RECOMMENDED. | in privacy-sensitive contexts is NOT RECOMMENDED. | |||
| Opportunistic sending of IP packets (see Section 7.1) is not allowed | ||||
| in HTTP/1.x because a server could reject the HTTP Upgrade and | ||||
| attempt to parse the IP packets as a subsequent HTTP request, | ||||
| allowing request smuggling attacks; see [OPTIMISTIC]. In particular, | ||||
| an intermediary that re-encodes a request from HTTP/2 or 3 to | ||||
| HTTP/1.1 MUST NOT forward any received capsules until it has parsed a | ||||
| successful IP proxying response. | ||||
| 12. IANA Considerations | 12. IANA Considerations | |||
| 12.1. HTTP Upgrade Token | 12.1. HTTP Upgrade Token Registration | |||
| This document will request IANA to register "connect-ip" in the HTTP | IANA has registered "connect-ip" in the "HTTP Upgrade Tokens" | |||
| Upgrade Token Registry maintained at | registry maintained at <https://www.iana.org/assignments/http- | |||
| <https://www.iana.org/assignments/http-upgrade-tokens>. | upgrade-tokens>. | |||
| Value: connect-ip | Value: connect-ip | |||
| Description: Proxying of IP Payloads | Description: Proxying of IP Payloads | |||
| Expected Version Tokens: None | Expected Version Tokens: None | |||
| References: This document | References: RFC 9484 | |||
| 12.2. Creation of the MASQUE URI Suffixes Registry | 12.2. MASQUE URI Suffixes Registry Creation | |||
| This document requests that IANA create a new "MASQUE URI Suffixes" | IANA has created the "MASQUE URI Suffixes" registry maintained at | |||
| registry maintained at IANA_URL_TBD. This new registry governs the | <https://www.iana.org/assignments/masque>. The registration policy | |||
| path segment that immediately follows "masque" in paths that start | is Expert Review; see Section 4.5 of [IANA-POLICY]. This new | |||
| with "/.well-known/masque/", see <https://www.iana.org/assignments/ | registry governs the path segment that immediately follows "masque" | |||
| well-known-uris> for the registration of "masque" in the "Well-Known | in paths that start with "/.well-known/masque/"; see | |||
| URIs" registry. This new registry contains three columns: | <https://www.iana.org/assignments/well-known-uris> for the | |||
| registration of "masque" in the "Well-Known URIs" registry. | ||||
| This new registry contains three columns: | ||||
| Path Segment: An ASCII string containing only characters allowed in | Path Segment: An ASCII string containing only characters allowed in | |||
| tokens; see Section 5.6.2 of [HTTP]. Entries in this registry | tokens; see Section 5.6.2 of [HTTP]. Entries in this registry | |||
| MUST all have distinct entries in this column. | MUST all have distinct entries in this column. | |||
| Description: A description of the entry. | Description: A description of the entry. | |||
| Reference: An optional reference defining the use of the entry. | Reference: An optional reference defining the use of the entry. | |||
| The registration policy for this registry is Expert Review; see | The registry's initial entries are as follows: | |||
| Section 4.5 of [IANA-POLICY]. | ||||
| There are initially two entries in this registry: | ||||
| +==============+==============+===============+ | +==============+==============+===========+ | |||
| | Path Segment | Description | Reference | | | Path Segment | Description | Reference | | |||
| +==============+==============+===============+ | +==============+==============+===========+ | |||
| | udp | UDP Proxying | RFC 9298 | | | udp | UDP Proxying | RFC 9298 | | |||
| +--------------+--------------+---------------+ | +--------------+--------------+-----------+ | |||
| | ip | IP Proxying | This Document | | | ip | IP Proxying | RFC 9484 | | |||
| +--------------+--------------+---------------+ | +--------------+--------------+-----------+ | |||
| Table 1: New MASQUE URI Suffixes | Table 1: MASQUE URI Suffixes Registry | |||
| Designated experts for this registry are advised that they should | Designated experts for this registry are advised that they should | |||
| approve all requests as long as the expert believes that both (1) the | approve all requests as long as the expert believes that both (1) the | |||
| requested Path Segment will not conflict with existing or expected | requested Path Segment will not conflict with existing or expected | |||
| future IETF work and (2) the use case is relevant to proxying. | future IETF work and (2) the use case is relevant to proxying. | |||
| 12.3. Updates to masque Well-Known URI | 12.3. Updates to masque Well-Known URI Registration | |||
| This document will request IANA to update the entry for the "masque" | ||||
| URI suffix in the "Well-Known URIs" registry maintained at | ||||
| <https://www.iana.org/assignments/well-known-uris>. | ||||
| IANA is requested to update the "Reference" field to include this | IANA has updated the entry for the "masque" URI suffix in the "Well- | |||
| document in addition to previous values from that field. | Known URIs" registry maintained at <https://www.iana.org/assignments/ | |||
| well-known-uris>. | ||||
| IANA is requested to replace the "Related Information" field with | IANA has updated the "Reference" field to include this document and | |||
| "For sub-suffix allocations, see registry at IANA_URL_TBD." where | has replaced the "Related Information" field with "For sub-suffix | |||
| IANA_URL_TBD is the URL of the new registry described in | allocations, see the registry at <https://www.iana.org/assignments/ | |||
| Section 12.2. | masque>.". | |||
| 12.4. Capsule Type Registrations | 12.4. HTTP Capsule Types Registrations | |||
| This document requests IANA to add the following values to the "HTTP | IANA has added the following values to the "HTTP Capsule Types" | |||
| Capsule Types" registry maintained at | registry maintained at <https://www.iana.org/assignments/masque>. | |||
| <https://www.iana.org/assignments/http-capsule-protocol>. | ||||
| +=======+=====================+=====================+ | +=======+=====================+ | |||
| | Value | Capsule Type | Description | | | Value | Capsule Type | | |||
| +=======+=====================+=====================+ | +=======+=====================+ | |||
| | 0x01 | ADDRESS_ASSIGN | Address Assignment | | | 0x01 | ADDRESS_ASSIGN | | |||
| +-------+---------------------+---------------------+ | +-------+---------------------+ | |||
| | 0x02 | ADDRESS_REQUEST | Address Request | | | 0x02 | ADDRESS_REQUEST | | |||
| +-------+---------------------+---------------------+ | +-------+---------------------+ | |||
| | 0x03 | ROUTE_ADVERTISEMENT | Route Advertisement | | | 0x03 | ROUTE_ADVERTISEMENT | | |||
| +-------+---------------------+---------------------+ | +-------+---------------------+ | |||
| Table 2: New Capsules | Table 2: New Capsules | |||
| All of these new entries use the following values for these fields: | All of these new entries use the following values for these fields: | |||
| Status: provisional (permanent when this document is approved) | Status: permanent | |||
| Reference: RFC 9484 | ||||
| Reference: This Document | ||||
| Change Controller: IETF | Change Controller: IETF | |||
| Contact: masque@ietf.org | Contact: masque@ietf.org | |||
| Notes: None | ||||
| Notes: Empty | ||||
| RFC Editor: please remove the rest of this subsection before | ||||
| publication. | ||||
| Since this document has not yet been published, it might still change | ||||
| before publication as RFC. Any implementer that wishes to deploy IP | ||||
| proxying in production before publication MUST use the following | ||||
| temporary codepoints instead: 0x2575D601 for ADDRESS_ASSIGN, | ||||
| 0x2575D602 for ADDRESS_REQUEST, and 0x2575D603 for | ||||
| ROUTE_ADVERTISEMENT. | ||||
| 13. References | 13. References | |||
| 13.1. Normative References | 13.1. Normative References | |||
| [ABNF] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax | [ABNF] 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>. | |||
| [BCP38] Ferguson, P. and D. Senie, "Network Ingress Filtering: | [BCP38] Ferguson, P. and D. Senie, "Network Ingress Filtering: | |||
| Defeating Denial of Service Attacks which employ IP Source | Defeating Denial of Service Attacks which employ IP Source | |||
| Address Spoofing", BCP 38, RFC 2827, DOI 10.17487/RFC2827, | Address Spoofing", BCP 38, RFC 2827, DOI 10.17487/RFC2827, | |||
| May 2000, <https://www.rfc-editor.org/rfc/rfc2827>. | May 2000, <https://www.rfc-editor.org/info/rfc2827>. | |||
| [DGRAM] Pauly, T., Kinnear, E., and D. Schinazi, "An Unreliable | [DGRAM] Pauly, T., Kinnear, E., and D. Schinazi, "An Unreliable | |||
| Datagram Extension to QUIC", RFC 9221, | Datagram Extension to QUIC", RFC 9221, | |||
| DOI 10.17487/RFC9221, March 2022, | DOI 10.17487/RFC9221, March 2022, | |||
| <https://www.rfc-editor.org/rfc/rfc9221>. | <https://www.rfc-editor.org/info/rfc9221>. | |||
| [DSCP] Nichols, K., Blake, S., Baker, F., and D. Black, | [DSCP] Nichols, K., Blake, S., Baker, F., and D. Black, | |||
| "Definition of the Differentiated Services Field (DS | "Definition of the Differentiated Services Field (DS | |||
| Field) in the IPv4 and IPv6 Headers", RFC 2474, | Field) in the IPv4 and IPv6 Headers", RFC 2474, | |||
| DOI 10.17487/RFC2474, December 1998, | DOI 10.17487/RFC2474, December 1998, | |||
| <https://www.rfc-editor.org/rfc/rfc2474>. | <https://www.rfc-editor.org/info/rfc2474>. | |||
| [ECN] Ramakrishnan, K., Floyd, S., and D. Black, "The Addition | [ECN] Ramakrishnan, K., Floyd, S., and D. Black, "The Addition | |||
| of Explicit Congestion Notification (ECN) to IP", | of Explicit Congestion Notification (ECN) to IP", | |||
| RFC 3168, DOI 10.17487/RFC3168, September 2001, | RFC 3168, DOI 10.17487/RFC3168, September 2001, | |||
| <https://www.rfc-editor.org/rfc/rfc3168>. | <https://www.rfc-editor.org/info/rfc3168>. | |||
| [EXT-CONNECT2] | [EXT-CONNECT2] | |||
| McManus, P., "Bootstrapping WebSockets with HTTP/2", | McManus, P., "Bootstrapping WebSockets with HTTP/2", | |||
| RFC 8441, DOI 10.17487/RFC8441, September 2018, | RFC 8441, DOI 10.17487/RFC8441, September 2018, | |||
| <https://www.rfc-editor.org/rfc/rfc8441>. | <https://www.rfc-editor.org/info/rfc8441>. | |||
| [EXT-CONNECT3] | [EXT-CONNECT3] | |||
| Hamilton, R., "Bootstrapping WebSockets with HTTP/3", | Hamilton, R., "Bootstrapping WebSockets with HTTP/3", | |||
| RFC 9220, DOI 10.17487/RFC9220, June 2022, | RFC 9220, DOI 10.17487/RFC9220, June 2022, | |||
| <https://www.rfc-editor.org/rfc/rfc9220>. | <https://www.rfc-editor.org/info/rfc9220>. | |||
| [HTTP] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | [HTTP] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | |||
| Ed., "HTTP Semantics", STD 97, RFC 9110, | Ed., "HTTP Semantics", STD 97, RFC 9110, | |||
| DOI 10.17487/RFC9110, June 2022, | DOI 10.17487/RFC9110, June 2022, | |||
| <https://www.rfc-editor.org/rfc/rfc9110>. | <https://www.rfc-editor.org/info/rfc9110>. | |||
| [HTTP-DGRAM] | [HTTP-DGRAM] | |||
| Schinazi, D. and L. Pardue, "HTTP Datagrams and the | Schinazi, D. and L. Pardue, "HTTP Datagrams and the | |||
| Capsule Protocol", RFC 9297, DOI 10.17487/RFC9297, August | Capsule Protocol", RFC 9297, DOI 10.17487/RFC9297, August | |||
| 2022, <https://www.rfc-editor.org/rfc/rfc9297>. | 2022, <https://www.rfc-editor.org/info/rfc9297>. | |||
| [HTTP/1.1] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | [HTTP/1.1] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | |||
| Ed., "HTTP/1.1", STD 99, RFC 9112, DOI 10.17487/RFC9112, | Ed., "HTTP/1.1", STD 99, RFC 9112, DOI 10.17487/RFC9112, | |||
| June 2022, <https://www.rfc-editor.org/rfc/rfc9112>. | June 2022, <https://www.rfc-editor.org/info/rfc9112>. | |||
| [HTTP/2] Thomson, M., Ed. and C. Benfield, Ed., "HTTP/2", RFC 9113, | [HTTP/2] Thomson, M., Ed. and C. Benfield, Ed., "HTTP/2", RFC 9113, | |||
| DOI 10.17487/RFC9113, June 2022, | DOI 10.17487/RFC9113, June 2022, | |||
| <https://www.rfc-editor.org/rfc/rfc9113>. | <https://www.rfc-editor.org/info/rfc9113>. | |||
| [HTTP/3] Bishop, M., Ed., "HTTP/3", RFC 9114, DOI 10.17487/RFC9114, | [HTTP/3] Bishop, M., Ed., "HTTP/3", RFC 9114, DOI 10.17487/RFC9114, | |||
| June 2022, <https://www.rfc-editor.org/rfc/rfc9114>. | June 2022, <https://www.rfc-editor.org/info/rfc9114>. | |||
| [IANA-POLICY] | [IANA-POLICY] | |||
| Cotton, M., Leiba, B., and T. Narten, "Guidelines for | 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>. | |||
| [ICMP] Postel, J., "Internet Control Message Protocol", STD 5, | [ICMP] Postel, J., "Internet Control Message Protocol", STD 5, | |||
| RFC 792, DOI 10.17487/RFC0792, September 1981, | RFC 792, DOI 10.17487/RFC0792, September 1981, | |||
| <https://www.rfc-editor.org/rfc/rfc792>. | <https://www.rfc-editor.org/info/rfc792>. | |||
| [ICMPv6] Conta, A., Deering, S., and M. Gupta, Ed., "Internet | [ICMPv6] Conta, A., Deering, S., and M. Gupta, Ed., "Internet | |||
| Control Message Protocol (ICMPv6) for the Internet | Control Message Protocol (ICMPv6) for the Internet | |||
| Protocol Version 6 (IPv6) Specification", STD 89, | Protocol Version 6 (IPv6) Specification", STD 89, | |||
| RFC 4443, DOI 10.17487/RFC4443, March 2006, | RFC 4443, DOI 10.17487/RFC4443, March 2006, | |||
| <https://www.rfc-editor.org/rfc/rfc4443>. | <https://www.rfc-editor.org/info/rfc4443>. | |||
| [IPv6] Deering, S. and R. Hinden, "Internet Protocol, Version 6 | [IPv6] Deering, S. and R. Hinden, "Internet Protocol, Version 6 | |||
| (IPv6) Specification", STD 86, RFC 8200, | (IPv6) Specification", STD 86, RFC 8200, | |||
| DOI 10.17487/RFC8200, July 2017, | DOI 10.17487/RFC8200, July 2017, | |||
| <https://www.rfc-editor.org/rfc/rfc8200>. | <https://www.rfc-editor.org/info/rfc8200>. | |||
| [IPv6-ZONE-ID] | ||||
| Carpenter, B., Cheshire, S., and R. Hinden, "Representing | ||||
| IPv6 Zone Identifiers in Address Literals and Uniform | ||||
| Resource Identifiers", RFC 6874, DOI 10.17487/RFC6874, | ||||
| February 2013, <https://www.rfc-editor.org/info/rfc6874>. | ||||
| [PROXY-STATUS] | [PROXY-STATUS] | |||
| Nottingham, M. and P. Sikora, "The Proxy-Status HTTP | Nottingham, M. and P. Sikora, "The Proxy-Status HTTP | |||
| Response Header Field", RFC 9209, DOI 10.17487/RFC9209, | Response Header Field", RFC 9209, DOI 10.17487/RFC9209, | |||
| June 2022, <https://www.rfc-editor.org/rfc/rfc9209>. | June 2022, <https://www.rfc-editor.org/info/rfc9209>. | |||
| [QUIC] Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based | [QUIC] Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based | |||
| Multiplexed and Secure Transport", RFC 9000, | Multiplexed and Secure Transport", RFC 9000, | |||
| DOI 10.17487/RFC9000, May 2021, | DOI 10.17487/RFC9000, May 2021, | |||
| <https://www.rfc-editor.org/rfc/rfc9000>. | <https://www.rfc-editor.org/info/rfc9000>. | |||
| [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>. | |||
| [RFC6874] Carpenter, B., Cheshire, S., and R. Hinden, "Representing | ||||
| IPv6 Zone Identifiers in Address Literals and Uniform | ||||
| Resource Identifiers", RFC 6874, DOI 10.17487/RFC6874, | ||||
| February 2013, <https://www.rfc-editor.org/rfc/rfc6874>. | ||||
| [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>. | |||
| [TCP] Eddy, W., Ed., "Transmission Control Protocol (TCP)", | [TCP] Eddy, W., Ed., "Transmission Control Protocol (TCP)", | |||
| STD 7, RFC 9293, DOI 10.17487/RFC9293, August 2022, | STD 7, RFC 9293, DOI 10.17487/RFC9293, August 2022, | |||
| <https://www.rfc-editor.org/rfc/rfc9293>. | <https://www.rfc-editor.org/info/rfc9293>. | |||
| [TEMPLATE] Gregorio, J., Fielding, R., Hadley, M., Nottingham, M., | [TEMPLATE] Gregorio, J., Fielding, R., Hadley, M., Nottingham, M., | |||
| and D. Orchard, "URI Template", RFC 6570, | and D. Orchard, "URI Template", RFC 6570, | |||
| DOI 10.17487/RFC6570, March 2012, | DOI 10.17487/RFC6570, March 2012, | |||
| <https://www.rfc-editor.org/rfc/rfc6570>. | <https://www.rfc-editor.org/info/rfc6570>. | |||
| [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>. | |||
| 13.2. Informative References | 13.2. Informative References | |||
| [CONNECT-UDP] | [CONNECT-UDP] | |||
| Schinazi, D., "Proxying UDP in HTTP", RFC 9298, | Schinazi, D., "Proxying UDP in HTTP", RFC 9298, | |||
| DOI 10.17487/RFC9298, August 2022, | DOI 10.17487/RFC9298, August 2022, | |||
| <https://www.rfc-editor.org/rfc/rfc9298>. | <https://www.rfc-editor.org/info/rfc9298>. | |||
| [DPLPMTUD] Fairhurst, G., Jones, T., Tüxen, M., Rüngeler, I., and T. | [DPLPMTUD] Fairhurst, G., Jones, T., Tüxen, M., Rüngeler, I., and T. | |||
| Völker, "Packetization Layer Path MTU Discovery for | Völker, "Packetization Layer Path MTU Discovery for | |||
| Datagram Transports", RFC 8899, DOI 10.17487/RFC8899, | Datagram Transports", RFC 8899, DOI 10.17487/RFC8899, | |||
| September 2020, <https://www.rfc-editor.org/rfc/rfc8899>. | September 2020, <https://www.rfc-editor.org/info/rfc8899>. | |||
| [ECN-TUNNEL] | [ECN-TUNNEL] | |||
| Briscoe, B., "Tunnelling of Explicit Congestion | Briscoe, B., "Tunnelling of Explicit Congestion | |||
| Notification", RFC 6040, DOI 10.17487/RFC6040, November | Notification", RFC 6040, DOI 10.17487/RFC6040, November | |||
| 2010, <https://www.rfc-editor.org/rfc/rfc6040>. | 2010, <https://www.rfc-editor.org/info/rfc6040>. | |||
| [HEv2] Schinazi, D. and T. Pauly, "Happy Eyeballs Version 2: | [HEv2] 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>. | |||
| [IANA-PN] IANA, "Protocol Numbers", | [IANA-PN] IANA, "Protocol Numbers", | |||
| <https://www.iana.org/assignments/protocol-numbers>. | <https://www.iana.org/assignments/protocol-numbers>. | |||
| [IPSEC] Kent, S. and K. Seo, "Security Architecture for the | [IPSEC] Kent, S. and K. Seo, "Security Architecture for the | |||
| Internet Protocol", RFC 4301, DOI 10.17487/RFC4301, | Internet Protocol", RFC 4301, DOI 10.17487/RFC4301, | |||
| December 2005, <https://www.rfc-editor.org/rfc/rfc4301>. | December 2005, <https://www.rfc-editor.org/info/rfc4301>. | |||
| [IPv6-ADDR] | [IPv6-ADDR] | |||
| Hinden, R. and S. Deering, "IP Version 6 Addressing | Hinden, R. and S. Deering, "IP Version 6 Addressing | |||
| Architecture", RFC 4291, DOI 10.17487/RFC4291, February | Architecture", RFC 4291, DOI 10.17487/RFC4291, February | |||
| 2006, <https://www.rfc-editor.org/rfc/rfc4291>. | 2006, <https://www.rfc-editor.org/info/rfc4291>. | |||
| [OPTIMISTIC] | ||||
| Schwartz, B. M., "Security Considerations for Optimistic | ||||
| Use of HTTP Upgrade", Work in Progress, Internet-Draft, | ||||
| draft-schwartz-httpbis-optimistic-upgrade-00, 21 August | ||||
| 2023, <https://datatracker.ietf.org/doc/html/draft- | ||||
| schwartz-httpbis-optimistic-upgrade-00>. | ||||
| [PROXY-REQS] | [PROXY-REQS] | |||
| Chernyakhovsky, A., McCall, D., and D. Schinazi, | Chernyakhovsky, A., McCall, D., and D. Schinazi, | |||
| "Requirements for a MASQUE Protocol to Proxy IP Traffic", | "Requirements for a MASQUE Protocol to Proxy IP Traffic", | |||
| Work in Progress, Internet-Draft, draft-ietf-masque-ip- | Work in Progress, Internet-Draft, draft-ietf-masque-ip- | |||
| proxy-reqs-03, 27 August 2021, | proxy-reqs-03, 27 August 2021, | |||
| <https://datatracker.ietf.org/doc/html/draft-ietf-masque- | <https://datatracker.ietf.org/doc/html/draft-ietf-masque- | |||
| ip-proxy-reqs-03>. | ip-proxy-reqs-03>. | |||
| [ROUTING-HDR] | [ROUTING-HDR] | |||
| Abley, J., Savola, P., and G. Neville-Neil, "Deprecation | Abley, J., Savola, P., and G. Neville-Neil, "Deprecation | |||
| of Type 0 Routing Headers in IPv6", RFC 5095, | of Type 0 Routing Headers in IPv6", RFC 5095, | |||
| DOI 10.17487/RFC5095, December 2007, | DOI 10.17487/RFC5095, December 2007, | |||
| <https://www.rfc-editor.org/rfc/rfc5095>. | <https://www.rfc-editor.org/info/rfc5095>. | |||
| [TUNNEL-SECURITY] | [TUNNEL-SECURITY] | |||
| Krishnan, S., Thaler, D., and J. Hoagland, "Security | Krishnan, S., Thaler, D., and J. Hoagland, "Security | |||
| Concerns with IP Tunneling", RFC 6169, | Concerns with IP Tunneling", RFC 6169, | |||
| DOI 10.17487/RFC6169, April 2011, | DOI 10.17487/RFC6169, April 2011, | |||
| <https://www.rfc-editor.org/rfc/rfc6169>. | <https://www.rfc-editor.org/info/rfc6169>. | |||
| [UDP-USAGE] | [UDP-USAGE] | |||
| Eggert, L., Fairhurst, G., and G. Shepherd, "UDP Usage | Eggert, L., Fairhurst, G., and G. Shepherd, "UDP Usage | |||
| Guidelines", BCP 145, RFC 8085, DOI 10.17487/RFC8085, | Guidelines", BCP 145, RFC 8085, DOI 10.17487/RFC8085, | |||
| March 2017, <https://www.rfc-editor.org/rfc/rfc8085>. | March 2017, <https://www.rfc-editor.org/info/rfc8085>. | |||
| Acknowledgments | Acknowledgments | |||
| The design of this method was inspired by discussions in the MASQUE | The design of this method was inspired by discussions in the MASQUE | |||
| working group around [PROXY-REQS]. The authors would like to thank | Working Group around [PROXY-REQS]. The authors would like to thank | |||
| participants in those discussions for their feedback. Additionally, | participants in those discussions for their feedback. Additionally, | |||
| Mike Bishop, Lucas Pardue, and Alejandro Sedeño provided valuable | Mike Bishop, Lucas Pardue, and Alejandro Sedeño provided valuable | |||
| feedback on the document. | feedback on the document. | |||
| Most of the text on client configuration is based on the | Most of the text on client configuration is based on the | |||
| corresponding text in [CONNECT-UDP]. | corresponding text in [CONNECT-UDP]. | |||
| Authors' Addresses | Authors' Addresses | |||
| Tommy Pauly (editor) | Tommy Pauly (editor) | |||
| skipping to change at page 41, line 4 ¶ | skipping to change at line 1838 ¶ | |||
| Tommy Pauly (editor) | Tommy Pauly (editor) | |||
| Apple Inc. | Apple Inc. | |||
| Email: tpauly@apple.com | Email: tpauly@apple.com | |||
| David Schinazi | David Schinazi | |||
| Google LLC | Google LLC | |||
| 1600 Amphitheatre Parkway | 1600 Amphitheatre Parkway | |||
| Mountain View, CA 94043 | Mountain View, CA 94043 | |||
| United States of America | United States of America | |||
| Email: dschinazi.ietf@gmail.com | Email: dschinazi.ietf@gmail.com | |||
| Alex Chernyakhovsky | Alex Chernyakhovsky | |||
| Google LLC | Google LLC | |||
| Email: achernya@google.com | Email: achernya@google.com | |||
| Mirja Kuehlewind | Mirja Kühlewind | |||
| Ericsson | Ericsson | |||
| Email: mirja.kuehlewind@ericsson.com | Email: mirja.kuehlewind@ericsson.com | |||
| Magnus Westerlund | Magnus Westerlund | |||
| Ericsson | Ericsson | |||
| Email: magnus.westerlund@ericsson.com | Email: magnus.westerlund@ericsson.com | |||
| End of changes. 167 change blocks. | ||||
| 464 lines changed or deleted | 466 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. | ||||