たつのおとしごのしっぽ

技術に楽しくしがみつく えんじにあ の備忘録

WebSocketとは?をまとめてみた

WebSocket とは

リアルタイムかつ双方向な通信を実現する通信プロトコル。効率的に通信が可能になります。
プロトコルは、通信時の約束事を指します。
プロトコルで有名なのは、HTTPかと思います。
HTTPは、HTML文書(ホームページ)をやり取りをする約束事です。ファイアウォールを簡単に通ることが出来るので、文書以外の内容もやり取りするようになったため多くで見られています。

WebSocketの通信の仕組み

コネクションの確立には、WebSocket opening ハンドシェイクと呼ばれる手順で行います。
HTTP通信によって、クライアントからサーバーにリクエストを送り、TCPコネクションを確立します。
リクエストとレスポンスがHTTP形式に則っているため見やすくなっています。

コネクションを確立した後は、確立したTCPコネクションでWebSocketプロトコルによって双方向通信を行います。
データの単位は、フレームと呼ばれます。

HTTPと何が違うの?

コネクションの持続

HTTPは、リクエストしてレスポンスした後、通信が一旦切られます。
クライアントからリクエストを投げてサーバーが受けてレスポンスを返したら通信が切れてしまいます。
これだと、リアルタイムな情報が得にくくなってしまいます。

WebSocketは、クライアントからリクエストを投げてサーバーが受けてレスポンスを返した後も通信は切れません。
通信は明示的に切断しない限り切れません。
再度、通信を張り直す必要がない分、リアルタイムな情報を得やすいといえます。


HTTP1.1のKeepAliveという機能を使えば、1回の通信で切断しなくなるようですが、これはタイムアウトによって通信が切断されます。
WebSocketのように、明示的に通信を切断するわけではないみたいです。

通信の方向とコネクションの継続

HTTPの通信は単方向です。
例えば、クライアントからリクエストを投げてサーバーが受けてレスポンスを返したら通信が切れてしまいます。
また、サーバーからクライアントへのプッシュはできません。

WebSocketの通信は両方向です。
ですので、クライアントからリクエストを投げてサーバーが受けてレスポンスを返した後も通信は切れません。
クライアントとサーバーで相互に情報を送信できます。


HTTPでもAjaxやCometで疑似的にサーバーからクライアントへのプッシュをすることで双方向な通信を実現することは可能です。
ただ、あくまでも疑似的に実現しているため、負荷がかかるなどのデメリットがあります。

Ajax
JavaScriptを利用した非同期通信処理の仕組み。
非同期かつ定期的にクライアントからサーバーにリクエストを送り続けることによって、疑似的に双方向な通信を実現します。
非同期での通信になるためクライアントとサーバーの状態が常に同じではない点が問題。

Comet
クライアントからサーバーにリクエストを送り、サーバーの変更が発生した時にレスポンスを返す仕組み。
Ajaxと違ってサーバー変更時までレスポンスを返さないためよりリアルタイム性が上がります。
一方でAjaxに比べてリソース消費が大きい点、クライアントがリクエストを送るときにサーバーの情報に変更があった時に上手く処理できない点が問題。

ヘッダの大きさ

HTTP通信だと、通信のたびにHTTPヘッダが付与されてしまうためヘッダが大きくなります。
そのため、トラフィックやリソース消費が大きくなってしまいます。

WebSocketだと、サーバーと全クライアントは同じデータを共有します。
ヘッダは小さく、トラフィックも小さいです。


因みにHTTPはリクエストヘッダで数百byteになりますが、WebSocketだとPayload(データ本体)を除くと最大14byteとなります。

参考文献

WebSocket ってなに?を解決しながら双方向通信について学ぶ。 | Wild Data Chase -データを巡る冒険-
いまさら聞けないWebSocketとSocket.IOの基礎知識&インストール (1/2):Socket.IOで始めるWebSocket超入門(1) - @IT
双方向通信を実現! WebSocketを使いこなそう (1/2):連載:人気順に説明する初めてのHTML5開発 - @IT
WebSocketについて調べてみた。 - Qiita
WebSocket についてまとめてみる - Qiita
HTTP KeepAliveとリバースプロキシにまつわる話 | TECHSCORE BLOG