ハンドシェイク
- HTTPリクエスト解析
- HTTPリクエストラインのパーサー関数作成
- HTTPヘッダーのパーサー関数作成
- HTTPリクエストボディのパーサー関数作成
- WebSocket関連ヘッダーの検証
-
Upgrade: websocket -
Connection: Upgrade -
Sec-WebSocket-Keyの取得と検証 -
Sec-WebSocket-Version: 13の検証
-
- HTTPレスポンス作成
-
Sec-WebSocket-Acceptの生成-
Sec-WebSocket-KeyにSHA-1適用(外部依存) -
Sec-WebSocket-KeyにSHA-1適用(非依存) -
Sec-WebSocket-KeyにBase64エンコードを適用
-
- HTTP 101 Switching Protocolsレスポンスの構築と送信
-
データ転送
WebSocketフレームの処理
- フレーム解析
-
finビットの取り出しと解釈 -
rsv1,rsv2,rsv3の取り出しと検証 -
opcodeの取り出しと処理- 0x0: 継続フレーム
- 0x1: テキストフレーム
- 0x2: バイナリフレーム
- 0x8: 接続終了
- 0x9: Ping
- 0xA: Pong
-
maskフラグの取得と検証 -
payload_lenの取り出しと解析 - 拡張されたペイロード長(
extended payload len)の取り出し -
masking keyの取得とデコード -
payloadデータの取り出し -
finに基づく分割パケット対応
-
- デコード
-
masking keyを使用したペイロードデコード
-
- opcode別処理
- テキストフレーム(0x1)のUTF-8デコードと処理
- バイナリフレーム(0x2)のデータ処理
- Ping(0x9)フレームへのPong応答
- 接続終了(0x8)の処理
- 不正なopcodeに対するエラー応答
フレーム生成
- フレーム構築
-
finフラグ設定 -
opcodeの設定 - ペイロードのマスキング処理(クライアント向けのみ)
- ペイロード長の設定(拡張ペイロード長を含む)
- フレーム全体のバイトストリーム化
-
接続管理
- クライアント接続の確立
- 2クライアント以上の接続の確立
- 接続中のクライアントのリスト管理
- 接続のタイムアウト処理
- 不正なクライアントからの接続拒否
- 接続終了時のクリーンアップ処理
- ハートビート機能(Ping/Pong)による接続維持
セキュリティ
- WebSocket Originヘッダーの検証(許可されたオリジンのみ受け入れる)
- メッセージサイズの上限設定(大規模メッセージ攻撃の防御)
- 不正なフレーム/データに対するエラーハンドリング
- SSL/TLSサポート(wssプロトコル用)
拡張機能とプロトコルアップグレード
- サブプロトコル(Sec-WebSocket-Protocol)の処理
- 拡張(Sec-WebSocket-Extensions)のサポート
- 圧縮データのデコード (例: permessage-deflate)
テストとデバッグ
- 単体テスト
- ハンドシェイクのテスト
- フレーム解析と生成のテスト
- 各opcode処理のテスト
- 負荷テスト(高負荷時の動作確認)
- プロトコルコンフォーマンステスト
- RFC 6455に準拠しているかの確認
- ロギングとデバッグツールの実装
ドキュメント
- コードベースのコメントとドキュメント化
- WebSocketサーバーの設定と使用法についてのユーザーガイド作成
タグ
#RFC6455