HTTPQUERY
English

Upgrade

用法

Upgrade 头部支持在现有的 HTTP/1.1 连接上进行协议协商。客户端发送该头部以提议切换到不同的协议,服务器要么以 101 Switching Protocols 响应予以接受,要么忽略该请求并继续使用当前协议。

常见的升级目标包括 WebSocket(websocket)、TLS(TLS/1.2、TLS/1.3)和明文 HTTP/2(h2c)。WebSocket 升级是现代部署中使用最广泛的形式,可实现浏览器与服务器之间的全双工通信。

Connection 头部必须与 Upgrade 一同使用。发送方设置 Connection: upgrade,以示意中间节点转发升级请求,而不是由它们自身消费该连接。

服务器也会将 Upgrade 作为 426 Upgrade Required 响应的一部分发送。这告知客户端服务器拒绝以当前协议处理请求,并在 Upgrade 值中列出所需的协议。

注意

Upgrade 头部仅适用于 HTTP/1.1。HTTP/2 和 HTTP/3 在 TLS 握手期间使用 ALPN(应用层协议协商)进行协议选择。

websocket

将连接升级到 WebSocket 协议以实现全双工通信。客户端会在升级请求中一并包含 Sec-WebSocket-Key 和 Sec-WebSocket-Version 头部。

h2c

将连接升级到明文(无 TLS)之上的 HTTP/2。客户端会包含 HTTP2-Settings 头部,其中含有 base64url 编码的 HTTP/2 连接参数。

TLS/1.2, TLS/1.3

将未加密的 HTTP 连接升级为受 TLS 保护的连接。此机制不如直接建立 TLS 那样常见。

示例

客户端请求 WebSocket 升级。服务器以 101 Switching Protocols 响应并确认新协议予以接受。

GET /chat HTTP/1.1
Host: example.re
Connection: upgrade
Upgrade: websocket
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

客户端提议升级到明文之上的 HTTP/2。HTTP2-Settings 头部携带以 base64url 格式编码的初始 HTTP/2 参数。

GET / HTTP/1.1
Host: example.re
Connection: upgrade, HTTP2-Settings
Upgrade: h2c
HTTP2-Settings: AAMAAABkAAQCAAAAAAIAAAAA

服务器要求客户端使用不同的协议。426 Upgrade Required 响应包含列出可接受协议的 Upgrade 头部。

HTTP/1.1 426 Upgrade Required
Upgrade: TLS/1.3
Connection: upgrade