意味
クライアントが 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 が 101 ではなく 400 を返すのはなぜ?
ハンドシェイクのヘッダーが欠けているか改変されています。Upgrade/Connection を削除するプロキシや、無効な Sec-WebSocket-Key やバージョンがよくある原因です。
› HTTP/2 は 101 を使いますか?
まれな平文 h2c アップグレードだけです。ブラウザーは TLS の ALPN で HTTP/2 を交渉し、HTTP/2 自体には 101 レスポンスがありません。