「HTTPからWebSocketへ」—— 郵便局の窓口で「手紙のルール」を書き換える魔法の合図
こんにちは!ネットワークの裏側を覗くのが大好きなエンジニアの皆さん。
私たちは普段、ブラウザでWebサイトを見るとき、無意識に「HTTP」というルールに従って通信をしています。でも、チャットアプリのように「リアルタイムでやり取りしたい」という場面では、HTTPの仕組みだけだと少し力不足を感じることがあります。
そこで登場するのが「Upgradeヘッダー」です。今日は、HTTPという「手紙のルール」を、より高速で自由な「WebSocket」というルールに、その場でバトンタッチする魔法のような仕組みを紐解いていきましょう。
—
1. そもそもHTTPは「一問一答」の世界
HTTPの基本は、郵便配達に例えると分かりやすいです。
あなたが手紙(リクエスト)を書き、郵便局(サーバー)がそれを受け取って、返事(レスポンス)を出す。そしてその都度、関係をリセットする。これがHTTPの基本姿勢です。
しかし、リアルタイムな会話には向きません。毎回「やあ!」と挨拶して手紙を出して…を繰り返していたら、会話のテンポが遅くなってしまいますよね。そこで、「一度繋いだら、そのまま開けっ放しにして会話を続けようぜ!」というWebSocketというプロトコルに切り替えたくなるわけです。
2. 「Upgradeヘッダー」という名の交渉術
HTTPから他のプロトコルへ乗り換えるとき、クライアント(ブラウザ)はサーバーに対して、手紙の冒頭に「ねえ、これからはHTTPじゃなくて、もっと別のやり方で話さない?」という「交渉」を書きます。
これが`Upgrade`ヘッダーです。実際のパケットの中身は、こんな感じです。
GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket // 「WebSocketに切り替えたい!」と提案
Connection: Upgrade // 「この接続をアップグレードしてほしい」という意思表示
Sec-WebSocket-Key: dGhlIHNhbX… // 安全のための鍵データ
この手紙を読んだサーバーは、こう考えます。
「なるほど、君はWebSocketで話したいんだね。いいよ、僕もその準備はできているから、これからはそのルールで話そう!」
3. 「101 Switching Protocols」——合意の瞬間
サーバーが「分かった、ルールを変更しよう!」と同意したとき、返されるのが「101 Switching Protocols」というステータスコードです。
これは「HTTPのルールはここまで!ここから先は別のルール(WebSocket)でやり取りしましょう!」という、非常に重要な合意のサインです。
HTTP/1.1 101 Switching Protocols
Upgrade: websocket // 「分かった、WebSocketに切り替えるよ」
Connection: Upgrade // 「接続をアップグレードしたよ」
この「101」が返ってきた瞬間、ネットワークの管轄権がHTTPからWebSocketへバトンタッチされます。それまでHTTPという規約で縛られていたパケットたちは、これ以降、WebSocketというより自由な形式で、郵便局員(サーバー)を通さず、直接パイプラインの中を駆け巡ることになるのです。
—
4. なぜ一度「HTTP」を経由するのか?
初学者の方がよく抱く疑問が、「最初からWebSocketで繋げばいいのでは?」というものです。
これには大きな理由があります。実は、世界中の多くのファイアウォールやプロキシサーバーは、「HTTPのルール(80番ポートや443番ポート)」なら通してもいいよ、と厳しくチェックしているからです。
いきなり見慣れない通信を送ると、「怪しい通信だ!」と遮断されてしまう可能性があります。だからこそ、まずは誰もが知っている「HTTP」という共通言語で挨拶を交わし、信頼を得てから、「じゃあ、より効率的な裏ルート(WebSocket)を使わせてもらうね」と交渉する——この手順が、現代のネットワークでは欠かせない知恵なんです。
—
まとめ:ネットワークの交渉人はスマートに
Upgradeヘッダーを使ったプロトコル切り替えは、単なる技術的な手続きではありません。それは、「共通の言語から始まり、目的に応じて最適な手段へと進化する」という、非常に人間臭くてスマートな交渉のプロセスそのものです。
インフラエンジニアとして現場に立つと、この切り替えのタイミングで「あれ? 101が返ってこないぞ?」といったトラブルに遭遇することもあります。そんな時は、ぜひ今日お話しした「郵便局での交渉」を思い出してください。
- クライアントはちゃんと「Upgrade」と伝えているか?
- サーバーは「101」で応えているか?
- その間のルーターやプロキシが、その交渉を邪魔していないか?
一歩ずつ紐解いていけば、複雑に見えるパケットのやり取りも、まるで会話のように見えてくるはずです。ぜひ、今日の知識を武器に、ネットワークの深淵を楽しんでくださいね!
コメント