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