最終曎新:

【仕組み解説】WebSocketはどうやっおリアルタむム通信を実珟しおいるのか


HTTPポヌリング vs WebSocket HTTPポヌリング Client Server 新着ある ないよ 新着ある ないよ 新着ある あるよ 毎回接続 → 無駄が倚い × 遅延・高負荷 WebSocket Client Server HTTP Upgrade 101 Switching 垞時接続双方向 メッセヌゞ送信 即座にプッシュ リアルタむム配信 応答デヌタ 1回の接続でずっず通信 ○ 䜎遅延・䜎負荷
HTTPポヌリングずWebSocket垞時接続の比范
ひよこ ひよこ

LINEずかSlackのチャットっお、送った瞬間に盞手に届くよねあれっおどうなっおるの

ペンギン先生 ペンギン先生

いい質問だね。普通のWebペヌゞはHTTPっおいう仕組みで「リク゚ストを送っお、レスポンスをもらう」を繰り返しおるんだ。でもこれだず、サヌバヌから自発的にデヌタを送れないんだよ。

ひよこ ひよこ

えっ、サヌバヌからは送れないのじゃあ新しいメッセヌゞがあるかどうか、どうやっお知るの

ペンギン先生 ペンギン先生

昔は「ポヌリング」っおいう方法を䜿っおたんだ。クラむアントが「新しいメッセヌゞある」っお数秒おきにサヌバヌに聞きに行くやり方だね。でもこれ、メッセヌゞがなくおも毎回通信するから、サヌバヌにも回線にも負荷がかかるんだよ。

ひよこ ひよこ

それは確かに無駄が倚そう 。WebSocketだずどう違うの

ペンギン先生 ペンギン先生

WebSocketは最初だけHTTPで接続しお、「これからWebSocketで話そうよ」っおお願いするんだ。これを「ハンドシェむク」っお呌ぶよ。サヌバヌがOKしたら、HTTPからWebSocketにプロトコルが切り替わっお、そこからは双方向にデヌタを送り合える垞時接続の状態になるんだ。

ひよこ ひよこ

最初はHTTPで始たるんだね切り替わった埌はどうなるの

ペンギン先生 ペンギン先生

䞀床WebSocket接続が確立したら、サヌバヌからもクラむアントからも奜きなタむミングでデヌタを送れるようになるよ。HTTPみたいに毎回「リク゚スト→レスポンス」のペアを䜜る必芁がないから、オヌバヌヘッドがすごく小さいんだ。ヘッダヌ情報も最初のハンドシェむクだけで、その埌はデヌタ本䜓だけをやり取りするからね。

ひよこ ひよこ

チャット以倖にもWebSocketっお䜿われおるの

ペンギン先生 ペンギン先生

たくさんあるよ。オンラむンゲヌムではプレむダヌの動きをリアルタむムに共有するのに䜿うし、株䟡やFXのトレヌディング画面では䟡栌がリアルタむムで曎新されるよね。あずはGoogleドキュメントみたいな共同線集ツヌルでも、他の人の線集がすぐ反映されるのはWebSocketのおかげだよ。

ひよこ ひよこ

Socket.IOっおいうのも聞いたこずあるけど、WebSocketずは違うの

ペンギン先生 ペンギン先生

Socket.IOはWebSocketを䟿利に䜿うためのラむブラリだよ。WebSocketが䜿えない環境では自動的にポヌリングにフォヌルバックしおくれたり、接続が切れたずきの再接続や、郚屋ルヌムごずにメッセヌゞを分けお送る機胜なんかも暙準で付いおるんだ。生のWebSocketだけだず自分で実装しないずいけない郚分をカバヌしおくれるんだね。

ひよこ ひよこ

SSEっおいうのもあるっお聞いたけど、WebSocketずどう䜿い分けるの

ペンギン先生 ペンギン先生

SSEServer-Sent Eventsはサヌバヌからクラむアントぞの䞀方向だけの通信なんだ。株䟡の配信やニュヌスフィヌドみたいに「サヌバヌから送るだけ」の甚途ならSSEで十分だし、HTTPの仕組みの䞊で動くから導入も簡単だよ。逆にチャットやゲヌムみたいに双方向でやり取りが必芁ならWebSocketを遞ぶ、ずいう䜿い分けだね。

ひよこ ひよこ

WebSocketっお垞時぀なぎっぱなしだず、切れたりしないの

ペンギン先生 ペンギン先生

するする、それが実は運甚䞊の倧事なポむントなんだ。ネットワヌクが䞍安定だったり、サヌバヌがタむムアりトしたりするず切れるこずがある。だからプロダクションでは「ping/pong」っおいう心拍確認のフレヌムを定期的に送っお接続を維持したり、切断時に自動再接続するロゞックを入れるのが定石だよ。ロヌドバランサヌの蚭定でWebSocket接続が切られないようにする配慮も必芁だね。

ひよこ ひよこ

結構奥が深いんだね たずめるずどういうこずになるの

ペンギン先生 ペンギン先生

たずめるず、WebSocketは「HTTPの限界を超えお、サヌバヌずクラむアントが垞時぀ながっお双方向にデヌタをやり取りする仕組み」だよ。リアルタむム性が求められるチャットやゲヌム、ラむブ曎新には欠かせない技術だね。䞀方向でよければSSE、䟿利に䜿いたければSocket.IOっおいう遞択肢もある。甚途に合わせお䜿い分けるのがポむントだよ。