跳到主要内容

1. 引言

超文本传输协议 (Hypertext Transfer Protocol, HTTP) [RFC7230] 在不同版本之间提供兼容的资源级语义, 但它不在连接管理层面提供兼容性. 其他依赖 HTTP 连接管理细节的协议, 例如 WebSockets, 必须针对新的 HTTP 版本进行更新.

WebSocket 协议 (The WebSocket Protocol) [RFC6455] 使用 HTTP/1.1 Upgrade 机制 ([RFC7230] 的 Section 6.7), 将 TCP 连接从 HTTP 转换为 WebSocket 连接. 对于 HTTP/2 [RFC7540], 必须采用不同的方法. 由于 HTTP/2 具有多路复用特性, 它不允许连接范围的头字段或状态码, 例如 Upgrade 和 Connection 请求头字段, 或 101 (Switching Protocols) 响应码. 这些都是 [RFC6455] 打开握手所必需的.

能够从 HTTP/2 引导 WebSockets, 可使一个 TCP 连接由两个协议共享, 并将 HTTP/2 对网络更高效的使用扩展到 WebSockets.

本文档扩展了 HTTP CONNECT 方法, 该方法在 [RFC7540] 的 Section 8.3 中针对 HTTP/2 进行了规定. 此扩展允许用要连接到的新协议名称替代 CONNECT 通常使用的外部主机. 其结果是在单个 HTTP/2 流上形成一个隧道, 可承载 WebSockets (或任何其他协议) 的数据. 该连接上的其他流可以承载更多扩展 CONNECT 隧道, 传统 HTTP/2 数据, 或二者的混合.

此隧道化流将与连接上的其他常规流进行多路复用, 并享有 HTTP/2 的常规优先级, 取消和流量控制功能.

使用隧道化流以及本文档定义的打开握手修改成功建立 WebSocket 连接的流, 随后使用传统 WebSocket 协议, 并将该流视为 [RFC6455] 中所指的 TCP 连接.