跳到主要内容

RFC 9298 - 通过 HTTP 代理 UDP

互联网工程任务组 (IETF) D. Schinazi 征求意见稿: 9298 Google LLC 类别: 标准轨 2022 年 8 月 ISSN: 2070-1721

                      通过 HTTP 代理 UDP

摘要

本文档描述了如何在 HTTP 中代理 UDP, 类似于 HTTP CONNECT 方法允许 在 HTTP 中代理 TCP. 更具体地说, 本文档定义了一种协议, 使 HTTP 客户端 能够通过充当代理的 HTTP 服务器为 UDP 通信创建隧道.

本备忘录的状态

本文档是一份互联网标准轨文档.

本文档是互联网工程任务组 (IETF) 的成果. 它代表 IETF 社区的共识, 已经过公开审查, 并获互联网工程指导组 (IESG) 批准发布. 有关互联网标准 的更多信息, 请参见 RFC 7841 第 2 节.

有关本文档当前状态、勘误以及如何提供反馈的信息, 可访问 https://www.rfc-editor.org/info/rfc9298 获取.

版权声明

Copyright (c) 2022 IETF Trust 以及被标明为本文档作者的人员. 保留所有权利.

本文档受发布之日有效的 BCP 78 和 IETF Trust 的《与 IETF 文档有关的 法律条款》(https://trustee.ietf.org/license-info) 约束. 请仔细阅读这些 文档, 因为其中说明了您对本文档享有的权利和受到的限制. 从本文档提取的 代码组件必须包含 Trust 法律条款第 4.e 节所述的修订版 BSD 许可证文本, 并按修订版 BSD 许可证所述不附带任何担保.

目录

  1. 引言 1.1. 约定与定义

  2. 客户端配置

  3. 通过 HTTP 隧道传输 UDP 3.1. UDP 代理处理 3.2. HTTP/1.1 请求 3.3. HTTP/1.1 响应 3.4. HTTP/2 和 HTTP/3 请求 3.5. HTTP/2 和 HTTP/3 响应

  4. 上下文标识符

  5. HTTP 数据报负载格式

  6. 性能考虑事项 6.1. MTU 考虑事项 6.2. ECN 标记的隧道传输

  7. 安全考虑事项

  8. IANA 考虑事项 8.1. HTTP 升级令牌 8.2. 知名 URI

  9. 参考文献 9.1. 规范性参考文献 9.2. 资料性参考文献 致谢 作者地址

  10. 引言

HTTP 提供了 CONNECT 方法 (参见 [HTTP] 第 9.3.6 节), 用于创建通往代理 的 TCP [TCP] 隧道, 但在本规范之前, 尚无对 UDP [UDP] 流量执行相同操作 的方法.

本文档描述了一种通过 HTTP 将 UDP 隧道传输到充当 UDP 专用代理的服务器 的协议. UDP 隧道通常用于创建端到端虚拟连接, 随后可使用 QUIC [QUIC] 或其他运行在 UDP 之上的协议保护该连接. 与 HTTP CONNECT 方法不同, UDP 代理本身由包含流量目标的绝对 URL 标识. 如第 2 节所述, 客户端使用 URI 模板 (URI Template) [TEMPLATE] 生成这些 URL.

本协议通过使用 HTTP 数据报 (HTTP Datagrams) [HTTP-DGRAM], 支持所有 现有 HTTP 版本. 使用 HTTP/2 [HTTP/2] 或 HTTP/3 [HTTP/3] 时, 它采用 [EXT-CONNECT2] 和 [EXT-CONNECT3] 所述的 HTTP 扩展 CONNECT. 使用 HTTP/1.x [HTTP/1.1] 时, 它采用 [HTTP] 第 7.8 节定义的 HTTP Upgrade.

1.1. 约定与定义

本文档中的关键词 "MUST"、"MUST NOT"、"REQUIRED"、"SHALL"、 "SHALL NOT"、"SHOULD"、"SHOULD NOT"、"RECOMMENDED"、 "NOT RECOMMENDED"、"MAY" 和 "OPTIONAL", 仅当像这里一样以全大写 形式出现时, 才应按照 BCP 14 [RFC2119] [RFC8174] 中的描述解释.

本文档使用术语 "UDP 代理" (UDP proxy) 指代这样的 HTTP 服务器: 它响应 客户端的 UDP 隧道请求, 打开通往目标服务器的 UDP 套接字, 并生成对该请求 的响应. 如果客户端与 UDP 代理之间存在 HTTP 中介 (intermediaries, 定义见 [HTTP] 第 3.7 节), 本文档将它们称为 "中介".

请注意, 当所用 HTTP 版本不支持流复用时 (例如 HTTP/1.1), 本文档中对 "流" 的任何引用均表示整个连接.