ネットワークスペシャリスト 2018年 午前2 問15
問題文
WebSocketの説明として、適切なものはどれか。
選択肢
ア:HTTPを拡張したプロトコルであり、通信メッセージはXML形式で記述される。
イ:URIのスキームにhttp又はhttpsを使用し、HTTPやHTTPSと同じポート番号で通信する。
ウ:双方向通信を行う仕組みであり、サーバ側からもクライアントにWebSocketの接続開始を要求できる。
エ:通信はGETメソッドで始まり、クライアントとサーバ間でハンドシェイクをして接続が確立する。(正解)
🔒 解説は解答すると表示されます
WebSocketのハンドシェイク【午前2解説】
正解の理由
選択肢 エ が正しいのは、WebSocket接続は最初にクライアントからのHTTP風のGETリクエスト(Upgradeヘッダを含む)で接続要求を行い、サーバが101 Switching Protocolsで応答してプロトコルを切り替える(ハンドシェイクが完了する)という手順で開始するためです。ハンドシェイク完了後はTCP上で独立したWebSocketプロトコルの双方向通信(フレーム単位の送受信)が行われます。
解法ステップ
- WebSocketの開始手順を思い出す(HTTPのUpgradeによるプロトコル切替)。
- 各選択肢がその手順や仕様と整合するかを確認する。
- 初期メッセージがGETか、ハンドシェイクの存在、URIスキーム、サーバからの接続要求の可否、メッセージ形式など。
- ハンドシェイクを記述している選択肢が正答候補となる(これが エ)。
選択肢別の誤答解説
- ア: 誤り。WebSocketは「HTTPを拡張したプロトコル」的性質を持ちますが、通信メッセージがXML固定ということはありません。WebSocketのペイロードはテキスト(UTF-8)またはバイナリで送れ、内容はJSONや独自バイナリなど任意です。
- イ: 誤り。WebSocketのURIスキームは通常 ws:// または wss:// を用います(wssはTLSで保護)。ただしデフォルトのTCPポートとしてはHTTPと同様に80(ws)や443(wss)がよく使われますが、スキーム自体がhttp/httpsである、という記述は誤りです。
- ウ: 誤り。サーバはクライアントに対して直接「接続開始」を要求して新しいTCP接続を張ることはできません(TCPは接続を開始する側が必要)。サーバは既に確立されたWebSocket接続上でいつでもクライアントへメッセージを送信(プッシュ)できますが、接続自体はクライアントの発起で始まります。
- エ: 正しい。接続確立はクライアント側のGETを含むハンドシェイクで開始し、サーバの101応答でプロトコル切替が行われる点を正しく述べています。
よくある誤解
- 「WebSocketは専用ポートを使う」
→ 誤り。ws/wssの既定ポートはHTTP/HTTPSと同じく80/443が一般的で、専用ポートを必須としません(任意のポートを使うことも可能)。 - 「サーバはクライアントに接続を要求して接続を張れる」
→ 誤り。サーバは接続の待受けを行い、クライアントが接続を開始します。サーバからの“プッシュ”は既存接続上で行われます。 - 「WebSocketメッセージはXMLやJSONに限定される」
→ 誤り。形式は任意で、テキスト/バイナリのどちらでも送受信できます。アプリケーション層でフォーマットを決めます。
補足コラム
以下は典型的なWebSocketハンドシェイクの例です。ハンドシェイクはHTTP互換のヘッダを使って行われます。
# クライアント送信(例)
GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Version: 13
# サーバ応答(成功例)
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
ハンドシェイク成功後は、上記のHTTPは終了し、フレーム形式のWebSocket通信に切り替わります。TLSで保護する場合はwss://を使い、初期TCP/TLS接続の後に同様のUpgradeが行われます。
FAQ
Q: なぜGETメソッドが使われるのですか?
A: ブラウザとサーバ間で既存のHTTPインフラ(プロキシやポート)を利用しつつプロトコル切替を行うため、GETにUpgradeヘッダを添えて要求する仕様になっています。通常のリソース取得とは異なり、UpgradeでWebSocketへの移行を要求します。
A: ブラウザとサーバ間で既存のHTTPインフラ(プロキシやポート)を利用しつつプロトコル切替を行うため、GETにUpgradeヘッダを添えて要求する仕様になっています。通常のリソース取得とは異なり、UpgradeでWebSocketへの移行を要求します。
Q: WebSocketは常にTLSが必要ですか?
A: 必須ではありません。暗号化が必要な場合やブラウザの混在コンテンツ制約がある場合は wss://(TLS)を使います。セキュリティ要件に応じて選択します。
A: 必須ではありません。暗号化が必要な場合やブラウザの混在コンテンツ制約がある場合は wss://(TLS)を使います。セキュリティ要件に応じて選択します。
Q: WebSocketとSSE(Server-Sent Events)の違いは?
A: WebSocketは双方向(フルデュプレックス)でテキスト/バイナリ両対応。SSEはサーバ→クライアントの一方向でテキストのみ(イベントストリーム)です。用途に応じて使い分けます。
A: WebSocketは双方向(フルデュプレックス)でテキスト/バイナリ両対応。SSEはサーバ→クライアントの一方向でテキストのみ(イベントストリーム)です。用途に応じて使い分けます。
関連キーワード: WebSocket、ws、wss、ハンドシェイク、Upgrade、双方向通信、Sec-WebSocket-Accept

\ せっかくなら /
ネットワークスペシャリストを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

