HTTPQUERY
English

101 Switching Protocols

用法

携带 Upgrade 请求头的客户端希望服务器在本次 HTTP 会话的剩余部分使用另一种协议。多个协议在同一行内以逗号分隔列出,按优先级从高到低排列。协议版本是可选的。

Connection: upgrade
Upgrade: protocol-name[/protocol-version]

当这样做能带来好处时(例如利用较新协议版本提供的特性),就会发起该请求。此升级仅由 HTTP/1.1 支持,且客户端无法强制服务器切换协议。升级是可选的,当 Upgrade 请求头被忽略时,服务器返回 200。

服务端请求

服务器无法强制客户端升级协议,但当客户端不满足要求时,服务器会拒绝请求。当客户端使用服务器不支持的协议发起请求时,服务器返回 426。客户端按照服务器指定的协议重新发起请求后,后续请求便会被接受并处理。

示例

客户端请求从 HTTP/1.1 升级到 WebSocket 协议。服务器接受并切换协议。

请求

GET /chat HTTP/1.1
Host: example.com
Connection: upgrade
Upgrade: websocket
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==

响应

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

WebSocket 与协议分层

WebSocket 连接以 HTTP 请求开始,并通过 101 握手完成升级。升级完成后,该连接在应用层(第 7 层)作为一条持久的全双工 TCP 通道运行。HTTP 帧格式被 WebSocket 帧格式取代。Server-Sent Events (SSE) 是一种无需协议升级、实现服务器到客户端流式传输的替代方案。

代码参考

.NET

HttpStatusCode.SwitchingProtocols

Rust

http::StatusCode::SWITCHING_PROTOCOLS

Rails

:switching_protocols

Go

http.StatusSwitchingProtocols

Symfony

Response::HTTP_SWITCHING_PROTOCOLS

Python3.5+

http.HTTPStatus.SWITCHING_PROTOCOLS

Apache HttpComponents Core

org.apache.hc.core5.http.HttpStatus.SC_SWITCHING_PROTOCOLS

Angular

@angular/common/http/HttpStatusCode.SwitchingProtocols