HTTPQUERY
日本語

101 Switching Protocols

使い方

Upgrade リクエストヘッダーを含めるクライアントは、HTTP セッションの残りの部分でサーバーに別のプロトコルを使ってほしいと考えています。複数のプロトコルは1行にカンマ区切りで、優先度の高い順に列挙します。プロトコルバージョンは任意です。

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