WebSocketの探求

Home PDF

このブログ記事は、ChatGPT-4oの協力を得て整理されました。


紹介

こんにちは、私は李智維です。CodeReviewプラットフォームの創設者兼CTO、そして元LeanCloudエンジニアとして、WebSocketに関して豊富な経験を持っています。特にIM SDKの開発プロセスにおいて深い知識を持っています。

WebSocketの重要性

WebSocketは、単一のTCP接続上で全二重通信チャネルを提供するプロトコルです。これは、インスタントメッセージング、リアルタイムコメント、マルチプレイヤーゲーム、共同編集、リアルタイム株価など、リアルタイムのインタラクションを必要とする現代のアプリケーションで広く使用されています。

WebSocketの現代的な応用

WebSocketは以下の分野で広く利用されています:

WebSocketの進化

ポーリング: クライアントが頻繁にサーバーにリクエストを送り、更新を取得します。 ロングポーリング: サーバーはリクエストを開いたままにし、新しい情報が利用可能になるまで待機します。 HTTP双方向接続: 送信と受信のために複数の接続が必要で、各リクエストにはHTTPヘッダーが含まれます。 単一TCP接続(WebSocket): HTTP双方向接続の制限を克服し、より高いリアルタイム性と低遅延を提供します。

iOSでWebSocketを実装する

人気のiOS WebSocketライブラリ:

SRWebSocketの使用

  1. 初期化と接続:
    SRWebSocket *webSocket = [[SRWebSocket alloc] initWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"ws://echo.websocket.org"]]];
    webSocket.delegate = self;
    [webSocket open];
    
  2. メッセージの送信:
    [webSocket send:@"Hello, World!"];
    
  3. メッセージの受信: SRWebSocketDelegateメソッドを実装して、受信したメッセージやイベントを処理します。

  4. エラー処理とイベント通知: 適切にエラーを処理し、接続問題をユーザーに通知します。

WebSocketプロトコルの詳細な解説

WebSocketはTCP上で動作し、いくつかの機能強化が導入されています:

WebSocketプロトコルの核心

1. ハンドシェイク: WebSocketのハンドシェイクはHTTPのアップグレードメカニズムを使用します:

2. データ転送: WebSocketフレームには、UTF-8テキスト、バイナリデータ、およびクローズ、ping、pongなどの制御フレームを含めることができます。

3. 安全性: ブラウザは自動的にOriginヘッダーを追加しますが、これは他のクライアントによって偽造されることはありません。

WebSocket URI

WebSocketフレームプロトコル

フレーム構造:

マスキングキー: クライアントのフレームをマスクすることで、中間者攻撃を防ぐために使用されます。

クローズハンドシェイク

クローズフレーム:

サンプル

例1:単一フレームのマスクなしテキストメッセージ

0x81 0x05 0x48 0x65 0x6c 0x6c 0x6f

「Hello」を含む

例2:単一フレームのマスク付きテキストメッセージ

0x81 0x85 0x37 0xfa 0x21 0x3d 0x7f 0x9f 0x4d 0x51 0x58

“Hello”を含み、マスクキーが付いています。

例3:分割された非マスクテキストメッセージ

0x01 0x03 0x48 0x65 0x6c
0x80 0x02 0x6c 0x6f

この分割メッセージは、「Hel」と「lo」の2つのフレームで構成されています。

上級トピック

マスキングとアンマスキング:

フラグメンテーション(分片):

制御フレーム:

拡張性

拡張データはメッセージボディのアプリケーションデータの前に配置できます:

送信:

クローズハンドシェイク:

接続のクローズ:

参考資料

謝辞

皆さんのご関心に感謝します。もしさらに質問や議論があれば、GitHubやWeiboで私と交流してください。


Back 2025.01.18 Donate