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