前々回の連載記事で、IoT(Internet of Things)向け標準プロトコルの1つである「MQTT」を紹介しました。MQTTはブローカー型のプッシュ型メッセージ配送プロトコルです(詳しくは「MQTTのはなし」を参照)。このMQTTをネットで検索すると、ペアで使われる技術要素として「WebSocket」というキーワードがよく引っかかってきます。今回はこのWebSocketについて紹介します。

出所:PIXTA

HTTP/2とは似て非なるもの

 WebSocketはHTTP上の相乗りプロトコルです。確立済みのHTTP/HTTPS回線上に、任意の長さ・フォーマットで双方向のデータ通信を実現します。IETFで標準化され、RFC 6445としてドキュメント化されています。

 以前の連載記事(HTTPのはなし)で、「TCPの上で動くHTTPの上にTCPのようなものを実装したプロトコル」として「HTTP/2」を紹介しました。つまり、立ち位置的にはWebSocketも非常によく似ています。

 ただしWebSocketはHTTP/2よりも簡易な実装になっています。例えばHTTP/2が1本のHTTPセッション上で複数の仮想回線を扱えるのに対し、WebSocketの仮想回線はHTTPセッションと1対1の関係にあります。同じ問題を同じ方法論で解決するのに違う方向からアプローチをした結果、似て非なる規格が並立してしまった格好です(しかも提唱元はいずれもGoogle!)。もっともこれは、コンピューターの世界では「よくあること」です。

JavaScriptにSocket APIを与えるものではない

 WebSocketはもともと、JavaScriptをはじめとするスクリプト系言語から使うために開発されました。実際JavaScript APIには、WebSocketオブジェクトが用意されています。これに対してopen、send、message、closeといった読み書きの操作をすることで、あたかも素のTCP回線で通信しているようなプログラミングが可能です。

 もっとも前述したように、WebSocketはHTTP/HTTPS上に相乗りして動くプロトコルですから「素のTCPのように見える」というのはあくまでソースコード上の話となります。JavaScriptにSocket APIを与えるものではないことに注意してください。WebSocketをSocketの代わりに使うことで、ポートスキャンやプロキシ偽装などのハッキングに悪用されないようにすることは設計上の一大懸念となっています。これを防ぐために幾つか奇妙とも思える仕様が導入されています注1)

注1)「Sec-WebSocket-Key」や「ペイロードマスク」などですが、詳細は割愛します。

この先は有料会員の登録が必要です。今なら有料会員(月額プラン)は12月末まで無料!

日経 xTECHには有料記事(有料会員向けまたは定期購読者向け)、無料記事(登録会員向け)、フリー記事(誰でも閲覧可能)があります。有料記事でも、登録会員向け配信期間は登録会員への登録が必要な場合があります。有料会員と登録会員に関するFAQはこちら