draft-ietf-masque-connect-udp-00.txt | draft-ietf-masque-connect-udp-01.txt | |||
---|---|---|---|---|
Network Working Group D. Schinazi | Network Working Group D. Schinazi | |||
Internet-Draft Google LLC | Internet-Draft Google LLC | |||
Intended status: Standards Track 27 August 2020 | Intended status: Standards Track 12 December 2020 | |||
Expires: 28 February 2021 | Expires: 15 June 2021 | |||
The CONNECT-UDP HTTP Method | The CONNECT-UDP HTTP Method | |||
draft-ietf-masque-connect-udp-00 | draft-ietf-masque-connect-udp-01 | |||
Abstract | Abstract | |||
This document describes the CONNECT-UDP HTTP method. CONNECT-UDP is | This document describes the CONNECT-UDP HTTP method. CONNECT-UDP is | |||
similar to the HTTP CONNECT method, but it uses UDP instead of TCP. | similar to the HTTP CONNECT method, but it uses UDP instead of TCP. | |||
Discussion of this work is encouraged to happen on the MASQUE IETF | Discussion of this work is encouraged to happen on the MASQUE IETF | |||
mailing list masque@ietf.org or on the GitHub repository which | mailing list masque@ietf.org or on the GitHub repository which | |||
contains the draft: https://github.com/DavidSchinazi/masque-drafts. | contains the draft: https://github.com/ietf-wg-masque/draft-ietf- | |||
masque-connect-udp. | ||||
Discussion Venues | Discussion Venues | |||
This note is to be removed before publishing as an RFC. | This note is to be removed before publishing as an RFC. | |||
Source for this draft and an issue tracker can be found at | Source for this draft and an issue tracker can be found at | |||
https://github.com/ietf-wg-masque/draft-ietf-masque-connect-udp. | https://github.com/ietf-wg-masque/draft-ietf-masque-connect-udp. | |||
Status of This Memo | Status of This Memo | |||
skipping to change at page 1, line 42 ¶ | skipping to change at page 1, line 43 ¶ | |||
Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
Task Force (IETF). Note that other groups may also distribute | Task Force (IETF). Note that other groups may also distribute | |||
working documents as Internet-Drafts. The list of current Internet- | working documents as Internet-Drafts. The list of current Internet- | |||
Drafts is at https://datatracker.ietf.org/drafts/current/. | Drafts is at https://datatracker.ietf.org/drafts/current/. | |||
Internet-Drafts are draft documents valid for a maximum of six months | Internet-Drafts are draft documents valid for a maximum of six months | |||
and may be updated, replaced, or obsoleted by other documents at any | and may be updated, replaced, or obsoleted by other documents at any | |||
time. It is inappropriate to use Internet-Drafts as reference | time. It is inappropriate to use Internet-Drafts as reference | |||
material or to cite them other than as "work in progress." | material or to cite them other than as "work in progress." | |||
This Internet-Draft will expire on 28 February 2021. | This Internet-Draft will expire on 15 June 2021. | |||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2020 IETF Trust and the persons identified as the | Copyright (c) 2020 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 (https://trustee.ietf.org/ | |||
license-info) in effect on the date of publication of this document. | license-info) in effect on the date of publication of this document. | |||
Please review these documents carefully, as they describe your rights | Please review these documents carefully, as they describe your rights | |||
skipping to change at page 2, line 20 ¶ | skipping to change at page 2, line 20 ¶ | |||
extracted from this document must include Simplified BSD License text | extracted from this document must include Simplified BSD License text | |||
as described in Section 4.e of the Trust Legal Provisions and are | as described in Section 4.e of the Trust Legal Provisions and are | |||
provided without warranty as described in the Simplified BSD License. | provided without warranty as described in the Simplified BSD License. | |||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2 | |||
1.1. Conventions and Definitions . . . . . . . . . . . . . . . 2 | 1.1. Conventions and Definitions . . . . . . . . . . . . . . . 2 | |||
2. Supported HTTP Versions . . . . . . . . . . . . . . . . . . . 3 | 2. Supported HTTP Versions . . . . . . . . . . . . . . . . . . . 3 | |||
3. The CONNECT-UDP Method . . . . . . . . . . . . . . . . . . . 3 | 3. The CONNECT-UDP Method . . . . . . . . . . . . . . . . . . . 3 | |||
4. Encoding of Proxied UDP Packets . . . . . . . . . . . . . . . 4 | 4. Datagram Encoding of Proxied UDP Packets . . . . . . . . . . 4 | |||
5. Datagram-Flow-Id Header Definition . . . . . . . . . . . . . 5 | 5. Stream Encoding of Proxied UDP Packets . . . . . . . . . . . 5 | |||
6. Server Handling . . . . . . . . . . . . . . . . . . . . . . . 5 | 6. Proxy Handling . . . . . . . . . . . . . . . . . . . . . . . 6 | |||
7. Security Considerations . . . . . . . . . . . . . . . . . . . 6 | 7. HTTP Intermediaries . . . . . . . . . . . . . . . . . . . . . 6 | |||
8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 6 | 8. Performance Considerations . . . . . . . . . . . . . . . . . 7 | |||
8.1. HTTP Method . . . . . . . . . . . . . . . . . . . . . . . 6 | 9. Security Considerations . . . . . . . . . . . . . . . . . . . 7 | |||
8.2. HTTP Header . . . . . . . . . . . . . . . . . . . . . . . 6 | 10. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 8 | |||
9. Normative References . . . . . . . . . . . . . . . . . . . . 6 | 10.1. HTTP Method . . . . . . . . . . . . . . . . . . . . . . 8 | |||
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 8 | 10.2. URI Scheme Registration . . . . . . . . . . . . . . . . 8 | |||
Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 8 | 10.3. Stream Chunk Type Registration . . . . . . . . . . . . . 8 | |||
11. Normative References . . . . . . . . . . . . . . . . . . . . 9 | ||||
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 10 | ||||
Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 10 | ||||
1. Introduction | 1. Introduction | |||
This document describes the CONNECT-UDP HTTP method. CONNECT-UDP is | This document describes the CONNECT-UDP HTTP method. CONNECT-UDP is | |||
similar to the HTTP CONNECT method (see section 4.3.6 of [RFC7231]), | similar to the HTTP CONNECT method (see section 4.3.6 of [RFC7231]), | |||
but it uses UDP [UDP] instead of TCP [TCP]. | but it uses UDP [UDP] instead of TCP [TCP]. | |||
Discussion of this work is encouraged to happen on the MASQUE IETF | Discussion of this work is encouraged to happen on the MASQUE IETF | |||
mailing list masque@ietf.org or on the GitHub repository which | mailing list masque@ietf.org or on the GitHub repository which | |||
contains the draft: https://github.com/DavidSchinazi/masque-drafts. | contains the draft: https://github.com/ietf-wg-masque/draft-ietf- | |||
masque-connect-udp. | ||||
1.1. Conventions and Definitions | 1.1. 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 BCP | "OPTIONAL" in this document are to be interpreted as described in BCP | |||
14 [RFC2119] [RFC8174] when, and only when, they appear in all | 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 "proxy" to refer to the HTTP server | ||||
that opens the UDP socket and responds to the CONNECT-UDP request. | ||||
If there are HTTP intermediaries (as defined in Section 2.3 of | ||||
[RFC7230]) between the client and the proxy, those are referred to as | ||||
"intermediaries" in this document. | ||||
2. Supported HTTP Versions | 2. Supported HTTP Versions | |||
The CONNECT-UDP method is defined for all versions of HTTP. When the | The CONNECT-UDP method is defined for all versions of HTTP. When the | |||
HTTP version used runs over QUIC [QUIC], UDP payloads can be sent | HTTP version used runs over QUIC [QUIC], UDP payloads can be sent | |||
over QUIC DATAGRAM frames [DGRAM]. Otherwise they are sent on the | over QUIC DATAGRAM frames [DGRAM]. Otherwise they are sent on the | |||
stream where the CONNECT-UDP request was made. Note that when | stream where the CONNECT-UDP request was made. Note that, when the | |||
multiple proxies are involved in a CONNECT-UDP request, all the HTTP | HTTP version in use does not support multiplexing streams (such as | |||
connections along the path need to be using HTTP/3 [H3] or later in | HTTP/1.1), then any reference to "stream" in this document is meant | |||
order for UDP payloads to be sent over QUIC DATAGRAM frames. | to represent the entire connection. | |||
Additionally, when the HTTP version in use does not support | ||||
multiplexing streams (such as HTTP/1.1), then any reference to | ||||
"stream" in this document is meant to represent the entire | ||||
connection. | ||||
3. The CONNECT-UDP Method | 3. The CONNECT-UDP Method | |||
The CONNECT-UDP method requests that the recipient establish a tunnel | The CONNECT-UDP method requests that the recipient establish a tunnel | |||
over a single HTTP stream to the destination origin server identified | over a single HTTP stream to the destination origin server identified | |||
by the request-target and, if successful, thereafter restrict its | by the request-target and, if successful, thereafter restrict its | |||
behavior to blind forwarding of packets, in both directions, until | behavior to blind forwarding of packets, in both directions, until | |||
the tunnel is closed. Tunnels are commonly used to create an end-to- | the tunnel is closed. Tunnels are commonly used to create an end-to- | |||
end virtual connection, through one or more proxies, which can then | end virtual connection, which can then be secured using QUIC or | |||
be secured using QUIC or another protocol running over UDP. | another protocol running over UDP. | |||
A client sending a CONNECT-UDP request MUST send the authority form | The request-target of a CONNECT-UDP request is a URI [RFC3986] which | |||
of request-target (Section 5.3 of [RFC7230]); i.e., the request- | uses the "masque" scheme and an immutable path of "/". For example: | |||
target consists of only the host name and port number of the tunnel | ||||
destination, separated by a colon. For example, | ||||
CONNECT-UDP server.example.com:443 HTTP/1.1 | CONNECT-UDP masque://target.example.com:443/ HTTP/1.1 | |||
Host: server.example.com:443 | Host: target.example.com:443 | |||
When using HTTP/2 [H2] or later, CONNECT-UDP requests use HTTP | When using HTTP/2 [H2] or later, CONNECT-UDP requests use HTTP | |||
pseudo-headers with the following requirements: | pseudo-headers with the following requirements: | |||
* The ":method" pseudo-header field is set to "CONNECT-UDP". | * The ":method" pseudo-header field is set to "CONNECT-UDP". | |||
* The ":scheme" and ":path" pseudo-header fields MUST be omitted. | * The ":scheme" pseudo-header field is set to "masque". | |||
* The ":path" pseudo-header field is set to "/". | ||||
* The ":authority" pseudo-header field contains the host and port to | * The ":authority" pseudo-header field contains the host and port to | |||
connect to (equivalent to the authority-form of the request-target | connect to (similar to the authority-form of the request-target of | |||
of CONNECT-UDP requests (see [RFC7230], Section 5.3)). | CONNECT requests; see [RFC7230], Section 5.3). | |||
A CONNECT-UDP request that does not conform to these restrictions is | A CONNECT-UDP request that does not conform to these restrictions is | |||
malformed (see [H2], Section 8.1.2.6). | malformed (see [H2], Section 8.1.2.6). | |||
The recipient proxy can establish a tunnel either by directly opening | The recipient proxy establishes a tunnel by directly opening a UDP | |||
a UDP socket to the request-target or, if configured to use another | socket to the request-target. Any 2xx (Successful) response | |||
proxy, by forwarding the CONNECT-UDP request to the next inbound | indicates that the proxy has opened a socket to the request-target | |||
proxy. Any 2xx (Successful) response indicates that the sender (and | and is willing to proxy UDP payloads. Any response other than a | |||
all inbound proxies) will switch to tunnel mode immediately after the | successful response indicates that the tunnel has not yet been | |||
blank line that concludes the successful response's header section; | formed. | |||
data received after that blank line is from the server identified by | ||||
the request-target. Any response other than a successful response | ||||
indicates that the tunnel has not yet been formed and that the | ||||
connection remains governed by HTTP. | ||||
A tunnel is closed when a tunnel intermediary detects that either | ||||
side has closed its connection: the intermediary MUST attempt to send | ||||
any outstanding data that came from the closed side to the other | ||||
side, close both connections, and then discard any remaining data | ||||
left undelivered. | ||||
A server MUST NOT send any Transfer-Encoding or Content-Length header | A proxy MUST NOT send any Transfer-Encoding or Content-Length header | |||
fields in a 2xx (Successful) response to CONNECT. A client MUST | fields in a 2xx (Successful) response to CONNECT-UDP. A client MUST | |||
treat a response to CONNECT-UDP containing any Content-Length or | treat a response to CONNECT-UDP containing any Content-Length or | |||
Transfer-Encoding header fields as malformed. | Transfer-Encoding header fields as malformed. | |||
A payload within a CONNECT-UDP request message has no defined | A payload within a CONNECT-UDP request message has no defined | |||
semantics; a CONNECT-UDP request with a non-empty payload is | semantics; a CONNECT-UDP request with a non-empty payload is | |||
malformed. | malformed. Note that the CONNECT-UDP stream is used to convey UDP | |||
packets, but they are not semantically part of the request or | ||||
response themselves. | ||||
Responses to the CONNECT-UDP method are not cacheable. | Responses to the CONNECT-UDP method are not cacheable. | |||
4. Encoding of Proxied UDP Packets | 4. Datagram Encoding of Proxied UDP Packets | |||
When the HTTP connection between client and proxy supports HTTP/3 | ||||
datagrams [H3DGRAM], UDP packets can be encoded using QUIC DATAGRAM | ||||
frames. This support is ascertained by checking receipt of the | ||||
H3_DATAGRAM SETTINGS Parameter. Note that when there are multiple | ||||
proxies involved, this support needs to be ascertained on all the | ||||
HTTP connections that will carry proxied UDP packets. | ||||
If the client supports HTTP/3 datagrams and has received the | When the HTTP connection supports HTTP/3 datagrams [H3DGRAM], UDP | |||
H3_DATAGRAM SETTINGS Parameter on this connection, it SHOULD attempt | packets can be encoded using QUIC DATAGRAM frames. This support is | |||
to use HTTP/3 datagrams. This is accomplished by requesting a | ascertained by checking the received value of the H3_DATAGRAM | |||
datagram flow identifier from the flow identifier allocation service | SETTINGS Parameter. | |||
[H3DGRAM]. That service generates an even flow identifier, and the | ||||
client sends it to the server by using the "Datagram-Flow-Id" header | ||||
(see Section 5). | ||||
If there are multiple proxies involved, proxies along the chain MUST | If the client has both sent and received the H3_DATAGRAM SETTINGS | |||
check whether their upstream connection supports HTTP/3 datagrams. | Parameter with value 1 on this connection, it SHOULD attempt to use | |||
If it does not, that proxy MUST remove the "Datagram-Flow-Id" header | HTTP/3 datagrams. This is accomplished by requesting a datagram flow | |||
before forwarding the CONNECT-UDP request. | identifier from the flow identifier allocation service [H3DGRAM]. | |||
That service generates an even flow identifier, and the client sends | ||||
it to the proxy by using the "Datagram-Flow-Id" header; see | ||||
[H3DGRAM]. A CONNECT-UDP request with an odd flow identifier is | ||||
malformed. | ||||
The proxy that is creating the UDP socket to the destination responds | The proxy that is creating the UDP socket to the destination responds | |||
to the CONNECT-UDP request with a 2xx (Successful) response, and MUST | to the CONNECT-UDP request with a 2xx (Successful) response, and | |||
echo the "Datagram-Flow-Id" header. Once the client has received the | indicates it supports datagram encoding by echoing the "Datagram- | |||
"Datagram-Flow-Id" header on the successful response, it knows that | Flow-Id" header. Once the client has received the "Datagram-Flow-Id" | |||
it can use the HTTP/3 datagram encoding to send proxied UDP packets | header on the successful response, it knows that it can use the | |||
for this particular destination. It then encodes the payload of UDP | HTTP/3 datagram encoding to send proxied UDP packets for this | |||
datagrams into the payload of HTTP/3 datagrams. | particular request. It then encodes the payload of UDP datagrams | |||
into the payload of HTTP/3 datagrams. Is the CONNECT-UDP response | ||||
does not carry the "Datagram-Flow-Id" header, then the datagram | ||||
encoding is not available for this request. A CONNECT-UDP response | ||||
that carries the "Datagram-Flow-Id" header but with a different flow | ||||
identifier than the one sent on the request is malformed. | ||||
When the proxy processes a new CONNECT-UDP request, it MUST ensure | ||||
that the datagram flow identifier is not equal to flow identifiers | ||||
from other requests: if it is, the proxy MUST reject the request with | ||||
a 4xx (Client Error) status code. Extensions MAY weaken or remove | ||||
this requirement. | ||||
Clients MAY optimistically start sending proxied UDP packets before | Clients MAY optimistically start sending proxied UDP packets before | |||
receiving the response to its CONNECT-UDP request, noting however | receiving the response to its CONNECT-UDP request, noting however | |||
that those may not be processed by the proxy if it responds to the | that those may not be processed by the proxy if it responds to the | |||
CONNECT-UDP request with a failure, or if they arrive before the | CONNECT-UDP request with a failure or without echoing the "Datagram- | |||
CONNECT-UDP request. | Flow-Id" header, or if the datagrams arrive before the CONNECT-UDP | |||
request. | ||||
Note that a proxy can send the H3_DATAGRAM SETTINGS Parameter with a | ||||
value of 1 while disabling datagrams on a particular request by not | ||||
echoing the "Datagram-Flow-Id" header. If the proxy does this, it | ||||
MUST NOT treat receipt of datagrams as an error, because the client | ||||
could have sent them optimistically before receiving the response. | ||||
In this scenario, the proxy MUST discard those datagrams. | ||||
Extensions to CONNECT-UDP MAY leverage parameters on the "Datagram- | ||||
Flow-Id" header (parameters are defined in Section 3.1.2 of | ||||
[STRUCT-HDR]). Proxies MUST NOT echo parameters on the "Datagram- | ||||
Flow-Id" header if it does not understand their semantics. | ||||
5. Stream Encoding of Proxied UDP Packets | ||||
If HTTP/3 datagrams are not supported, the stream is used to convey | If HTTP/3 datagrams are not supported, the stream is used to convey | |||
UDP payloads, by prefixing them with a 16-bit length. | UDP payloads, by using the following format (using the notation from | |||
the "Notational Conventions" section of [QUIC]): | ||||
5. Datagram-Flow-Id Header Definition | CONNECT-UDP Stream Chunk { | |||
CONNECT-UDP Stream Chunk Type (i) = 0x00, | ||||
UDP Payload Length (i), | ||||
UDP Payload (..), | ||||
} | ||||
"Datagram-Flow-Id" is a Item Structured Header [STRUCT-HDR]. Its | Figure 1: CONNECT-UDP Stream Chunk Format | |||
value MUST be an Integer. Its ABNF is: | ||||
Datagram-Flow-Id = sh-integer | CONNECT-UDP Stream Chunk Type: A variable-length integer indicating | |||
the Type of the CONNECT-UDP Stream Chunk, set to 0x00 to indicate | ||||
a UDP Payload. | ||||
6. Server Handling | UDP Payload Length: The length of the UDP Payload field following | |||
this field. | ||||
Unlike TCP, UDP is connection-less. The HTTP server that opens the | UDP Payload: The payload of the UDP datagram. | |||
UDP socket has no way of knowing whether the destination is | ||||
reachable. Therefore it needs to respond to the CONNECT-UDP request | ||||
without waiting for a TCP SYN-ACK. | ||||
Servers can use connected UDP sockets if their operating system | The bidirectional stream that the CONNECT-UDP request was sent on is | |||
supports them, as that allows the HTTP server to rely on the kernel | a sequence of CONNECT-UDP Stream Chunks. The CONNECT-UDP Stream | |||
to only send it UDP packets that match the correct 5-tuple. If the | Chunk Type is designed to allow future extensibility. Endpoints that | |||
server uses a non-connected socket, it MUST validate the IP source | receive a chunk with an unknown CONNECT-UDP Stream Chunk Type MUST | |||
address and UDP source port on received packets to ensure they match | silently skip over that chunk. | |||
the client's CONNECT-UDP request. Packets that do not match MUST be | ||||
discarded by the server. | ||||
7. Security Considerations | 6. Proxy Handling | |||
Unlike TCP, UDP is connection-less. The proxy that opens the UDP | ||||
socket has no way of knowing whether the destination is reachable. | ||||
Therefore it needs to respond to the CONNECT-UDP request without | ||||
waiting for a TCP SYN-ACK. | ||||
Proxies can use connected UDP sockets if their operating system | ||||
supports them, as that allows the proxy to rely on the kernel to only | ||||
send it UDP packets that match the correct 5-tuple. If the proxy | ||||
uses a non-connected socket, it MUST validate the IP source address | ||||
and UDP source port on received packets to ensure they match the | ||||
client's CONNECT-UDP request. Packets that do not match MUST be | ||||
discarded by the proxy. | ||||
The lifetime of the socket is tied to the CONNECT-UDP stream. The | ||||
proxy MUST keep the socket open while the CONNECT-UDP stream is open. | ||||
Proxies MAY choose to close sockets due to a period of inactivity, | ||||
but they MUST close the CONNECT-UDP stream before closing the socket. | ||||
7. HTTP Intermediaries | ||||
HTTP/3 DATAGRAM flow identifiers are specific to a given HTTP/3 | ||||
connection. However, in some cases, an HTTP request may travel | ||||
across multiple HTTP connections if there are HTTP intermediaries | ||||
involved; see Section 2.3 of [RFC7230]. | ||||
Intermediaries that support both CONNECT-UDP and HTTP/3 datagrams | ||||
MUST negotiate flow identifiers separately on the client-facing and | ||||
server-facing connections. This is accomplished by having the | ||||
intermediary parse the "Datagram-Flow-Id" header on all CONNECT-UDP | ||||
requests it receives, and sending the same value in the "Datagram- | ||||
Flow-Id" header on the response. The intermediary then ascertains | ||||
whether it can use datagrams on the server-facing connection. If | ||||
they are supported (as indicated by the H3_DATAGRAM SETTINGS | ||||
parameter), the intermediary uses its own flow identifier allocation | ||||
service to allocate a flow identifier for the server-facing | ||||
connection, and waits for the server's reply to see if the server | ||||
sent the "Datagram-Flow-Id" header on the response. The intermediary | ||||
then translates datagrams between the two connections by using the | ||||
flow identifier specific to that connection. An intermediary MAY | ||||
also choose to use datagrams on only one of the two connections, and | ||||
translate between datagrams and streams. | ||||
8. Performance Considerations | ||||
Proxies SHOULD strive to avoid increasing burstiness of UDP traffic: | ||||
they SHOULD NOT queue packets in order to increase batching. | ||||
When the protocol running over UDP that is being proxied uses | ||||
congestion control (e.g., [QUIC]), the proxied traffic will incur at | ||||
least two nested congestion controllers. This can reduce performance | ||||
but the underlying HTTP connection MUST NOT disable congestion | ||||
control unless it has an out-of-band way of knowing with absolute | ||||
certainty that the inner traffic is congestion-controlled. | ||||
When the protocol running over UDP that is being proxied uses loss | ||||
recovery (e.g., [QUIC]), and the underlying HTTP connection runs over | ||||
TCP, the proxied traffic will incur at least two nested loss recovery | ||||
mechanisms. This can reduce performance as both can sometimes | ||||
independently retransmit the same data. To avoid this, HTTP/3 | ||||
datagrams SHOULD be used. | ||||
9. Security Considerations | ||||
There are significant risks in allowing arbitrary clients to | There are significant risks in allowing arbitrary clients to | |||
establish a tunnel to arbitrary servers, as that could allow bad | establish a tunnel to arbitrary servers, as that could allow bad | |||
actors to send traffic and have it attributed to the proxy. Proxies | actors to send traffic and have it attributed to the proxy. Proxies | |||
that support CONNECT-UDP SHOULD restrict its use to authenticated | that support CONNECT-UDP SHOULD restrict its use to authenticated | |||
users. | users. | |||
8. IANA Considerations | Because the CONNECT method creates a TCP connection to the target, | |||
the target has to indicate its willingness to accept TCP connections | ||||
by responding with a TCP SYN-ACK before the proxy can send it | ||||
application data. UDP doesn't have this property, so a CONNECT-UDP | ||||
proxy could send more data to an unwilling target than a CONNECT | ||||
proxy. However, in practice denial of service attacks target open | ||||
TCP ports so the TCP SYN-ACK does not offer much protection in real | ||||
scenarios. Proxies MUST NOT introspect the contents of UDP payloads | ||||
as that would lead to ossification of UDP-based protocols by proxies. | ||||
8.1. HTTP Method | 10. IANA Considerations | |||
10.1. HTTP Method | ||||
This document will request IANA to register "CONNECT-UDP" in the HTTP | This document will request IANA to register "CONNECT-UDP" in the HTTP | |||
Method Registry (IETF review) maintained at | Method Registry (IETF review) maintained at | |||
<https://www.iana.org/assignments/http-methods>. | <https://www.iana.org/assignments/http-methods>. | |||
+-------------+------+------------+---------------+ | +-------------+------+------------+---------------+ | |||
| Method Name | Safe | Idempotent | Reference | | | Method Name | Safe | Idempotent | Reference | | |||
+-------------+------+------------+---------------+ | +-------------+------+------------+---------------+ | |||
| CONNECT-UDP | no | no | This document | | | CONNECT-UDP | no | no | This document | | |||
+-------------+------+------------+---------------+ | +-------------+------+------------+---------------+ | |||
8.2. HTTP Header | 10.2. URI Scheme Registration | |||
This document will request IANA to register the "Datagram-Flow-Id" | This document will request IANA to register the URI scheme "masque". | |||
header in the "Permanent Message Header Field Names" registry | ||||
maintained at <https://www.iana.org/assignments/message-headers>. | ||||
+-------------------+----------+--------+---------------+ | The syntax definition below uses Augmented Backus-Naur Form (ABNF) | |||
| Header Field Name | Protocol | Status | Reference | | [RFC5234]. The definitions of "host" and "port" are adopted from | |||
+-------------------+----------+--------+---------------+ | [RFC3986]. The syntax of a MASQUE URI is: | |||
| Datagram-Flow-Id | http | exp | This document | | ||||
+-------------------+----------+--------+---------------+ | ||||
9. Normative References | masque-URI = "masque:" "//" host ":" port "/" | |||
The "host" and "port" component MUST NOT be empty, and the "port" | ||||
component MUST NOT be 0. | ||||
10.3. Stream Chunk Type Registration | ||||
This document will request IANA to create a "CONNECT-UDP Stream Chunk | ||||
Type" registry. This registry governs a 62-bit space, and follows | ||||
the registration policy for QUIC registries as defined in [QUIC]. In | ||||
addition to the fields required by the QUIC policy, registrations in | ||||
this registry MUST include the following fields: | ||||
Type: A short mnemonic for the type. | ||||
Description: A brief description of the type semantics, which MAY be | ||||
a summary if a specification reference is provided. | ||||
The initial contents of this registry are: | ||||
+-------+------------+-----------------------+---------------+ | ||||
| Value | Type | Description | Reference | | ||||
+-------+------------+-----------------------+---------------+ | ||||
| 0x00 | UDP_PACKET | Payload of UDP packet | This document | | ||||
+-------+------------+-----------------------+---------------+ | ||||
Each value of the format "37 * N + 23" for integer values of N (that | ||||
is, 23, 60, 97, ...) are reserved; these values MUST NOT be assigned | ||||
by IANA and MUST NOT appear in the listing of assigned values. | ||||
11. Normative References | ||||
[DGRAM] Pauly, T., Kinnear, E., and D. Schinazi, "An Unreliable | [DGRAM] Pauly, T., Kinnear, E., and D. Schinazi, "An Unreliable | |||
Datagram Extension to QUIC", Work in Progress, Internet- | Datagram Extension to QUIC", Work in Progress, Internet- | |||
Draft, draft-ietf-quic-datagram-01, 24 August 2020, | Draft, draft-ietf-quic-datagram-01, 24 August 2020, | |||
<http://www.ietf.org/internet-drafts/draft-ietf-quic- | <http://www.ietf.org/internet-drafts/draft-ietf-quic- | |||
datagram-01.txt>. | datagram-01.txt>. | |||
[H2] Belshe, M., Peon, R., and M. Thomson, Ed., "Hypertext | [H2] Belshe, M., Peon, R., and M. Thomson, Ed., "Hypertext | |||
Transfer Protocol Version 2 (HTTP/2)", RFC 7540, | Transfer Protocol Version 2 (HTTP/2)", RFC 7540, | |||
DOI 10.17487/RFC7540, May 2015, | DOI 10.17487/RFC7540, May 2015, | |||
<https://www.rfc-editor.org/info/rfc7540>. | <https://www.rfc-editor.org/info/rfc7540>. | |||
[H3] Bishop, M., "Hypertext Transfer Protocol Version 3 | ||||
(HTTP/3)", Work in Progress, Internet-Draft, draft-ietf- | ||||
quic-http-29, 9 June 2020, <http://www.ietf.org/internet- | ||||
drafts/draft-ietf-quic-http-29.txt>. | ||||
[H3DGRAM] Schinazi, D., "Using QUIC Datagrams with HTTP/3", Work in | [H3DGRAM] Schinazi, D., "Using QUIC Datagrams with HTTP/3", Work in | |||
Progress, Internet-Draft, draft-schinazi-quic-h3-datagram- | Progress, Internet-Draft, draft-schinazi-masque-h3- | |||
04, 16 April 2020, <http://www.ietf.org/internet-drafts/ | datagram-01, 12 December 2020, <http://www.ietf.org/ | |||
draft-schinazi-quic-h3-datagram-04.txt>. | internet-drafts/draft-schinazi-masque-h3-datagram-01.txt>. | |||
[QUIC] Iyengar, J. and M. Thomson, "QUIC: A UDP-Based Multiplexed | [QUIC] Iyengar, J. and M. Thomson, "QUIC: A UDP-Based Multiplexed | |||
and Secure Transport", Work in Progress, Internet-Draft, | and Secure Transport", Work in Progress, Internet-Draft, | |||
draft-ietf-quic-transport-29, 9 June 2020, | draft-ietf-quic-transport-32, 20 October 2020, | |||
<http://www.ietf.org/internet-drafts/draft-ietf-quic- | <http://www.ietf.org/internet-drafts/draft-ietf-quic- | |||
transport-29.txt>. | transport-32.txt>. | |||
[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/info/rfc2119>. | <https://www.rfc-editor.org/info/rfc2119>. | |||
[RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform | ||||
Resource Identifier (URI): Generic Syntax", STD 66, | ||||
RFC 3986, DOI 10.17487/RFC3986, January 2005, | ||||
<https://www.rfc-editor.org/info/rfc3986>. | ||||
[RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax | ||||
Specifications: ABNF", STD 68, RFC 5234, | ||||
DOI 10.17487/RFC5234, January 2008, | ||||
<https://www.rfc-editor.org/info/rfc5234>. | ||||
[RFC7230] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | [RFC7230] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | |||
Protocol (HTTP/1.1): Message Syntax and Routing", | Protocol (HTTP/1.1): Message Syntax and Routing", | |||
RFC 7230, DOI 10.17487/RFC7230, June 2014, | RFC 7230, DOI 10.17487/RFC7230, June 2014, | |||
<https://www.rfc-editor.org/info/rfc7230>. | <https://www.rfc-editor.org/info/rfc7230>. | |||
[RFC7231] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | [RFC7231] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | |||
Protocol (HTTP/1.1): Semantics and Content", RFC 7231, | Protocol (HTTP/1.1): Semantics and Content", RFC 7231, | |||
DOI 10.17487/RFC7231, June 2014, | DOI 10.17487/RFC7231, June 2014, | |||
<https://www.rfc-editor.org/info/rfc7231>. | <https://www.rfc-editor.org/info/rfc7231>. | |||
skipping to change at page 8, line 13 ¶ | skipping to change at page 10, line 38 ¶ | |||
<https://www.rfc-editor.org/info/rfc793>. | <https://www.rfc-editor.org/info/rfc793>. | |||
[UDP] Postel, J., "User Datagram Protocol", STD 6, RFC 768, | [UDP] Postel, J., "User Datagram Protocol", STD 6, RFC 768, | |||
DOI 10.17487/RFC0768, August 1980, | DOI 10.17487/RFC0768, August 1980, | |||
<https://www.rfc-editor.org/info/rfc768>. | <https://www.rfc-editor.org/info/rfc768>. | |||
Acknowledgments | Acknowledgments | |||
This proposal was inspired directly or indirectly by prior work from | This proposal was inspired directly or indirectly by prior work from | |||
many people. The author would like to thank Eric Rescorla for | many people. The author would like to thank Eric Rescorla for | |||
suggesting to use an HTTP method to proxy UDP. | suggesting to use an HTTP method to proxy UDP. Thanks to Lucas | |||
Pardue for their inputs on this document. | ||||
Author's Address | Author's Address | |||
David Schinazi | David Schinazi | |||
Google LLC | Google LLC | |||
1600 Amphitheatre Parkway | 1600 Amphitheatre Parkway | |||
Mountain View, California 94043, | Mountain View, California 94043, | |||
United States of America | United States of America | |||
Email: dschinazi.ietf@gmail.com | Email: dschinazi.ietf@gmail.com | |||
End of changes. 41 change blocks. | ||||
122 lines changed or deleted | 248 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |