今回はWebRTCについて解説します。技術自体は昔から存在するので、聞いたことがある方も多いはずです。しかし、積極的に使う機会がないと、なかなか実装する機会は多くないかも知れません。

リモートワークでの動画チャットやライブ配信など、WebRTCのニーズは増えています。今こそ、その基礎を押さえましょう。

はじめに

WebRTCとは?

WebRTCはWeb Real-Time Communicationの略称で、名前の通りWeb上でリアルタイム相互通信を行う技術になります。主にビデオチャット、音声チャット、そしてテキストチャットなどで使われます。

よく知られたところでは、ブラウザによるオンラインミーティングなどで使われています。

WebRTCの基本

WebRTCは相互通信の仕組みです。つまり2台以上の端末が必要です。そのため、基本的には以下のような手順で行われます。

  1. クライアント端末の準備
  2. 通信の準備
  3. 通信経路の決定
  4. 通信開始

この時、通信方式が3つあります。

  1. P2P (Peer to Peer)
    - 端末同士が直接通信します。中央のサーバーは不要ですが、参加する端末が多いと負荷が高くなります。
  2. SFU (Selective Forwarding Unit)
    - 通信はサーバーを介して行われ、サーバーがデータを他の端末に転送します。
  3. MCU (Multi-point Control Unit)
    - SFUと似ていますが、データをサーバーで合成・変換し、最適化されたデータを送信します。

P2P(Peer to Peer)は名前の通り、端末同士が直接接続して通信する仕組みです。中央にサーバーが存在しなくても使えるのが魅力ですが、通信に加わる端末が増えると、それだけ各端末のネットワーク負荷が増大するのがデメリットです。

多数の端末同士が相互通信する場合に使われるのがSFU方式です。

SFUはSelective Forwarding Unitの略で、すべての通信をサーバー経由で行われます。各端末はサーバーとだけ通信すれば良く、送られてきた情報はサーバーが責任を持って他の端末群に送信します。

MCUもSFUと同じくサーバーがデータを集約、配信する方式です。

ただし、SFUと違って、データを合成・変換します。これによってデバイスによって最適なデータを受け取れるようになります。MCUの方が、各端末にとってメリットがある半面、サーバー側の負荷はSFUと比べて大きくなります。

主要なコンポーネント

WebRTCを使ってリアルタイム通信を行うためには、いくつかの重要なコンポーネントが必要です。これらは、通信の開始からデータの送受信までを管理します。

getUserMedia

この機能は、ブラウザがあなたのデバイス(コンピューターやスマートフォン)から特定の情報を取得するのに使われます。

具体的には次のように、Webカメラからの映像やマイクからの音声などがこれに含まれます。これにより、ビデオチャットやオンラインミーティングで自分の映像や音声を他の参加者に送ることができます。

  1. Webカメラの映像
  2. マイクの音声

これらの情報をWebRTCコネクションに流します。

RTCPeerConnection

これは、WebRTCの通信を管理するためのクラス(プログラミングにおける一つの部品)です。このクラスは、通信の開始や終了、接続状態の変化を扱います。

例えば、ビデオチャットを開始するときや終了するときに、このクラスが背後で動作していると考えることができます。

RTCDataChannel

接続が確立されると、RTCDataChannelを通じてデータの送受信が行われます。

一般的にWebRTCは動画や音声の通信に使われることが多いですが、このデータチャンネルを使うと、テキストデータの送受信も可能です。これにより、チャットメッセージやファイル共有など、さまざまな種類のデータをリアルタイムで交換できます。

これらのコンポーネントは、WebRTCを通じたリアルタイム通信を可能にするための基本的な要素となります。

シグナリング

上で説明したWebRTCのコンポーネントに加えて、もう一つ重要な要素があります。

それが「シグナリング」です。シグナリングは、WebRTCにおいて非常に基本的な役割を果たします。

シグナリングの役割と必要性

シグナリングとは、インターネット上で異なる場所にあるデバイス(コンピューターやスマートフォンなど)が、お互いに通信を開始するための初期段階の手順のことを指します。簡単に言うと、デバイス同士が「お互いを見つけて、会話を始める方法」を決めるプロセスです。

シグナリングでは、以下のような情報が交換されます:

・端末のIPアドレスやポート番号
・利用可能なオーディオやビデオのフォーマット
・通信のセキュリティ設定など

この情報交換が終わると、端末間での直接的なリアルタイム通信が可能になります。

例えば、あなたがWebRTCを使ってビデオチャットを始めたいとき、まずは通信を開始するために相手のデバイスを「見つける」必要があります。しかし、相手がインターネット上のどこにいるか分からないと、直接通信することはできません。そこでシグナリングサーバーが活躍します。このサーバーは、お互いのデバイスが初めて接続する際に、「お互いの位置や通信方法」を教える役割を担います。これによって、デバイス同士はお互いの存在を知り、通信を始めることができます。

さらに、シグナリングサーバーは、家庭やオフィスのルーターなどに隠されたデバイスの位置を特定するのにも役立ちます。これは「NAT越え」と呼ばれ、インターネット上でデバイス間がスムーズに通信できるようにするための重要なプロセスです。

NATトラバーサル

NATトラバーサルとは、インターネット上で異なる場所にあるデバイス(例えば、あなたのコンピューターやスマートフォンなど)が、お互いに直接通信するための技術的な方法です。

NATは「Network Address Translation(ネットワークアドレス変換)」の略で、インターネット接続時にルーターやファイアウォールが行う、デバイスのアドレスを変換するプロセスを指します。

普通、あなたのデバイスは家やオフィスのルーターによってインターネットに接続されます。このルーターは、デバイスがインターネット上で識別されるためのアドレスを提供します。しかし、このアドレス変換のプロセスがあるため、外部からあなたのデバイスを直接識別するのが難しくなります。

NATトラバーサルは、この問題を解決するために使われます。つまり、ルーターやファイアウォールの「垣根」を越えて、インターネット上の別のデバイスと直接通信することを可能にするための技術です。これにより、ビデオチャットやオンラインゲームなど、リアルタイム通信が必要なアプリケーションでスムーズな通信が行えるようになります。

STUN (Session Traversal Utilities for NAT)

STUNとは、インターネット上で通信する際に、あなたのデバイス(コンピューターやスマートフォンなど)の実際のインターネットアドレス(IPアドレス)を特定するためのシステムです。普段、あなたのデバイスは家庭やオフィスのルーターの中にあり、このルーターによって割り当てられたローカルIPアドレス(例えば192.168.などで始まるアドレス)を使ってインターネットに接続しています。

しかし、このローカルIPアドレスだけでは、インターネット上の他のデバイスと直接通信することはできません。ここでSTUNが役立ちます。STUNサーバーに接続することで、あなたのデバイスがインターネット上でどのように見えるか、つまり実際のグローバルIPアドレスを知ることができます。これにより、ビデオチャットなどのリアルタイム通信が可能になります。

ただし、STUNを使って他人があなたのローカルIPアドレスを知ることができるリスクもあるため、これを防ぐための技術も開発されています。その一つがmDNSという技術で、これはローカルIPアドレスを一種の一時的なコード(UUID)に変換することで、あなたの実際のローカルIPアドレスが外部に露出するのを防ぐ役割を果たします。

SDP (Session Description Protocol)

SDP(Session Description Protocol)は、インターネット上での直接的な端末間通信(P2P通信)を行う際に、重要な情報を交換するためのルールです。この情報には主に2つの大切な部分があります。

利用できる動画や音声の情報 - これは、ビデオチャットなどで使用する動画や音声の種類や品質に関する情報です。例えば、あるブラウザではMPEG4形式の動画しか使えない場合がある一方で、VP9という別の形式を使えるブラウザもあります。

ネットワーク情報 - これは、通信する端末のインターネット接続やアドレスに関する情報です。

端末間のP2P通信では、各端末がこれらの情報をお互いに合わせる必要があります。たとえば、ある端末から別の端末へ動画を送る場合、その動画の形式が受信する端末でサポートされている必要があります。このため、P2P通信をする端末が増えると、動画や音声の形式を適切に設定するための負荷も増えます。SDPは、このような情報の交換をスムーズに行うために使われるプロトコルです。

ICE (Interactive Connectivity Establishment)

ICE(Interactive Connectivity Establishment)は、インターネット上での通信経路を見つけ出すためのプロトコルです。これは、先に述べたSDP(Session Description Protocol)によって交換された情報を基にして、実際に通信を行うための最良の経路を決定する役割を果たします。

ブラウザや他の通信アプリケーション内部には、このICEプロセスを行う「ICEエージェント」と呼ばれる部分が組み込まれています。ICEエージェントの仕事は、複数の通信経路候補(これを「ICE Candidate」と呼びます)を作成することです。これらの候補は、端末間での通信に使える可能性のあるさまざまな経路を表します。

ICEエージェントは、これらの経路候補を一つずつ試し、うまく通信できる経路を見つけたら、その経路を実際の通信に使用します。このプロセスによって、インターネット上のさまざまな障害物(例えば、ファイアウォールやNATといったネットワーク上の制限)を回避しながら、最も効率的で安定した通信経路が選ばれます。

TURN (Traversal Using Relays around NAT)

TURN(Traversal Using Relays around NAT)は、直接的な端末間通信(P2P通信)が、例えばファイアウォールやその他のネットワークの制限によって難しい場合に使用されるシステムです。このような状況では、TURNサーバーが通信の中継役として機能します。

具体的には、あなたのデバイスと相手のデバイスが直接通信するのではなく、TURNサーバーを経由してデータを送受信します。これにより、ネットワーク上の障害物や制限を迂回して、端末間での通信が可能になります。

