9. Extensions (拡張)
WebSocketプロトコルは、追加機能を追加できる拡張メカニズムを提供します。
9.1 Negotiating Extensions (拡張のネゴシエーション)
拡張は、ハンドシェイク時のSec-WebSocket-Extensionsヘッダーを通じてネゴシエートされます。
クライアントが拡張を要求
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
サーバーレスポンス
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Extensions: permessage-deflate
拡張フォーマット
extension = extension-token *( ";" extension-param )
extension-param = token [ "=" (token | quoted-string) ]
9.2 Known Extensions (既知の拡張)
permessage-deflate (RFC 7692)
最も一般的に使用される拡張で、メッセージ圧縮機能を提供します。
利点:
- 帯域幅使用量を削減
- テキストデータに適している
欠点:
- CPUオーバーヘッドが増加
- レイテンシが増加する可能性がある
使用例 (Node.js):
const WebSocket = require('ws');
const wss = new WebSocket.Server({
port: 8080,
perMessageDeflate: {
zlibDeflateOptions: {
chunkSize: 1024,
memLevel: 7,
level: 3
},
zlibInflateOptions: {
chunkSize: 10 * 1024
},
clientNoContextTakeover: true,
serverNoContextTakeover: true,
serverMaxWindowBits: 10,
concurrencyLimit: 10,
threshold: 1024 // 1KBより大きいメッセージのみ圧縮
}
});
その他の拡張
- permessage-bzip2: Bzip2圧縮
- multiplexing: 多重化(ドラフト)
- カスタム拡張
拡張開発
カスタム拡張を開発する際:
- 拡張名を定義
- パラメータを定義
- フレーム構造の変更方法を指定
- ハンドシェイクネゴシエーションを実装
- 拡張を登録
参考リンク
- 前の章: 8. Error Handling (エラーハンドリング)
- 次の章: 10. Security Considerations (セキュリティに関する考慮事項)
- RFC 7692: WebSocket圧縮拡張