含义
服务器同意切换到客户端在 Upgrade 头中请求的协议,最常见的是 WebSocket。此响应之后,连接改用新协议通信。
常见原因
- WebSocket 握手成功
- 客户端请求升级到 h2c(明文 HTTP/2)
- 接受了自定义协议升级
解决方法
客户端或访问者
对 WebSocket 来说,101 就是成功。如果期望 101 却收到 200 或 400,请确认 URL 指向 WebSocket 端点,并且代理转发了 Upgrade 和 Connection 头。
网站或 API 的维护者
在 nginx 或负载均衡器后面,要显式转发 Upgrade 和 Connection(proxy_set_header Upgrade $http_upgrade; Connection "upgrade"),并为长连接调大空闲超时。
响应示例
HTTP/1.1
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= 规范
常见问题
› 为什么我的 WebSocket 返回 400 而不是 101?
握手头缺失或被改动,常见原因是代理剥离了 Upgrade/Connection,或者 Sec-WebSocket-Key、版本号无效。
› HTTP/2 会用到 101 吗?
只有很少见的明文 h2c 升级会用。浏览器通过 TLS ALPN 协商 HTTP/2,HTTP/2 本身没有 101 响应。