ただし、TURNサーバーを使っても通信がうまくいかない場合があります。これは、ネットワークの制限が非常に厳しい場合や、他の技術的な問題が発生している場合などです。このような状況では、残念ながらWebRTCを利用することはできません。TURNサーバーは、P2P通信が直接は不可能な場合の「バックアップ」として機能するものですが、全ての通信の問題を解決できるわけではありません。

トラバーサルの実際のフロー

NATトラバーサルの実際の手順は、インターネット上での通信を円滑にするために以下のようなステップを踏みます。

  1. 端末からSTUNサーバーへのリクエスト送信 - まず、あなたのデバイス(コンピューターやスマートフォンなど)はSTUNサーバーに対して、自分のIPアドレス(インターネット上でのデバイスの住所のようなもの)を知りたいとリクエストを送ります。

  2. STUNサーバーからのIPアドレスの返却 - STUNサーバーはあなたのデバイスのIPアドレスを特定し、その情報をデバイスに返します。

  3. STUNサーバーとのパケットのやり取り - 次に、あなたのデバイスとSTUNサーバーはお互いにパケット(データの小包)を送り合い、NAT(ネットワークアドレス変換)を越えて通信できそうなアドレスを見つけます。

このプロセスを各デバイスが行い、互いにNATトラバーサルが成功すれば、それを基にしてデバイス同士の相互接続が実現されます。これにより、インターネット上でスムーズに通信を行うことができるようになるわけです。

データチャネルの利用

ではこれらの技術を使って、実際にWebRTCを行っている例を紹介します。

ゲーム

WebRTCという技術を使った実際の例として、オンラインゲームの場合を考えてみましょう。

オンラインゲームでは、リアルタイム通信がとても重要です。プレイヤー同士がチャットで会話したり、ゲーム内でのアクション(例えば、キャラクターの動きや戦いの手順など)をリアルタイムで共有することが必要です。これによって、プレイヤーはインターネットを介してお互いに対戦したり、協力してゲームを進めたりすることができます。

このようなゲームでは、通信量が少なければP2P(Peer to Peer、つまり直接的な端末間通信)で十分かもしれません。しかし、多くの場合、ゲームは多くのプレイヤーが同時に参加するため通信量が大きくなりがちです。そのため、SFU(Selective Forwarding Unit)やMCU(Multi-point Control Unit)といった技術を利用して、通信を効率的に行います。これらの技術は、通信を中継して効率を上げたり、データを適切に加工して送信したりする役割を担います。例えば、同じゲーム機やコンピューターを使っている場合、データの形式が同じなので、SFUを使っても問題なく通信ができるというわけです。

チャット

オンラインでのチャットに関しては、異なる種類の通信方法が使われることがあります。

1.動画や音声チャット

この場合、WebRTC(リアルタイムでのウェブ通信を可能にする技術)が使用されます。WebRTCは、ビデオ通話や音声通話などのリアルタイム通信に適しており、例えばZoomやSkypeなどのビデオ会議でよく使われています。

2.テキストのみのチャット

こちらは、WebSocketという技術を使用することが多いです。WebSocketはリアルタイムのテキストメッセージングに適しており、通信の負荷が小さいのが特徴です。例えば、ウェブサイト上の即時チャット機能などに利用されています。

3.動画チャットとテキストチャットの組み合わせ

この場合、WebRTCを使って動画とテキストを同時にやり取りすることが一般的です。これにより、ビデオ通話しながらテキストメッセージも交換できるというわけです。

さらに、WebRTCを使うと、Webカメラからの映像、マイクからの音声、画面共有など、さまざまな種類のデータを別々のチャンネルを通じて同時に送受信することができます。これにより、複雑な通信も効率的に行うことが可能になります。

ライブ配信

オンラインでライブ配信を行う際のプロセスを簡単に説明します。

1.配信開始

配信者は、自分のデバイス(例えばコンピューターやスマートフォン)から、ブラウザを介してライブ配信を開始します。このとき、WebRTC(リアルタイム通信を可能にする技術)を使って、配信する動画や音声のデータをインターネット上のサーバーにストリーミング(リアルタイム送信)します。

2.サーバーからの配信

サーバーは、配信されたデータを受け取り、それをインターネットを通じて視聴者のデバイスに送ります。

3.データの変換と合成

配信された動画や音声は、視聴する側のデバイスの種類や設定に合わせて最適化する必要があります。例えば、動画のフォーマットを変換したり、動画と音声を適切に合わせたりする作業がサーバー側で行われます。これにより、異なる種類のデバイスでもスムーズに視聴できるようになります。

要するに、ライブ配信では配信者からサーバーへのリアルタイムデータ送信と、サーバーから視聴者へのデータの最適化・配信という2つの主要なステップが含まれます。

まとめ

ソーシャルメディアやチャットを使ったコミュニケーションが当たり前になっている現在、WebRTCの需要は増えていくでしょう。その仕組みや通信方式の違いを学ぶことで、優れたユーザー体験が提供できるはずです。

なお、SkywayなどWebRTCサーバーを提供するサービスもあります。規模によってはこういった外部サービスを使うのも選択肢として考えられるでしょう。