Jan 2, 2025

RFC6455 Websocketサーバー開発 (C言語版) 進捗

RFC6455 (The Websocket Protocol) に準拠したWebsocketサーバー (C言語版)の開発進捗

ハンドシェイク

  • 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